AT&T 语法
我有以下代码:
x: .word 1
y: .word 0
z: .word 2
mov x, %eax # eax = 0x1
x是如何移入%eax的?
我知道如果没有后缀,mov默认移动4个字节。
另外,x,y,z我知道它们在内存中彼此相邻存储,所以我希望它会是这样的:
x y z
| | |
00 01 | 00 00 | 00 02
mov 将占用前 4 个字节:
00 01 00 00
。所以,我期望 eax 的前 4 个字节以相反的顺序排列,因为 x86 使用小端编码 -> eax=0x00 00 01 00 这不是 0x1。
我做错了什么?
另外,x,y,z我知道它们在内存中彼此相邻存储,所以我希望它会是这样的:
x y z | | | 00 01 | 00 00 | 00 02
这些字节的顺序错误!
作为小端字节序,汇编器存储的值如下:
x y z
| | |
01 00 | 00 00 | 02 00
在 X 处取一个完整的双字,因此会发现 01 00 00 00 等于 00000001h。
按照这个顺序,mov将从右到左取前4个字节?喜欢dcba吗? 01 (一) 00 (二) | 00 (c) 00 (d)
如果你喜欢这样想。执行双字大小的
mov
,CPU 获取 4 字节的内存块,并且 CPU 只知道第一个字节需要进入 %EAX 的最低字节,并朝着接收第四个字节的最高字节努力。