gpt4 book ai didi

assembly - MIPS 组装中的奇怪跳跃

转载 作者:行者123 更新时间:2023-12-04 22:37:08 25 4
gpt4 key购买 nike

我可能在这里遗漏了一些非常明显的东西,但我已经一遍又一遍地讨论这个问题,我显然被卡住了。在下面的代码中,$8只有在 $2 != $0 时才会增加.现在我双倍和三倍检查,beq指令有效(例如,如果我将 lop 更改为 end2,它确实会去那里)。

然而,出于某种原因,$8无论如何都会递增,即使执行了分支。

lop:   beq $3, $0, end2
and $2, $3, $4

sll $3, $3, 1

beq $2, $0, lop

addi $8, $8, 1

j lop

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

最佳答案

(第一个 and 之后的 beq 也将始终被执行。)

MIPS 有明确的管道危害;到做出分支(或不分支)决定时,下一条指令已经通过指令管道进行到足够远的距离,它将无论如何都会被执行。这被称为“分支延迟槽”。

在某些情况下,您可以安排代码来利用这一点;如果你不能(或不想),你可以输入 nop在以下说明中。

一些汇编程序会为您重新排序代码(或填写 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

关于assembly - MIPS 组装中的奇怪跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4115847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com