7.19 写出子程序。查十进制数的ASCII码表,对AL中的BCD码显示出十进制数。 7.20 编写将X单元中的二进制数显示为十六进制数的子程序。 7.21 编写将BX中的二进制数用十进制数显示出来的子程序。 7.22 编写将BX中的二进制数用二进制数显示出来的子程序。
7.23 写出对内存单元X中的补码求真值子程序,补码保存在BX中。 7.24 写出两数相加运算的子程序。 7.25 写出两数相减运算的子程序。 7.26 写出两数相乘运算的子程序。 7.27 写出两数相除运算的子程序。
7.28 写出对AX中的二进制数按位相加子程序。 7.29 编写求数组中最大数的子程序。
7.30 编制一个计算数组中所有负数之和的子程序。并利用此子程序分别计算A数组和B数组中的负数之和,结果分别放在SUM1和SUM2单元中。
第七章参考答案
习题七答案:
7.12 功能:两个字节数相加。X和BL相加保存到Y。
7.13 功能:键盘输入的字符保存到KEY单元中,直到按回车为止。
7.14 功能:将X单元中的十六进制3AH变为十进制入栈保存,AH中为余数。先将0008H入栈,再将0005H入栈,结果为58。
7.16 写出子程序,从键盘输入一个多位十进制数,并分别保存到BUFFER开始的单元中。 KEY_IN PROC PUSH AX PUSH BX MOV BX,0
LET1:MOV AH,1
INT 21H CMP AL,0DH ;输入回车退出 JZ EXIT MOV BUFFER[BX],AL ;保存到BUFFER INC BX JMP LET1 EXIT:POP BX POP AX
RET
KEY_IN ENDP
7.17 从键盘输入多位数字,转换成十进制数并保存到X单元中。 KEY_IN_DEC PROC PUSH AX PUSH BX MOV X,0 MOV BX,0 MOV SI,0
LET1:MOV AH,1
INT 21H CMP AL,0DH ;输入回车退出
31
JZ EXIT MOV BUFFER[SI],AL ;保存到BUFFER INC SI JMP LET1 EXIT:MOV CX,SI ;位数放在CX MOV SI,0
LET2:MOV AL, BUFFER[SI] SUB AL,30H MOV AH, 0 XCHG AX,X ;形成十进制数 MOV BX,10 MUL BX XCHG AX,X ADD X,AX ;保存 INC SI
LOOP LET2
POP BX
POP AX
RET
KEY_IN _DEC ENDP
7.23 写出对内存单元X中的补码求真值子程序,补码保存在AX中。 calcu proc push ax push bx
push si mov ax,0 mov al,x and al,al jns zz neg al
mov fuhao,'-' zz:
mov si,0
mov bx,10 ;将ax变为十进制数真值 let1: mov dx,0 inc si ;统计余数个数 idiv bx
mov y[si], dx ;在y单元保存余数 cmp ax,0 jnz let1
pop si pop bx pop ax ret calcu endp
32
7.30 编制一个计算数组中所有负数之和的子程序。并利用此子程序分别计算A数组和B数组中的负数之和,结果分别放在SUM1和SUM2单元中。 DATA SEGMENT A DB 9,-8,-7,6,5 B DB -8,7,6,-5,4 SUM1 DB ?
SUM2 DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,OFFSET A CALL LADD MOV SUM1,BL MOV SI,OFFSET B CALL LADD MOV SUM2,BL MOV AH,4CH INT 21H
LADD PROC NEAR PUSH CX PUSH AX PUSH SI XOR BL,BL NEXT: MOV AL, [SI] AND AL,AL JNS JJJ ADD BL,AL JJJ: INC SI LOOP NEXT POP SI
POP AX
POP CX RET LADD ENDP CODE ENDS END START
测验七
单选题:
1. 如果子程序的属性为FAR,下列说法错误的是 。
A.可以段内直接调用 B.可以段间间接调用 C.可以段间直接调用 D.只能段间调用 2.在子程序调用过程中,断点指的是 。
33
A.CALL指令本身 B.CALL的下一条指令 C.CALL的下一条指令的地址 D.子程序名 3.执行CALL SUBR1指令后,完成的操作是 。
A.将SUBR1的偏移地址入栈保存 B.将断点的偏移地址入栈保存 C.将断点的偏移地址→IP
D.将SUBR1的段地址→CS,偏移地址→IP 4.子程序的属性是用__________定义的。
A.CALL指令 B.PROC过程定义伪指令 C.FAR PTR D.RET指令
5.执行段间返回RET指令时,从堆栈中________。
A.先弹出断点的偏移地址,再弹出段地址 B.先弹出断点的段地址,再弹出偏移地址 C.弹出断点的偏移地址 D.弹出断点的段地址
6.子程序结构中,保存现场指的是________。
A.保存CALL指令 B.保存断点的地址
C.保存主程序用到的寄存器 D.保存子程序用到的寄存器 7.CALL指令和RET指令的用法,正确的说法是________。
A.CALL指令和RET指令都对堆栈操作 B.只有CALL指令使用堆栈 C.只有RET指令使用堆栈
D.CALL指令和RET指令都不用堆栈 8.CALL指令和JMP指令的区别是________。
A.CALL指令使程序转移 B.子程序名可以是标号
C.CALL指令将断点地址保存 D.CALL指令可以段间调用
9.CALL指令和RET指令对堆栈操作,正确的说法为__________。
A.CALL指令从堆栈中取出子程序的地址 B.RET指令从堆栈中取出子程序的地址 C.CALL指令从堆栈中取出断点的地址 D.RET指令从堆栈中取出断点的地址
10.执行CALL FAR PTR SUBR2时,正确的说法是 。
A.先将断点的段地址入栈,再将偏移地址入栈 B.先将断点的偏移地址入栈,再将段地址入栈
C.先将SUBR2的段地址入栈,再将偏移地址入栈 D.先将SUBR2的偏移地址入栈,再将段地址入栈
11.用CALL指令调用子程序时,从子程序返回到主程序________。
A.用JMP指令 B.用INT 21H指令 C.只能用RET指令
D.既可以用RET又可以用JMP
12.在用CALL指令实现子程序嵌套调用时,子程序的RET指令 ________。A.返回到最初始的调用程序中 B.返回到上一级调用程序中 C.可以换为JMP指令返回
34
D.可以不用
13.子程序参数传递时,用存储单元传参方法,________。
A.只能主程序访问传参单元 B.只能子程序访问传参单元
C.主程序和子程序都能访问传参单元
D.主程序读传参单元,子程序写传参单元
14.用寄存器传参,在子程序作现场保护时,________。
A.传参寄存器必须保存 B.传参寄存器不必保存 C.传参寄存器可以改写 D.根据情况确定保存与否
15.如果在子程序中进行了现场保护,那么子程序中________。
A.恢复现场在RET指令之前 B.恢复现场在RET指令之后 C.直接用RET指令返回 D.直接用JMP指令返回
测验七答案:
1~5 DCBBA 6~10 CACDA 11~15 CBCDA
第八章 高级汇编技术
习题八
8.1 宏的作用是什么?宏是一种程序结构吗? 8.2 分别解释宏定义、宏调用、宏展开。 8.3 宏与子程序的区别是什么?
8.4 宏指令是什么?它能被翻译成机器代码吗?
8.5 写出宏调用的过程和子程序调用的过程,并对二者做一对比。 8.6 宏是怎样实现传参的?请与子程序传参进行对比。 8.7 请举例说明宏的变元是操作数和变元是操作码的用法。 8.8 利用宏可以定义多个存储单元吗?如何定义? 8.9 在宏定义中可以使用标号吗?是否需要说明? 8.10 在宏定义中能否出现分支程序段? 8.11 如何建立宏库?怎样打开宏库? 8.12 结构伪操作的作用是什么?
8.13 请举例说明结构预置和结构引用的用法。
8.14 写出重复汇编和条件汇编的主要作用。它们可以生成机器代码吗?8.15 编写多模块程序时,需要加入哪些参数设置? 8.16 分析下列宏定义,指出它的作用。 EXM1 MACRO X1 MOV AH,X1 INT 21H ENDM
8.17 解释下列宏的功能。 EXM2 MACRO A,B,C MOV AX,A
35