Я новичок в программировании на ассемблере и написал небольшую программу для вывода целого числа с помощью системного вызова sys_write. Вот мой код:
section .data
N: dw 216
chr: dw ,0,0,0,0x0a
section .bss
section .text
global _start
_start:
xor ax, ax
mov ax, word [N]
mov cx, 10
mov ebx,4
shift_while: div cx
add dx, 0x0030
mov word [chr+ebx],dx
sub ebx, 2
xor dx, dx
cmp ax, 0
jne shift_while
call printchar
exit: mov eax, 1
mov ebx, 0
int 80h
printchar: pushad
mov eax, 4
mov ebx, 1
mov ecx, chr
mov edx, 8
int 80h
popad
ret
Я жестко запрограммировал 216, номер для печати, и я получаю правильный вывод. Однако то, что меня удивляет, это инструкция «mov word [chr + ebx], dx». dx содержит 0x0032 в первой итерации, поэтому по адресу [chr + ebx] это значение должно быть сохранено как
32 00 (гекс). Но когда я исследовал память chr с помощью gdb, она показала:
(gdb) x /5hx 0x80490d2
0x80490d2 <chr>: 0x0032 0x0031 0x0036 0x000a
то, что я ожидал, было 0x3200 0x3100 0x3600 x0a00 и я подумал, что мне придется сделать дальнейшие манипуляции с памятью, чтобы получить правильный результат.
Я ошибаюсь где-то с этим. Есть вещи, которые я не могу видеть. Я бы очень признателен за небольшую помощь здесь. Это мой первый первый пост на stackoverflow.