我是汇编语言编程的新手,我编写了一个小程序来使用 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/