NASM:十六进制到十进制,不能转换超过0x99

时间:2014-03-23 20:44:55

标签: nasm

我的程序收到一个代表十六进制值的字符串,比如" 324"我想将它转换为十进制的实际值(也就是得到整数804)

到目前为止,我已经通过char读取char,并且对于每一个,我会将其转换为值(将其转换为ALsub 48),然后乘以16,并且只在最后将一次除以16。 问题:如果我输入的十六进制字符串超过" 99"在十六进制中,我的寄存器重置为0,但我需要能够支持更大的值。

我的草图:

initialize ecx register with 0 that will hold our overall decimal integer value
for each step:
    1. mov al, byte [ebx] (ebx holds our string)
    2. sub, al 48
    3. add eax, ecx
    4. multiply eax by 16, then move content of eax to ecx

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你试图将十六进制十进制字符串解析为寄存器中的值。如果您发布实际代码,则会更容易看到问题。

我会做这样的事情:

  ; accepts null terminated string with characters '0'-'9', 'A'-'F'
  ; return value in eax
    xor  eax, eax
.loop:
    mov  cl, byte [ebx]
    test cl, cl
    jz   .end
    cmp  cl, 65
    jl   .numeric
    sub  cl, 7 ; 'A' code is 65, need to subtract 7 more so 'A' = 10
.numeric:
    sub  cl, 48
    shl  eax, 4
    or   al, cl
    inc  ebx
    jmp  .loop
.end:
    ret