Преобразование числа в четырехзначное / ASCII - PullRequest
0 голосов
/ 16 сентября 2018

[Assembly 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 голосов
/ 16 сентября 2018

Ваша ошибка заключается в добавлении числа, которое вы получили, к букве '0':

    add r8b, "0" ; converting to ASCII

Это работает для цифр, так как 0 до 9 смежны в ASCII, но после цифр естьнекоторые символы до начала алфавита.Посмотрите на эту таблицу:

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

Самый простой способ - добавить таблицу подстановки в вашзапрограммируйте ("0123456789AB"), а затем используйте полученный номер для индексации правильного символа.

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