首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-06-19 
谁帮忙看看这个汇编程序!DATA SEGMENTNUM1 DB 10 DUP(?)NUM2 DB 10 DUP(?)DATA ENDSCODE SEGMENTASSUME CS

谁帮忙看看这个汇编程序!
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. 这样简单的输出,就要求计算结果只能是个位数了。

热点排行