GNU AS在divu MIPS指令上的行为

时间:2016-09-15 07:42:09

标签: assembly mips gas binutils

为了在FPGA上测试我们的MIPS实现,我写了几个汇编程序测试代码。我正在使用mips-linux-gnu-as进行编译。

以下代码是测试divu实现,从代码中,条件beq $ t2,$ t1,label1预计通过,3在$ t1中加载。

.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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

延迟槽中可能不会出现分支和跳转。您在j的延迟位置有beq。另外,我认为你不想在addiu t1, zero, 3的延迟槽中j。您应该使用.set reorder代替.set noreorder。或者,您需要学习如何处理分支延迟槽。