2010-03-11 2 views

ответ

2

Самый простой способ - преобразовать число в шестнадцатеричный. Каждая группа из 4 бит становится шестнадцатеричной цифрой.

; this is pseudocode 
mov di, [addr_of_buffer] ; use the string instructions 
cld      ; always remember to clear the direction flag 

; convert bx 
mov cx, 4 ; 4 hexits per 16 bit register 
hexLoopTop: 
mov al, bl ; load the low 8 bits of bx 
and al, 0x0F ; clear the upper 4 bits of al 
cmp al, 10 
jl decimal 
add al, 65 ; ASCII A character 
jmp doneHexit: 
decimal: 
add al, 48 ; ASCII 0 character 
doneHexit: 
stosb  ; write al to [di] then increment di (since d flag is clear) 
ror bx  ; rotate bits of bx down, happens 4 times so bx is restored 
loop hexLoopTop 

; repeat for si, note that there is no need to reinit di 

Теперь, если вы хотите десятичный вывод, вам понадобится более сложный алгоритм. Очевидный способ сделать это - повторное разделение. Обратите внимание: если у вас есть 32-битный процессор (386 или новее), вы можете использовать 32-битные регистры из 16-разрядного режима, что упростит это.

Переместить si: bx в eax для начала. Чтобы получить следующую цифру, вы выполняете инструкцию cdq для расширения eax в edx: eax, div на 10, а остальная часть в edx - следующая цифра. Фактор в eax равен либо 0, в этом случае вы закончите, либо ввод для следующего раунда цикла. Сначала это даст вам самую важную цифру, поэтому вам нужно будет отменить цифры, когда закончите. Ваш буфер должен быть, по крайней мере, базовым 10 log из 2^32, округленным до 10. Это не так сложно настроить этот алгоритм для работы со знаками целых чисел.

Смежные вопросы