首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU在似然MIPS指令上的Weired行为

GNU在似然MIPS指令上的Weired行为
EN

Stack Overflow用户
提问于 2016-09-15 07:42:09
回答 1查看 218关注 0票数 0

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

下面的代码测试似曾相识的实现,从代码中,条件beq $t2,$t1,label1被期望通过,3被加载到$t1中。

代码语言:javascript
复制
.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正在为上面的代码生成奇怪的输出,它以不同的执行行为结束,而3从未在$t1中加载。

截面.text的二次装配

代码语言:javascript
复制
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

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 07:47:49

分支和跳转可能不会发生在延迟时隙中。您在j的延迟时隙中有beq。而且,我认为您也不希望addiu t1, zero, 3出现在j的延迟时隙中。您可能应该使用.set reorder而不是.set noreorder。或者,您需要学习如何处理分支延迟插槽。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39505534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档