Вывести номер двойного слова в строку - PullRequest
0 голосов
/ 11 марта 2010

у меня есть двойной номер слова в си: bx. Как я могу записать его в массив в виде строки?

1 Ответ

2 голосов
/ 14 марта 2010

Самый простой способ - преобразовать число в гекс. Каждая группа из 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. Это не слишком сложно настроить этот алгоритм для работы со знаковыми целыми числами.

...