【问题标题】:MIPS Runtime Error with "Cannot write directly to text segment"?“无法直接写入文本段”的 MIPS 运行时错误?
【发布时间】:2015-02-24 23:46:09
【问题描述】:

我试图将某些内容存储到内存地址中并遇到此错误。

这是我正在做的一个示例:

sll $11, $10, 2 #为这个循环注册 $10 包含 1

mflo $9 # 先前计算的答案 # 位于 sll 指令部分的正上方

sw $9, 0($11) # 将答案存储在内存地址发生错误

我尝试通过存储在不同的寄存器中来解决它,确保我要使用的内存地址为空等,但似乎没有任何工作......如果你们遇到了这个问题,有什么问题吗你做了什么修复它?

感谢大家的帮助

【问题讨论】:

  • 您显示的代码量不足。请显示 complete 最小示例 - 生成显示问题的可执行文件的单个程序集文件。这是什么操作系统?

标签: assembly runtime-error mips


【解决方案1】:

问题其实很简单:$11 没有指向可写内存。 $11 的值为 4 (1<<2)。您没有显示足够的代码,但我假设您将 $11 初始化为指向可写区域,然后用 SLL 指令覆盖它。也许你的意思是这样的:

; Here $11 must contain an address of a writable memory area

SLL $12, $10, 2    ; $12 = $10[offset] * 4
ADD $12, $11, $12  ; $12 = $11[base] + offset*4
SW  $9, 0($12)     ; store $9 at at base+offset*4

【讨论】:

  • 但是当我执行“sw $9, 0($11)”时,这是否意味着将寄存器 9 中的任何内容存储到 mem[寄存器 11 + 0] 中?因此这等于 mem[4] 应该指向一个内存地址。另外,11 美元指向可写区域是什么意思?在这个循环部分之前我有完全相同的代码,它没有给我任何错误
  • @Thankyouforyourhelp 你怎么知道地址4是可写的?这段代码在什么操作系统上运行?你从哪里得到那个地址的?你不能只选择一个数字然后说“嘿,我会在那里写点什么”。运行时错误意味着地址4在你进程的只读文本段中。
  • @Thankyouforyourhelp 通过“指向可写区域”,我的意思是寄存器包含您“拥有”并且可以写入的内存区域的地址。在您的汇编代码中,您必须在数据段中定义一个数据块,为其分配一个标签,然后将 $11 设置为该标签的值(地址)。
  • 有没有办法更改地址 4 以便我可以写信给它?或者必须跳过它
  • @Thankyouforyourhelp 很可能在该地址有一些不属于您的代码或其他数据。如果您修改了内存页面的描述符以使其可写,那么无论如何您都会使程序崩溃。您需要了解如何在汇编代码中定义可写数据区域——这是特定于环境和汇编程序的。您使用什么汇编程序,什么版本,目标的操作系统是什么?
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 2021-11-16
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
相关资源
最近更新 更多