MIPS运行时错误‘Cannot write directly to text segment’:字符串反转程序求助
搞定MIPS字符串反转的读写权限错误
嘿,这个问题其实是MIPS内存分段的经典新手坑,我刚学汇编的时候也踩过!咱们一步步说清楚:
为什么会报「Cannot write directly to text segment」?
MIPS程序的内存是分成不同功能段的:
.text段是只读区域,专门用来存放你的程序指令,系统从设计上就不允许往这里写数据;.data段是可读写区域,用来放字符串、变量这些需要修改或存储的数据。
你报错的sb $t6,stringreverse($t3)这条指令,大概率是因为stringreverse这个标签被定义在了.text段里(或者压根没在.data段中声明),你试图往只读的代码段里写入反转后的字符,直接违反了内存段的权限规则,所以系统抛出了这个错误。
怎么快速修复?
很简单,把stringreverse移到.data段里,给它分配足够的存储空间就行——比如和你的theString一样用.space 32(保证能放下最长31个字符加结束符):
.data nl: .asciiz "\n" inputPrompt: .asciiz "Please enter an integer:\n" theString: .space 32 stringreverse: .space 32 # 把反转后的字符串存在这里,分配足够空间 theInteger: .word 1 .text # 后面的main代码保持不变
另外还要确认你在代码里是用la指令加载stringreverse的地址(比如la $t3, stringreverse),这样才能正确指向可读写的内存区域。
额外小提醒
记住MIPS的内存段分工:
.text只读:只放程序指令,别往这儿写数据;.data可读写:存所有需要修改的变量、字符串;- 要是有未初始化的变量,还可以用
.bss段,同样是可读写的。
以后写字符串操作的时候,先检查目标地址是不是在可读写段里,就能避免这类权限错误啦!
内容的提问来源于stack exchange,提问作者djjeane
相关产品推荐
相关产品推荐

