x86程序集,没有遵循小字节序(或者是吗?)(Linux)

san*_*216 4 linux x86 assembly endianness

我是汇编语言编程的新手,我编写了一个小程序,使用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
Run Code Online (Sandbox Code Playgroud)

我有硬编码216,要打印的数字,我得到正确的输出.然而,我所困惑的是"mov word [chr + ebx],dx"指令.dx在第一次迭代中包含0x0032,因此在地址[chr + ebx]处,此值应存储为32 00(十六进制).但是当我使用gdb检查chr内存时,它显示:

(gdb) x /5hx 0x80490d2
0x80490d2 <chr>:    0x0032  0x0031  0x0036  0x000a
Run Code Online (Sandbox Code Playgroud)

我所期待的是0x3200 0x3100 0x3600 x0a00并认为我必须做进一步的内存操作才能得到正确的结果.我在这个地方出错了吗?有什么东西我似乎无法看到.我真的很感激这里的一点帮助.这是我在stackoverflow上的第一篇文章.

Pau*_*l R 8

它只是一种代表性的东西 - 从字节方面来看,你在内存中拥有的是什么

32 00 31 00 26 00 0a 00
Run Code Online (Sandbox Code Playgroud)

但当你将其视为16位值时

0032 0031 0026 000a
Run Code Online (Sandbox Code Playgroud)

同样,如果您将其视为32位值,它将是:

00310032 000a0026
Run Code Online (Sandbox Code Playgroud)

这就是小字节序的古怪.;-)

  • 是的,从"观察记忆"方面来看,小端看起来很奇怪.它在计算上更有意义.自1983年以来,我一直在为8086编程:它仍然需要一些有意的初始集中来理解所显示的内容. (2认同)