GNU AS 在 divu MIPS 指令上的奇怪行为
Weired behaviour of GNU AS on divu MIPS instruction
为了在 FPGA 上测试我们的 MIPS 实现,我编写了一些汇编测试代码。我正在使用 mips-linux-gnu-as 进行编译。
下面的代码是为了测试divu的实现,从代码来看,条件beq $t2, $t1, label1应该可以通过,$t1中加载了3。
.set noreorder
.text
__start:
li $t1, 10
li $t2, 2
divu $t1, $t2
mflo $t2
li $t1, 5
beq $t2, $t1, label1
j label2
label1:
li $t1, 3
label2:
nop
我的问题是 gnu-as 为上述代码生成奇怪的输出,以不同的执行行为结束,并且 3 从未加载到 $t1 中。
.text部分的反汇编
00000000 <__start>:
0: 2409000a addiu t1,zero,10
4: 240a0002 addiu t2,zero,2
8: 15400002 bnez t2,14 <__start+0x14>
c: 012a001b divu zero,t1,t2
10: 0007000d break 0x7
14: 00004812 mflo t1
18: 00005012 mflo t2
1c: 24090005 addiu t1,zero,5
20: 11490001 beq t2,t1,28 <label1>
24: 0800000b j 2c <label2>
00000028 <label1>:
28: 24090003 addiu t1,zero,3
0000002c <label2>:
2c: 00000000 sll zero,zero,0x0
非常感谢任何帮助。
延迟槽中可能不会出现分支和跳转。 beq
的延迟槽中有 j
。另外,我认为您也不想在 j
的延迟槽中使用 addiu t1, zero, 3
。您可能应该使用 .set reorder
而不是 .set noreorder
。或者,您需要学习如何处理分支延迟槽。
为了在 FPGA 上测试我们的 MIPS 实现,我编写了一些汇编测试代码。我正在使用 mips-linux-gnu-as 进行编译。
下面的代码是为了测试divu的实现,从代码来看,条件beq $t2, $t1, label1应该可以通过,$t1中加载了3。
.set noreorder
.text
__start:
li $t1, 10
li $t2, 2
divu $t1, $t2
mflo $t2
li $t1, 5
beq $t2, $t1, label1
j label2
label1:
li $t1, 3
label2:
nop
我的问题是 gnu-as 为上述代码生成奇怪的输出,以不同的执行行为结束,并且 3 从未加载到 $t1 中。
.text部分的反汇编
00000000 <__start>:
0: 2409000a addiu t1,zero,10
4: 240a0002 addiu t2,zero,2
8: 15400002 bnez t2,14 <__start+0x14>
c: 012a001b divu zero,t1,t2
10: 0007000d break 0x7
14: 00004812 mflo t1
18: 00005012 mflo t2
1c: 24090005 addiu t1,zero,5
20: 11490001 beq t2,t1,28 <label1>
24: 0800000b j 2c <label2>
00000028 <label1>:
28: 24090003 addiu t1,zero,3
0000002c <label2>:
2c: 00000000 sll zero,zero,0x0
非常感谢任何帮助。
延迟槽中可能不会出现分支和跳转。 beq
的延迟槽中有 j
。另外,我认为您也不想在 j
的延迟槽中使用 addiu t1, zero, 3
。您可能应该使用 .set reorder
而不是 .set noreorder
。或者,您需要学习如何处理分支延迟槽。