为何使用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
相关产品推荐
相关产品推荐

