START:MOV AX,DATA MOV DS,AX MOV DL,0
LEA SI,BLOCK MOV CX,CN LP: MOV AL,[SI] TEST AL,80H JZ NEXT INC DL NEXT: INC SI LOOP LP
MOV COUNT,DL MOV AH,4CH INT 21H CODE ENDS
END START
3.17 从键盘输入一个大写英文字母,将其转换为小写字母并显示出来,要求输入其它字符时,能够有出错提示信息。
【解答】
DATA SEGMENT
MESS DB 'INPUP ERROR!',0AH,0DH,'$' DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H
CMP AL,'A' JB ERR CMP AL,'Z' JA ERR
ADD AL,20H MOV DL,AL MOV AH,02H INT 21H JMP EXIT
ERR: MOV DX,OFFSET MESS MOV AH,09H INT 21H
EXIT: MOV AH,02H INT 21H CODE ENDS
END START
3.18 比较宏指令与子程序,它们有何异同?它们的本质区别是什么?
【解答】宏与子程序两者的相同之处在于都是用来处理在编程过程中多次使用的功能程序的方法,两者均能简化源程序。
两者的区别在于:
(1)宏调用通过宏指令名进行,汇编时,随时调用随时展开,并不简化目标程序;子程序调用是在程序执行期间执行CALL指令,代码只在目标程序中出现一次,所以也简化了目标程序。
(2)宏调用时的参数由汇编程序通过实参转换成形参的方式传递,具有很大的灵活性。宏定义中允许设置若干形式参数代替数值、指令、寄存器、各种字符串等。宏调用时可用程
序所需要的实际参数来替换,使编程人员感觉非常灵活;而子程序的参数传递要麻烦得多。
(3)宏调用在汇编时完成,不需要额外的时间开销;子程序调用和子程序返回都需要时间,还涉及堆栈操作。
故若优先考虑速度,用宏指令;若优先考虑存储空间,用子程序。 3.19 试定义将一位十六进制数转换为ASCII码的宏指令。 【解答】
HEXTOA MACRO
AND AL,0FH CMP AL,9 JNA HEXTOA1 ADD AL,7H
HEXTOA1:ADD AL,30H ENDM
3.20 试定义一个字符串搜索宏指令,要求文本首地址和字符串首地址用形式参数。 【解答】
SCANC MACRO ADDRESS,CHAR1 MOV SI,ADDRESS MOV AL,[SI] MOV DI,CHAR1 REPNZ SCASB ENDM