具有真实指令助记符的伪指令
Pseudoinstructions with real instruction mnemonics
str9
是分配在.data
段的一个字节的标签,这个字节的地址是0x1001_58e4
。确定将作为此伪指令的结果生成的机器码:
lbu $t1, str9
我完全不明白为什么这是一个伪指令,为什么 0x1001_58e4
不能简单地用给定的指令加载到 $t1
GPR 中。有人可以向我解释为什么这在这种情况下不起作用。汇编程序在处理这种情况时会执行哪些实际指令?一旦找到真正的指令,我就知道如何将指令翻译成机器代码,但只是不明白需要真正的指令,因为我的教授说它需要分解成 2 个。
你试过把它变成一条指令吗?你成功了吗? :)
提示:地址本身是一个 32 位值 (0x1001_58e4
),而 mips 指令是 32 位的,所以如果你想对其进行编码,操作码和目标寄存器就没有地方了。
因此,您需要在 2 条指令中完成。首先,将地址的前 16 位加载到 $t1
,然后使用真正的 lbu
将低 16 位作为前 16 位的偏移量:
lui $t1, 0x1001
lbu $t1, 0x58e4($t1)
What real instructions does the assembler do when dealing with this
case?
你总是可以 assemble 和 disassemble:
Disassembly of section .text:
00000000 <.text>:
0: 3c091001 lui t1,0x1001
4: 912958e4 lbu t1,22756(t1)
str9
是分配在.data
段的一个字节的标签,这个字节的地址是0x1001_58e4
。确定将作为此伪指令的结果生成的机器码:
lbu $t1, str9
我完全不明白为什么这是一个伪指令,为什么 0x1001_58e4
不能简单地用给定的指令加载到 $t1
GPR 中。有人可以向我解释为什么这在这种情况下不起作用。汇编程序在处理这种情况时会执行哪些实际指令?一旦找到真正的指令,我就知道如何将指令翻译成机器代码,但只是不明白需要真正的指令,因为我的教授说它需要分解成 2 个。
你试过把它变成一条指令吗?你成功了吗? :)
提示:地址本身是一个 32 位值 (0x1001_58e4
),而 mips 指令是 32 位的,所以如果你想对其进行编码,操作码和目标寄存器就没有地方了。
因此,您需要在 2 条指令中完成。首先,将地址的前 16 位加载到 $t1
,然后使用真正的 lbu
将低 16 位作为前 16 位的偏移量:
lui $t1, 0x1001
lbu $t1, 0x58e4($t1)
What real instructions does the assembler do when dealing with this case?
你总是可以 assemble 和 disassemble:
Disassembly of section .text:
00000000 <.text>:
0: 3c091001 lui t1,0x1001
4: 912958e4 lbu t1,22756(t1)