汇编编码时如何避免goto和jump?

How to avoid goto and jump when coding in assembly?

我知道这里和其他地方有很多关于在高级编程语言中避免 goto 的帖子。然而,从我在 MIPS 汇编中编码的(公认的小)经验来看,似乎没有明显的方法可以在实现控制流时避免汇编中的 goto 和跳转语句。

例如,这段代码如何在汇编中实现(相当于 C):

if (x < 2)
  { ans = 0; }
else
  { ans = 1; } 

是否有必要使用 goto 或 jump 语句,或者是否有适当的方法避免它们以支持更合适的代码实践?

在 high-level 编程语言中避免 goto 的建议仅适用于 - 嗯 - high-level 语言。

汇编程序是一种 low-level 语言,跳转是必不可少的。

你无法完全避免使用跳转指令,因为你已经几乎直接与处理器对话了。

但是通过更好的练习,您正在应用 high-level 编程,您仍然可以在汇编代码中使用更少的跳转。

一些想法,例如:

  • 在块内跳转,而不是在块之间跳转。
  • 按照传统的 for/while/if/case 顺序以简单易读的逻辑跳转。
  • 一块程序集做一件事;最小的副作用。
  • 尽量使用宏或函数,不要重复自己。

虽然它不是 MIPS,但对于 X86 处理器,在 Microsoft 汇编程序的情况下 ML.EXE(16 / 32 位)和 ML64.EXE(64 位),自 MASM 6.11 以来,以及所有版本Visual Studio,你可以使用点指令:

ans     equ     eax

        .if     x < 2
        mov     ans,0
        .else
        mov     ans,1
        .endif

在此示例中,点指令转换为比较立即数、跳转指令和移动立即数。有关详细信息,请参阅

http://msdn.microsoft.com/en-us/library/8t163bt0.aspx

当每个人都迫使您不要在高级语言中使用 goto 时,不使用 goto 是(有点)可以理解的。但是要将其转移到汇编中...在汇编中编码时完全不可能不使用 jmp,因为没有这些隐藏的 goto 指令,例如 for 或 while。