此问题是从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
在代码中添加有意义的注释,并编写一段描述其工作方式的段落。您为什么认为编写这样的“自我修改代码”是个坏主意(常常实际上是不允许的)?
说明:
标签等效于与OS为其决定的地址相对应的立即数。例如,如果操作系统决定在100010处启动程序,则掩码是立即数100010。
您可以假定程序已加载到高16位为0的地址。因为MIPS的立即数是16位,而对移位器/掩码的引用被解释为移位器/掩码的低16位,所以需要这种假设。您还可以假设shifter和mask的msb(位15)均为0-由于偏移量是符号扩展的,因此需要此假设。
我们尚未涵盖.word指令。这是一个汇编程序指令,它实际上是对汇编程序的指令(不是汇编语言指令)。在这种情况下,它告诉汇编程序保留一个初始化为0xfffff83f的内存字。掩码是该单词的地址(就像开始是内存中包含该lw指令的机器代码的单词的地址一样。)