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

标签 linux assembly endianness x86

我是汇编语言编程的新手,我编写了一个小程序来使用 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(十六进制)。但是当我使用 gdb 检查 chr 内存时,它显示:

(gdb) x /5hx 0x80490d2
0x80490d2 <chr>:    0x0032  0x0031  0x0036  0x000a

我期望的是 0x3200 0x3100 0x3600 x0a00 并认为我必须进行进一步的内存操作才能获得正确的结果。 我在这个地方出错了吗?有没有我似乎看不到的东西。我真的很感激这里的一点帮助。这是我关于 stackoverflow 的第一篇文章。

最佳答案

这只是一种表示形式——从字节角度来看,你在内存中拥有的是

32 00 31 00 26 00 0a 00

但是当您将其视为 16 位值时,它是

0032 0031 0026 000a

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

00310032 000a0026

这就是小字节序的怪异之处。 ;-)

关于linux - x86 程序集,没有遵循小字节序(或者是?)(Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4937299/

相关文章:

c - 使用文本文件,它不起作用

gcc - 为什么objdump的汇编编码不同?

Linux NASM OUTSB 段错误

c++ - 读取二进制数据到long int

windows - 最小的 FAT32 分区

linux - [ :== :Unexpected operator, 参数太多,需要二元运算符

linux - 如何 self dlopen一个可执行二进制文件

android - 在 .so 中混合使用 c/c++ 和程序集时避免文本重定位

go - 将uint32的字节附加到 byte slice 吗?

c# - C# Endian 敏感吗?