汇编语言程序设计(合工大版)习题参考答案 下载本文

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=3400h,ip=30h … …

code ends

end main

6.3 以下两个独立程序模块,互相用到对方的变量和标号,你认为哪一个是主模

块?程序有没有错误?应该如何修改?

答:m1.asm是主模块,因为它有call m2,但没有说明外部符号,而m2必须是

过程名,var4,lab2也没有说明外部符号。var1 ,var2没有说明为PUBLIC。应加上:

EXTRN m2:FAR,var4:WORD PUBLIC var1, var2,lab1

并修改data segment为data segment PUBLIC 同理M2.asm应加上:

EXTRN var1:byte,var2:word extrn lab1:FAR PUBLIC t603b, var4

并修改data segment为data 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: …