代码之家  ›  专栏  ›  技术社区  ›  user472875

MIPS程序集中的奇怪跳转

  •  4
  • user472875  · 技术社区  · 15 年前

    $8 只有当 $2 != $0 . 现在我检查了两次和三次 beq

    但是,出于某种原因, 8美元

    lop:   beq $3, $0, end2
           and $2, $3, $4
    
           sll $3, $3, 1
    
           beq $2, $0, lop     
    
           addi $8, $8, 1
    
           j lop
    

    我得承认我完全被难住了。

    2 回复  |  直到 12 年前
        1
  •  6
  •   Matthew Slattery    15 年前

    (在 and beq 也将永远被执行。)

    MIPS有明显的管道危险;当决定分支(或不分支)时,以下指令已经在指令管道中进行了足够远的处理,无论执行与否。这被称为“分支延迟时隙”。

    在某些情况下,您可以安排代码来利用这一点;如果您不能(或不想),您可以将 nop 在下面的指令中。

    )给你-例如。 gas ,GNU汇编程序会这样做,除非您告诉它不要使用 .set noreorder

    如果您编写的代码没有由汇编程序自动重新排序,我建议您使用一些额外的缩进来注释延迟槽,以使其突出:

    lop:   beq $3, $0, end2
             nop
           and $2, $3, $4
    
           sll $3, $3, 1
    
           beq $2, $0, lop     
             nop
    
           addi $8, $8, 1
    
           j lop
    
        2
  •  5
  •   Oliver Charlesworth    15 年前
    推荐文章