сборка x86, не следуют порядку байтов (или это?) (Linux) - PullRequest
4 голосов
/ 08 февраля 2011

Я новичок в программировании на ассемблере и написал небольшую программу для вывода целого числа с помощью системного вызова 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.

Ответы [ 2 ]

8 голосов
/ 08 февраля 2011

Это просто представление - в байтовой перспективе у вас есть

32 00 31 00 26 00 0a 00

, но когда вы рассматриваете это как 16-битные значения, это

0032 0031 0026 000a

Аналогично, если бы вы рассматривали его как 32-битные значения, это было бы:

00310032 000a0026

Такова странность маленькой последовательности.; -)

4 голосов
/ 08 февраля 2011

gdb помогает вам здесь.

Вы запросили формат h (halfword) на платформе с прямым порядком байтов, поэтому он декодирует память как 16-битные младшие порядковые значения.

Если вместо этого вы используете формат b, вы увидите нечто большее, чем вы ожидали.

...