当前位置: 代码迷 >> 汇编语言 >> 哪位高手帮忙看看这个汇编程序
  详细解决方案

哪位高手帮忙看看这个汇编程序

热度:158   发布时间:2016-05-02 04:52:42.0
谁帮忙看看这个汇编程序!
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. 这样简单的输出,就要求计算结果只能是个位数了。