谁帮忙看看这个汇编程序!
DATA SEGMENT
NUM1 DB 10 DUP(?)
NUM2 DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;;;;;;;输入一个字符,并判断这个字符是否是数字字符
JUDGE_NUMBER PROC near
Begin:
PUSH AX
MOV AH,08H ;;;;无回显地输入一个字符
INT 21H
CMP AL,'0'
jb Begin
CMP AL,'9'
ja Begin
MOV BL,AL;;;;;;;bl用来接收判断之后的字符
;;;;;;;;;;;;;;;;;;;;;;
MOV DL,BL
MOV AH,2H
INT 21H
;;;;;;;;;;;;;;;;;;;;;;
POP AX
RET
JUDGE_NUMBER ENDP
;;;;;;;将字符转换为数字
CHANGE_TO_NUMBER PROC near
PUSH BX
PUSH AX
PUSH DX
MOV AL,'0'
SUB BL,AL
MOV CL,BL ;;;;;将数字字符传给cl
POP dx
POP AX
POP bX
RET
CHANGE_TO_NUMBER ENDP
FIRST:
CALL JUDGE_NUMBER
CALL CHANGE_TO_NUMBER
mov num1,cl
SHOW_ADD_SIGN:
MOV dl,'+'
MOV AH,2H
INT 21H
SECOND:
call JUDGE_NUMBER
CALL CHANGE_TO_NUMBER
MOV NUM2,CL
SHOW_EQUAL_SIGN:
MOV DL,'='
MOV AH,2H
INT 21H
PLUS:MOV AL,NUM1
MOV BL,NUM2
MOV AL,BL
MOV DL,AL
MOV AH,2H
INT 21H
CODE ENDS
END START
运行有问题!
[解决办法]
1. 程序流程上不对,子程不应该嵌入在执行序列中间,否则会直接进入子程而导致执行流程混乱;通常是将它们独立出来放置,比如放在 start: 之前,或者是“结束程序返回DOS” 的调用之后。
2. 程序最后没有“结束程序返回DOS” 的调用,最直接的结果就是即便程序执行流程正确,完成了预定功能后,也不能返回,通常是死机失去响应。
3. 对两输入数进行运算,应该是 add AL, BL 吧而不是现在的 MOV 指令。
4. 输出结果时,应该和输入时有个对应的过程,将数值转换为相应的数字字符,最简单的就是加 '0' 了。
5. 这样简单的输出,就要求计算结果只能是个位数了。