32位小端架构下汇编mov指令及地址数据操作原理问询
解析32位小端架构下
mov $0x100, %eax与mov $0x105, (%eax)的工作机制 嘿,我来帮你把这两条指令的逻辑掰扯明白,尤其是你困惑的第二条指令为什么会写入0x100地址的问题。
第一条指令:mov $0x100, %eax
这是一条立即数到寄存器的移动指令,在x86汇编里:
$符号标记后面的0x100是立即数(就是直接的常量数值)%eax是32位的通用寄存器- 执行这条指令后,eax寄存器会被直接赋值为
0x100(十进制256),整个过程只涉及寄存器,和内存没有交互。
第二条指令:mov $0x105, (%eax)
这是立即数到内存的移动指令,关键就在括号()的作用上:
- 在x86汇编中,括号
()表示内存寻址——它会把括号内寄存器的值当作内存地址,然后对这个地址指向的内存单元进行读写操作。 - 因为第一条指令已经把
0x100存入了eax,所以(%eax)就等价于内存地址0x100。这条指令的作用就是把立即数0x105写入到0x100这个内存地址里——这就是你疑惑的核心:为什么是0x100?因为eax里存的就是这个地址值,括号把寄存器里的数值转换成了内存指针。
32位小端架构的影响
小端架构的核心规则是低字节存储在内存的低地址,高字节存储在内存的高地址,这里分两种情况看:
- 如果你写入的是单字节数值
0x105:因为本身只有一个字节,所以直接存入0x100地址即可,小端模式在这里没有额外的拆分操作。 - 如果你写入的是32位多字节数值(比如
0x12345678):小端模式下会把字节拆分,按“低字节放低地址”的规则存储:0x100地址存储0x78(最低字节)0x101地址存储0x560x102地址存储0x340x103地址存储0x12(最高字节)
总结一下
第一条指令是给eax寄存器“装”了一个地址值0x100,第二条指令则是把eax里的这个值当成内存地址,往该地址对应的内存单元写入0x105——这就是为什么最终写入的是0x100地址,完全是因为eax里存的就是这个数,括号的作用是把寄存器数值转换成内存访问的指针。
内容的提问来源于stack exchange,提问作者Frederico Vicente
相关产品推荐
相关产品推荐

