题目:下面给出的是一个通过比较法完成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

版权声明:本文为博主原创文章,未经博主允许不得转载。