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

使用Intel语法时GAS中mov指令的异常行为及地址加载方法

GNU汇编(Intel语法)符号寻址问题解析

问题代码

.intel_syntax noprefix

            .data
l:          .long 0

            .text
            .global main
main:   
        mov DWORD PTR l, 0x11111111
        mov eax, DWORD PTR 0
        mov al, l

为什么mov al, l加载的是值而非地址?

在GNU汇编的Intel语法模式下(开启.intel_syntax noprefix),直接引用符号名默认表示该符号对应内存地址中的内容,属于间接寻址。

因为al是8位寄存器,汇编器会自动将mov al, l解析为mov al, BYTE PTR [l],从l指向的内存单元(已存入0x11111111)中取出低8位数据,也就是0x11。

如何将l的地址加载到寄存器中?

有两种常用方式:

  • 使用lea指令(推荐):lea专门用于计算并加载有效地址,不会访问内存,效率更高。注意:地址通常是32位/64位,不能存入8位寄存器al,应使用32位/64位通用寄存器:
    lea eax, l  ; 将l的32位地址加载到eax中
    
  • 使用mov配合OFFSET运算符:显式获取符号的地址值:
    mov eax, OFFSET l  ; 直接把l的地址赋值给eax
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:07:34