使用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
相关产品推荐
相关产品推荐

