汇编语言 帮帮看看哪里错了 作业题 从键盘输入一个十六进制数将其转化为十进制并输出

qdwcool 2014-12-04 07:44:44
这是我编的程序 请大神们看看哪里错了哈 本人比较菜 请多多指教

DATA SEGMENT
DATA ENDS
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AH,1
INT 21H
CMP AL,40H
JL L1
SUB AL,30
PUSH AX
AND AL,0FH
MOV [SI],AL
JMP OUTPUT
POP AX
AND AL,0F0H
MOV DL,16
MUL DL
ADD AL,[SI]
JMP OUTPUT
L1:SUB AL,30
JMP OUTPUT
OUTPUT:MOV DL,AL
MOV AH,02H
INT 21H
CODE ENDS
END START
...全文
2171 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
HYG0817 2014-12-24
  • 打赏
  • 举报
回复
楼主,你好,看了你的题目,我根据题意,把整个程序重写了一遍。供参考! DATA SEGMENT PLEASE DB 'PLEASE INPUT(0-F):',0DH,0AH,24H ;提示信息,意思是请输入0-F之间的十六进制数。 LERROR DB 'INPUT ERROR,PLEASE RESET INPUT:',0DH,0AH,24H;错误提示信息,由于本人英文水平不佳,如有单词错误,各位见笑了! HEX1 DB ? ;这个变量用于存放输入的值(<=9),由于0-9的ASCII值十六进制和十进制是一样的,所以接收输入的数后,可以直接存放在这,用于显示。 HEX2 DB ?,?,0DH,0AH,24H;此变量用于存放接收到的A-F的ASCII,并经转化为十六进制数以后,再转化为两位十进制的值(最终存放的是两位十进制数的ASCII值) CS1 DB 10,1 ;除数,用于A-F之间的十六进制数转化为两位十进制数。 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,9 LEA DX,PLEASE INT 21H ;为了界面友好,首先显示提示信息。 INPUT: MOV AH,1 INT 21H ;楼主,你懂的! CMP AL,'0' ;这一小段用于检测输入的数是否超范围。 JB ERROR ;小于0,转错误提示,并要求重新输入。 MOV AH,AL CMP AL,'9' JBE SAVE1 ;大于零,且小于等于9,直接将ASCII码存放于HEX1变量。 AND AL,0DFH ;将输入的小写转化为大写。相当于SUB AL,20H CMP AL,'A' JB ERROR ;小于A,转错误处理。 MOV AH,AL SUB AH,'A'-10 ;以上两行,假设为A-F,则将ASCII形式转为十六进制数。 CMP AL,'F' JBE SAVE2 ;大于A,小于F,转保存到HEX2变量处理。 ERROR: MOV AH,2 MOV DL,0AH INT 21H MOV DL,0DH INT 21H ;你懂的,这是换行回车。 MOV AH,9 LEA DX,LERROR INT 21H JMP INPUT ;这一小段,显示错误提示信息,并转到开始处,要求重新输入。 SAVE1: MOV HEX1,AH MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H MOV DL,HEX1 INT 21H ;这一小段为显示0-9之间的十进制数的ASCII码,显示完退出程序。 JMP EXIT SAVE2: PUSH AX ;先保存AX的值 MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H MOV CX,2 ;设置循环次数为2次 LEA SI,CS1 ;将除数的首地址送出SI LEA DI,HEX2 ;将要存入的十进制ASCII码的变量的首地址送入DI POP AX ;恢复AX的值 MOV AL,AH ;将十六进制数送入AL,作被除数 ZHW10: XOR AH,AH DIV BYTE PTR[SI] ADD AL,30H MOV [DI],AL INC SI INC DI MOV AL,AH LOOP ZHW10 ;这一小段,用于将十六进制数转化为十进制数并将每一位变为ASCII码后存入变量HEX2 MOV DX,OFFSET HEX2 MOV AH,9 INT 21H ;以ASCII码形式显示A-F转化后的十进制数。 EXIT: MOV AH,4CH INT 21H CODE ENDS END START
zara 2014-12-05
  • 打赏
  • 举报
回复
引用
用AND指令取完十六进制的高位后 想将高位存到存储器里 请问该如何操作
是要将高位转到低位吧,需要用移位操作指令如 shr AL, CL ; CL=4 了。

至于最上面的问题,不大好回答。这样的题目,要看出现的场景,题目的目的具体是想考察哪些点,就需要用相应的方法来实现。
SI 没有设置初值,相应的 DS: 也没有,这么直接使用了,会破坏 psp 的,后果难说。
那两个 sub AL, 30 里的 30 应该是 30h 吧。
输出部分,是以字符格式输出 DL 的,不是以数值,没有内容的转换功能,所以需要加上 30h 的。
输入了 'A' 或以上的字符,只输出了一位吧,应该有两位的。
qdwcool 2014-12-04
  • 打赏
  • 举报
回复
我有个疑问哈 我用AND指令取完十六进制的高位后 想将高位存到存储器里 请问该如何操作

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧