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

如何解引用存储在内存中的指针?(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:52:33