Я новичок в программировании на ассемблере и написал небольшую программу для печати целого числа с помощью системного вызова 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 (hex). Но когда я проверил память chr с помощью gdb, он показал:
(gdb) x /5hx 0x80490d2
0x80490d2 <chr>: 0x0032 0x0031 0x0036 0x000a
то, что я ожидал, было 0x3200 0x3100 0x3600 x0a00, и думал, что мне придется выполнить дальнейшие манипуляции с памятью, чтобы получить правильный результат. Я ошибаюсь где-то с этим. Есть вещи, которых я не вижу. Я был бы очень признателен за небольшую помощь здесь. Это мой первый первый пост на stackoverflow.