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

x86_64架构栈内存push操作及rbp指向疑问求助

栈地址、小端序与汇编内存修改问题解析

关于rbp指向的字节位置

  • x86_64架构采用小端字节序,同时栈向低地址方向增长,这两个特性是核心原因:
    1. 执行mov rax, "romulomo"时,字符串romulomo的8个字节(r o m u l o m o)会被打包成64位值,但小端序下,寄存器的最低字节(rax的第0字节)对应字符串的最后一个字符o,最高字节(rax的第7字节)对应第一个字符r。
    2. push rax操作会先将rsp减8(适配64位栈元素),再把rax的内容写入栈中。此时rsp指向栈中这个64位值的最低地址字节——也就是字符串的最后一个o(对应书写顺序的第7个字节,或rax寄存器的第0个字节)。
    3. mov rbp, rsp执行后,rbp的指向和rsp完全一致,即压入数据序列中书写顺序的第7字节(最后一个o)。

为什么修改[rbp-1]无效果,[rbp+1]有效

  • 你调用write系统调用时,lea rsi, [rbp]指定了起始地址,rdx=8表示从该地址开始向高地址方向读取8个字节(内存地址递增),也就是读取范围是[rbp, rbp+7]。
  • mov BYTE [rbp-1], "#"是向rbp的低地址写入,这个位置不在上述8字节的打印范围内,所以修改不会体现在输出中。
  • mov BYTE [rbp+1], "#"是向rbp的高地址写入,这个位置属于打印范围的第二个字节(对应字符串里的倒数第二个m),因此修改会被正常输出。

实现预期效果的修正

如果你想把字符串中第一个o(书写顺序的第1个字节)替换为#,需要修改[rbp+6], "#"——因为rbp指向最后一个o,向高地址偏移6字节正好对应第一个o的位置。

内容的提问来源于stack exchange,提问作者Rômulo peres de moraes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:05:21