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

为何使用Movq指令改写.text段MSG首Quadword值时触发段错误?

.text段写入触发段错误的原因

问题场景

你在.text段中声明了如下数据:

.text 
MSG:
.quad 0x0000000000000001
.quad 0x0000000000000001
.quad 0x0000000000000001
.quad 0x0000000000000001

尝试执行以下指令修改MSG的第一个四字值(RBX存储新值,R10和R11的值均为0):

Movq %rbx, MSG(%r10, %r11, 8)

但指令触发了段错误,原因如下:

错误根源

  • .text段的内存权限是只读的:在主流操作系统的程序加载模型中,.text段被设置为可执行、只读属性,专门用于存放程序的机器指令和不需要修改的常量数据。向只读内存区域写入数据会触发操作系统的内存保护机制,直接抛出段错误终止程序。
  • 寻址逻辑无问题:当R10=0、R11=0时,MSG(%r10, %r11, 8)的计算结果是MSG + 0 + 0*8,刚好指向MSG的第一个四字,寻址方式本身是正确的,错误和寻址无关。

解决方法

如果需要存储可修改的数据,应该将MSG迁移到.data段(已初始化可读写数据段)或.bss段(未初始化可读写数据段)中,示例如下:

.data 
MSG:
.quad 0x0000000000000001
.quad 0x0000000000000001
.quad 0x0000000000000001
.quad 0x0000000000000001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:51:06