为什么编写自修改代码不好? Mips汇编语言。怎么做?

时间:2018-10-14 16:40:02

标签: assembly mips cpu-architecture

此问题是从P&H的早期版本中解释出来的。

考虑以下用于实现指令的代码:

      foo $s0, $s1, $s2


mask:   .word 0xfffff83f
start:  lw    $t0,mask($zero)
        lw    $s0,shifter($zero)
        and   $s0,$s0,$t0
        andi  $s2,$s2,0x1f
        sll   $s2,$s2,6
        or    $s0,$s0,$s2
        sw    $s0, shifter($zero)
shifter:sll   $s0,$s1,0

在代码中添加有意义的注释,并编写一段描述其工作方式的段落。您为什么认为编写这样的“自我修改代码”是个坏主意(常常实际上是不允许的)?

说明:

  1. 标签等效于与OS为其决定的地址相对应的立即数。例如,如果操作系统决定在100010处启动程序,则掩码是立即数100010。

  2. 您可以假定程序已加载到高16位为0的地址。因为MIPS的立即数是16位,而对移位器/掩码的引用被解释为移位器/掩码的低16位,所以需要这种假设。您还可以假设shifter和mask的msb(位15)均为0-由于偏移量是符号扩展的,因此需要此假设。

  3. 我们尚未涵盖.word指令。这是一个汇编程序指令,它实际上是对汇编程序的指令(不是汇编语言指令)。在这种情况下,它告诉汇编程序保留一个初始化为0xfffff83f的内存字。掩码是该单词的地址(就像开始是内存中包含该lw指令的机器代码的单词的地址一样。)

0 个答案:

没有答案