将dec转换为十六进制

时间:2014-12-14 15:55:19

标签: assembly x86-16

我试图将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

3 个答案:

答案 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

您的程序没有处理空输入的可能性。它会崩溃!