Вы должны преобразовать его в строку; если вы говорите о шестнадцатеричных числах, это довольно просто. Любое число можно представить так:
0xa31f = 0xf * 16^0 + 0x1 * 16^1 + 3 * 16^2 + 0xa * 16^3
Итак, когда у вас есть это число, вы должны разделить его, как я показал, затем преобразовать каждый «раздел» в его эквивалент ASCII.
Получение четырех частей легко сделать с помощью некоторой немного магии, в частности, с помощью сдвига вправо, чтобы переместить интересующую нас часть в первые четыре бита, а затем в результат с 0xf, чтобы изолировать его от остальных. Вот что я имею в виду (предположим, мы хотим взять 3):
0xa31f -> shift right by 8 = 0x00a3 -> AND with 0xf = 0x0003
Теперь, когда у нас есть одно число, мы должны преобразовать его в значение ASCII. Если число меньше или равно 9, мы можем просто добавить значение ASCII 0 (0x30), если оно больше 9, мы должны использовать значение ASCII a (0x61).
Вот оно, теперь мы просто должны его кодировать:
mov si, ??? ; si points to the target buffer
mov ax, 0a31fh ; ax contains the number we want to convert
mov bx, ax ; store a copy in bx
xor dx, dx ; dx will contain the result
mov cx, 3 ; cx's our counter
convert_loop:
mov ax, bx ; load the number into ax
and ax, 0fh ; we want the first 4 bits
cmp ax, 9h ; check what we should add
ja greater_than_9
add ax, 30h ; 0x30 ('0')
jmp converted
greater_than_9:
add ax, 61h ; or 0x61 ('a')
converted:
xchg al, ah ; put a null terminator after it
mov [si], ax ; (will be overwritten unless this
inc si ; is the last one)
shr bx, 4 ; get the next part
dec cx ; one less to do
jnz convert_loop
sub di, 4 ; di still points to the target buffer
PS: Я знаю, что это 16-битный код, но я все еще использую старый TASM: P
PPS: это синтаксис Intel, хотя преобразование в синтаксис AT & T не сложно, посмотрите здесь .