- 题目要求
下面给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。要求实验者按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。
- 源码
;FILENAME: EXA131.ASM
;.486
DATA SEGMENT USE16
SUM DB ?,?,
MESG DB '25+9='
DB 0,0
N1 DB 9, F0H
N2 DB 25
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CHANG: PROC
LAST: CMP [BX],10
JC NEXT
SUB [BX],10
INC [BX+7]
JMP LAST
NEXT: ADD [BX+8],SUM
ADD [BX+7],30H
ADD [BX+8],30H
RET
CHANG: ENDP
CODE ENDS
END BEG
- 代码
;FILENAME: EXA131.ASM
;.486
DATA SEGMENT USE16 ; DATA SEGMENT为段定义语句,段名为DATA,USE16单元有效地址为16位,16位寻址方式
SUM DB 2 DUP(?) ;变量名为SUM,定义2个字节变量
MESG DB '25+9=' ;变量名为MESG,定义字节变量
DB 0,0,'$'
N1 DB 9 ;,F0H
N2 DB 25
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA ;段约定语句,
BEG: MOV AX,DATA ;设置DS初值
MOV DS,AX
MOV BX,OFFSET SUM ;bx基址寄存器暂存SUM的相对于数据段DS的偏移地址
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH ;25+9的和存入SUM
CALL CHANG
MOV AH,9 ;DOS功能调用09H号显示字符串
MOV DX,OFFSET MESG ;入口参数DX=字符串首地址,字符串必须以‘$’为结束标志
INT 21H
MOV AH,4CH ;返回DOS使用DOS系统的4CH功能调用
INT 21H
CHANG PROC
LAST: CMP BYTE PTR [BX],10 ;[BX]基址寻址指向SUM,和10立即数的类型属性不确定,需要PTR。即SUM和10比较,若SUM<10,则跳转到NEXT
JC NEXT
SUB BYTE PTR [BX],10 ;SUM>10则SUM=SUM-10
INC BYTE PTR [BX+7] ;BX+7即输出的十位数加1
JMP LAST ;JMP即JUMP无条转移
NEXT: MOV AH,SUM ;不能直接在SUM和[BX+8]之间传值,需要中间一个AH寄存器
ADD [BX+8],AH ; 定位到MESG DB 0,0的位置填入值,+8是后一个0
ADD BYTE PTR [BX+7] ; 30H是0的ASCII
ADD BYTE PTR [BX+8],30H
RET
CHANG ENDP
CODE ENDS
END BEG