将数字转换为十四进制/ ASCII

时间:2018-09-16 07:30:44

标签: assembly x86-64

[大会x86-64]

具体来说,我试图将137,799转换为四进制,然后转换为ASCII值,应该是“ 3830B”,但我得到的是“ 3830;”,所以由于某种原因,我的最后一位数字是错误的。这是我的代码:

; Part 1 - Successive division

mov eax, dword [iNum1] ; get the integer 137,799
mov rcx, 0 ; digitCount = 0
mov ebp, 14 ; set for dividing by 14

divideLoop:
            mov edx, 0
            div ebp ; divide by 14

            push rdx ; push remainder
            inc rcx

            cmp eax, 0 
            jne divideLoop
; -----
; Part 2 - Convert remainders and store

mov rbx, num1String ; get addr of string
mov rsi, 0 ; index = 0 

popLoop:
        pop r8
        add r8b, "0" ; converting to ASCII

        mov byte [rbx+rsi], r8b
        inc rsi
        loop popLoop    

mov byte [rbx+rsi], NULL

我看不到我在做什么错。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的错误是将您得到的数字添加到字母“ 0”:

    add r8b, "0" ; converting to ASCII

这适用于数字,因为09在ASCII中是连续的,但是在数字之后,在字母开始之前有一些符号。看看这张桌子:

https://www.torsten-horn.de/techdocs/ascii.htm

最简单的方法是在程序中添加一个查找表(“ 0123456789AB”),然后使用获得的数字来索引正确的字符。

table: .string "0123456789AB"
// ...
mov r8b, [table+r8b]