一个汇编程序的问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 19:02:57
自己写的一个转换程序,从键盘输入一个字符,如果是数字直接输出,若是字母则将其ASCII码用十六进制输出,编译能通过,就是得不到正确的结果,看了好几遍都不知道问题出在哪里,望高手解惑。。。本人初学汇编,语句结构多有拖沓冗长,见谅。。。
.386
DATAS SEGMENT USE16
MESG1 DB 'Input:$'
MESG2 DB 'Input Error!$'
MESG3 DB 'Input is a number,output:$'
MESG4 DB 'Input is a char,output:$'
DATAS ENDS

STACKS SEGMENT USE16
DB 200 DUP(0)
STACKS ENDS

CODES SEGMENT USE16
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,30H
JB ERROR
CMP AL,39H
JBE LINE1
CMP AL,41H
JB ERROR
CMP AL,5AH
JBE LINE2
CMP AL,61H
JB ERROR
CMP AL,7AH
JBE LINE2
ERROR:
CALL ENT
LEA DX,MESG2
MOV AH,9
INT 21H
JMP EXIT
LINE1:
CALL ENT
LEA DX,MESG3
MOV AH,9
INT 21H
CAL

1、dos功能调用的2、9号功能执行后,都要返回一个值给AL,这样,等到要显示数字或字母的ASCII码的时候,AL的值已经不是那个正确的值了。所以,应该先把AL保护起来。

2、这个程序不可能通过编译。只是OUTPUT_CHAR子程序中的
SHR BL,4
这一条指令,就会出错。超过1位的移位指令,移位次数要放在CL寄存器里。