Вам нужно написать двоичную процедуру преобразования в десятичный код, а затем использовать десятичные цифры для создания «цифровых символов» для печати.
Вы должны предположить, что что-то где-то будет печатать символ на ваше устройство вывода по выбору. Вызовите эту подпрограмму «print_character»; предполагает, что он принимает код символа в EAX и сохраняет все регистры .. (Если у вас нет такой подпрограммы, у вас есть дополнительная проблема, которая должна быть основой другого вопроса).
Если у вас есть двоичный код для цифры (например, значение от 0 до 9) в регистре (скажем, EAX), вы можете преобразовать это значение в символ для цифры, добавив код ASCII для символа «нуль», чтобы регистр. Это также просто:
add eax, 0x30 ; convert digit in EAX to corresponding character digit
Затем вы можете вызвать print_character для печати символьного кода.
Чтобы вывести произвольное значение, вам нужно выбрать цифры и распечатать их .
Выбор цифр принципиально требует работы с полномочиями в десять. Проще всего работать с одной мощностью десять, например, самой 10. Представьте, что у нас есть подпрограмма «разделить на 10», которая взяла значение в EAX, и произвела коэффициент в EDX и остальную часть EAX. Я оставляю это как упражнение для вас, чтобы выяснить, как реализовать такую процедуру.
Тогда простая процедура с правильной идеей состоит в том, чтобы произвести одну цифру для всех цифр, которые могут иметь значение. 32-битный регистр хранит значения до 4 миллиардов, поэтому вы можете напечатать 10 цифр. Итак:
mov eax, valuetoprint
mov ecx, 10 ; digit count to produce
loop: call dividebyten
add eax, 0x30
call printcharacter
mov eax, edx
dec ecx
jne loop
Это работает ... но печатает цифры в обратном порядке. К сожалению! Ну, мы можем воспользоваться стеком pushdown для хранения произведенных цифр, а затем вывести их в обратном порядке:
mov eax, valuetoprint
mov ecx, 10 ; digit count to generate
loop1: call dividebyten
add eax, 0x30
push eax
mov eax, edx
dec ecx
jne loop1
mov ecx, 10 ; digit count to print
loop2: pop eax
call printcharacter
dec ecx
jne loop2
Слева в качестве упражнения для читателя: подавляйте ведущие нули. Кроме того, поскольку мы пишем цифры в памяти, вместо того, чтобы записывать их в стек, мы можем записать их в буфер, а затем распечатать содержимое буфера. Также оставлен в качестве упражнения для читателя.