如何解引用存储在内存中的指针?(NASM/Linux环境)
内存指针解引用的正确做法(NASM/Linux)
先明确你代码里的两个核心问题:
pointer定义为db 0是8位变量,Linux环境下内存地址是32位(32位架构)或64位(64位架构),8位变量根本存不下完整地址,得改成对应宽度的变量:32位用dd 0,64位用dq 0。mov al, var是错误写法,var代表内存地址,8位寄存器al装不下这个地址,得用32位寄存器eax(32位架构)或64位寄存器rax(64位架构)来存储地址。
解引用的关键规则
x86架构不支持直接对内存中的指针做双重解引用(比如你试的[[pointer]]是NASM不支持的语法),必须先把指针变量里存储的地址加载到寄存器,再通过寄存器完成解引用。
32位汇编示例(编译用nasm -f elf32)
pointer: dd 0 ; 32位变量,用来存地址 var: db 44 ; 目标变量 dereferenced: db 0 ; 存储解引用结果 start: mov eax, var ; 将var的32位地址加载到eax mov [pointer], eax; 把地址存入pointer变量 ; 执行解引用 mov ebx, [pointer]; 取出pointer里存储的地址到ebx mov cl, [ebx] ; 解引用ebx,拿到var的值(44) mov [dereferenced], cl ; 把结果存入dereferenced
64位汇编示例(编译用nasm -f elf64)
pointer: dq 0 ; 64位变量,用来存地址 var: db 44 dereferenced: db 0 start: mov rax, var ; 将var的64位地址加载到rax mov [pointer], rax; 把地址存入pointer变量 ; 执行解引用 mov rbx, [pointer]; 取出pointer里存储的地址到rbx mov dl, [rbx] ; 解引用rbx,拿到var的值(44) mov [dereferenced], dl ; 把结果存入dereferenced
内容的提问来源于stack exchange,提问作者batatinha_espacial
相关产品推荐
相关产品推荐

