5.13 字数组ARRAY,第一个单元为元素个数N,后面为N个元素,编写程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)
;delete  the 0  from array
data  segment
      array  dw  6,3,4,0,15,0,7
      loca  dw  999        ;此单元地址为结束标记
data  ends
code  segment
      assume cs:code,ds:data
start:
        mov  ax, data
        mov  ds, ax
        mov  cx, array
        lea  bx, array+1
next:  cmp  word ptr[bx],0
        jz    move
        add  bx,2
        dec  cx
        cmp  cx,0
        jnz  next
        jmp  exit
move:  dec  array
        mov  di,bx
mnext:
        cmp  di,offset loca
        ja    next
        mov  ax, [di+2]
        mov  [di],ax
        add  di,2
        cmp  di,offset loca
        jnb  next
        jmp  mnext
exit:  mov  ah,4ch
        int  21h
code  ends
end  start
5.14 下表为奥运会获金牌前十名国家的成绩统计表,请编写程序,统计并填写表中的合计栏数据。
先逐行求小计,再按列求合计。
data  segment
      array  db  1,0,1,?    ;设简单数据
            db  1,1,0,?
            db  1,1,0,?
            db  1,1,1,?
            db  1,1,1,?
            db  1,1,1,?
            db  1,1,1,?
            db  1,1,1,?
            db  1,1,1,?
            db  1,1,1,?
      org 30h
      sumvd  db  ?,?,?,?    ;存放按列求的合计数
      org 40h
      loca  dw  ?          ;存放array的第一行地址
data  ends
code  segment
      assume cs:code,ds:data
start:
        mov  ax, data
        mov  ds, ax
        mov  ax, 0
        mov  cx, 10
        lea  bx, array
sumh:  mov  di, 3
sum3:  add  al, [bx]
        inc  bx
        dec  di
        jnz  sum3
        mov  [bx],al      ; 存放行的小计
        mov  ax,0
        inc  bx
        loop  sumh
下面按列求合计     
        lea  bx, array
        mov  loca,bx
        lea  si, sumvd
        mov  cx,10
        mov  di,4
sumv3: 
        mov  ax,0
        mov  bx,loca
sumv:  add  al, [bx]
        add  bx,4
        loop  sumv
        mov  [si],al
        mov  cx,10
        inc  si
        inc  loca
        dec  di
        jnz  sumv3
exit:  mov  ah,4ch
        int  21h
code  ends
end  start
6.1 过程定义如下,补充括号中的指令。
code  segment
        assume    cs:code
main  proc  far
(  PUSH  DS        )
(  XOR  AX,AX      )
(  PUSH  AX        )
ret
main    endp
code    ends
end  main
6.2 补充下列程序括号中的指令,使得程序对堆栈的操作全部利用程序中定义的TOS堆栈,并画出程序执行后堆栈TOS中的数据。
data  segment
      dw    100 dup(?)
  tos  label  word
data  ends
code  segment
        assume    cs:code,ss:data
main  proc  far
(  MOV  AX,DATA        )
(  MOV  SS,AX          )
(  LEA  SP,TOS        )
push  ds
xor  ax ax
push  ax
call  far ptr suba
;假定此处指令的地址为cs=3400hip=30h
code  ends
end  main
6.3 以下两个独立程序模块,互相用到对方的变量和标号,你认为哪一个是主模块?程序有没有错误?应该如何修改?
答:m1.asm主模块,因为它有call  m2,但没有说明外部符号,而m2必须是过程名,var4lab2也没有说明外部符号。var1 var2没有说明为PUBLIC。应加上:
EXTRN  m2:FAR,var4:WORD
PUBLIC var1, var2,lab1
并修改data    segmentdata    segment PUBLIC
同理M2.asm应加上:
EXTRN  var1:byte,var2:word
extrn lab1:FAR
PUBLIC t603b, var4
并修改data    segmentdata    segment PUBLIC
以上完成主要修改,但程序依然有错,请仔细检查操作数类型是否匹配。
m1.asm  如下:
data        segment
        var1  db  ?
        var2  dw  ?
        var3  dw  ?
data        ends
code1        segment
                assume  cs:code1,ds:data
main        proc  far
start:    
                mov  ax, data
                mov  ds, ax
              call  m2
lab1:        mov  ax, var4
           
jmp  lab2              ;去掉此指令
main        endp
code1        ends
                end  start
m2.asm  如下:
data        segment
            var4  dw 
            var5  dw 
data        ends
code2        segment
                assume cs:code2,ds:data
m2        proc  far
             
add    dxvar1        var1为字节类型
add    dxvar2
jmp        lab1
M2        endp
code2    ends
end
6.4 主程序从键盘输入N位二进制数到缓冲区,用子程序将其转换为二进制数串显示。主程序和子程序共用数据缓冲区。
data  segment
      buff  db  9,?,9 dup (?)
data  ends
code  segment
      assume cs:code,ds:data
main    proc  far
start:
        mov  ax, data
        mov  ds, ax
        lea  dx, buff
        mov  ah, 10
        int  21h
        call  outp汇编语言结束指令
exit:  mov  ah,4ch
        int  21h
main    endp
outp    proc  near
        mov  ah,2
        mov  dl,10
        int  21h
        mov  cl, buff+1
        mov  ch,0
        lea  bx, buff+2
out1:  mov  dl, [bx]
        mov  ah, 2
        int  21h
        inc  bx
        loop  out1
        ret
outp    endp
code  ends
end  start
6.5 主程序从键盘输入一个字符串到BUFF,再输入一个字符到AL,用子程序在字符串BUFF中查是否存在该字符,如果到,显示发现的字符位置。用寄存器传递要查的字符。
;search 
data  segment
mess1  db    13,10, 'input  string:$'
mess2  db    13,10, 'input a char:$'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。