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

x86汇编:无法将栈中字符串指针移回寄存器的问题排查

问题原因分析与验证方法

你的代码逻辑本身没有错误,之所以出现“栈中找不到指针、rdx获取不到正确数据”的错觉,主要是GDB的显示特性和调试符号的问题:

1. GDB默认十进制显示导致指针地址被误判

你存入栈的是字符串"700"的虚拟内存地址,64位程序中这类地址是较大的十六进制数值,但GDB默认以十进制显示寄存器和内存内容。你看到的大数字其实是正确的指针,只是显示格式让你误以为是无效值。

验证方式:

  • 在GDB中用十六进制格式查看寄存器:print/x $rdx,对比print/x $rdi,两者数值完全一致;
  • 直接查看指针指向的字符串:print (char*)$rdx,会输出"700"。

2. 未标记的临时栈空间不会被GDB识别为变量

你通过sub rsp, 8分配的栈空间是临时存储区域,没有在汇编代码中添加调试符号标记它为变量,因此GDB不会在栈帧的本地变量列表中显示这个存储位置。但数据确实已经存入栈中,你可以直接查看对应内存地址:

  • 执行完mov qword [rsp], rdi后,用x/g $rsp或x/g $rbp-8(此时rsp = rbp - 8)查看,就能看到存在栈里的指针地址。

为什么整数操作看起来正常?

整数的数值通常较小,十进制显示也能直观判断是否正确;而指针地址的十进制形式是大数字,容易被误认为是错误数据,本质上两者的栈操作逻辑完全一致。

快速验证步骤

  1. 在GDB中给mov rdx, qword [rsp]行设置断点;
  2. 运行到断点后,先查看$rdi的十六进制值:print/x $rdi;
  3. 单步执行nexti,再查看$rdx的十六进制值:print/x $rdx,两者应完全相同;
  4. 查看栈上存储的内容:x/g $rbp-8,会看到与$rdi一致的地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:51