题目:下面给出的是一个通过比较法完成8位二进制数转换成十进制数,送屏幕显示功能的汇编语言源程序,但有很多语法错误。要求实验者按照原样对源程序进行编辑,汇编后,根据MASM给出的错误信息,对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示25+9=34。
程序清单:
;FILENAME EXA131.ASM
.486
DATA SEGMENT USE16
SUM DB ?,?,
MESG DB '25+9='
DB 0,0
N1 DB 9,F0H
N2 DW 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 MEST
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
SUM DB ?,? ;去掉一个',',两个空值
MESG DB '25+9='
DB 0,0,'$' ;加个$,作为整个字符串输出
N1 DB 9 ;F0H有问题
N2 DB 25 ;DW改成DB
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM ;取SUM的偏移地址
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH
CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG ;打错了
INT 21H
;CALL CHANG ;放到字符串输出下面
MOV AH,4CH
INT 21H
CHANG PROC ;没冒号
LAST:
CMP BYTE PTR [BX],10 ;长度不匹配
JC NEXT ;小于10就跳转到NEXT
SUB BYTE PTR [BX],10
INC BYTE PTR [BX+7] ;计算十位上的数字
JMP LAST
NEXT:
MOV AH,SUM
ADD [BX+8],AH
;ADD [BX+8],SUM ;非法存储器引用,源操作数和目的操作数不能同时为存储器
ADD BYTE PTR [BX+7],30H ;长度不匹配
ADD BYTE PTR [BX+8],30H ;放个位上的数
RET
CHANG ENDP ;没冒号
CODE ENDS
END BEG
方法二:
老师说不用BX+7,要怎么改,于是我又改了一下,有了新的程序。
;FILENAME EXA131.ASM
.486
DATA SEGMENT USE16
SUM DB ?,? ;去掉一个',',两个空值
MESG DB '25+9=$'
;DB 0,0,'$' ;加个$,作为整个字符串输出
N1 DB 9 ;F0H有问题
N2 DB 25 ;DW改成DB
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
;MOV BX,OFFSET SUM ;取SUM的偏移地址
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV SUM,AH
MOV BX,0
;CALL CHANG
MOV AH,9
MOV DX,OFFSET MESG ;打错了
INT 21H
CALL CHANG ;放到字符串输出下面
MOV AH,4CH
INT 21H
CHANG PROC ;没冒号
LAST:
CMP BYTE PTR SUM,10 ;长度不匹配
JC NEXT ;小于10就跳转到NEXT
SUB BYTE PTR SUM,10
INC BYTE PTR BH ;计算十位上的数字
JMP LAST
NEXT:
MOV BL,SUM
;ADD [BX+8],SUM ;非法存储器引用,源操作数和目的操作数不能同时为存储器
ADD BYTE PTR BH,30H ;长度不匹配
MOV AH,02H
MOV DL,BH
INT 21H
ADD BYTE PTR BL,30H ;放个位上的数
MOV AH,02H
MOV DL,BL
INT 21H
RET
CHANG ENDP ;没冒号
CODE ENDS
END BEG
版权声明:本文为博主原创文章,未经博主允许不得转载。