我试图将dec转换为十六进制。最大数量是65535,当我想转换5位数字时,一切都很好但是当我写例如3位数然后按回车它不起作用。怎么了?我相信它必须对那个输入做一些事情,但我不知道到底是什么。
input: mov ah,01h
int 21h
call chck
mov ah,00h
push numbers
mov numbers,ax
inc digit
CMP digit,5
JZ petl
loop input
petl: mov ax,numbers
pop numbers
sub al,30h
cmp digit2,0
jz cont
mov cx,digit2
multip: mul 000ah
loop multip
cont: add bx,ax
jb error
mov dx,digit
inc digit2
cmp digit2,dx
jz conv
jmp petl
chck: cmp al,13
jz petl
cmp al,30h
jb error
cmp al,39h
jg error
ret
答案 0 :(得分:0)
你正在做一个与PUSH不匹配的POP!你不需要这个POP。
czek: pop numbers
修改强> 你需要交换这些说明! NUMBERS第一次包含垃圾。
push numbers
mov numbers,ax
在PETL标签处:您还需要交换这些说明。
petl: mov ax,numbers
pop numbers
答案 1 :(得分:0)
好的,我做到了。在第一个POP之后,它没有采用下一个数字,而是采用十六进制数ED。我做了额外的流行音乐,现在它工作得很好。 但是这个ED是什么?无论我输入什么号码,都在那里。
例如,如果我输入451.我输入4将其推入堆栈,输入5然后输入1.现在当我获得此EB时,第二个POP为5和第3个。
答案 2 :(得分:0)
这不是有效的X86指令。也许你的意思是imul ax,10
。
mul 000ah
您是否已预先清除变量DIGIT并注册BX?
您事先设置了CX = 5吗?此外,你能看到这段代码的冗余吗?
CMP digit,5
JZ petl
loop input
此代码不会消除128-255范围内的值!您将未签名的jb
与已签名的jg
混合。
cmp al,30h
jb error
cmp al,39h
jg error
您的程序没有处理空输入的可能性。它会崩溃!