我的程序收到一个代表十六进制值的字符串,比如" 324"我想将它转换为十进制的实际值(也就是得到整数804)
到目前为止,我已经通过char读取char,并且对于每一个,我会将其转换为值(将其转换为AL
和sub 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
还有其他办法吗?
答案 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