You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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地址存储0x56
    • 0x102地址存储0x34
    • 0x103地址存储0x12(最高字节)

总结一下

第一条指令是给eax寄存器“装”了一个地址值0x100,第二条指令则是把eax里的这个值当成内存地址,往该地址对应的内存单元写入0x105——这就是为什么最终写入的是0x100地址,完全是因为eax里存的就是这个数,括号的作用是把寄存器数值转换成内存访问的指针。

内容的提问来源于stack exchange,提问作者Frederico Vicente

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:51:06