在 Assembly 中实现流程“(1) if {...} else if {...} ... (2)”

2024-02-18

我在 C 中有以下流程:

// some stuff1
//................


if (something1) {
    func1();
    func2();
} else if (something2) {
    func3();
    func4();
}

// some stuff2

我想知道如何在汇编中对其进行编码?我的意思是,不是精确的说明,而是流程。我应该使用标签跳转到 if (something1) { ...} 和“else if (something2)”内部的内容吗?我该如何返回“// some stuff2”?

  ; some stuff1
  ; and then 

  cmp [some_struc], SOME_CONST
  je .... ????

  cmp [some_struc], SOME_CONST2
  je .... ????


  ; some stuff2
  ; how to better get back here?
  cmp rax, 0 

或者我应该将它们称为函数?那么如果第一个是真的,我将如何跳过第二个“else if (something2) {”?

我可以以某种方式实施,但我想知道如何更好地做到这一点。


我想说,这很大程度上取决于这些 {...} 块中有多少代码。
如果其中的代码有限,请使用:

    cmp  [some_struc], SOME_CONST
    jne  Else
    {...}
    jmp  EndIf
Else:
    cmp  [some_struc], SOME_CONST2
    jne  EndIf
    {...}
EndIf:
    cmp  rax, 0

如果还有更多代码:

    cmp  [some_struc], SOME_CONST
    jne  Else
    call Part1
    jmp  EndIf
Else:
    cmp  [some_struc], SOME_CONST2
    jne  EndIf
    call Part2
EndIf:
    cmp  rax, 0

Part1:
    {...}
    ret
Part2:
    {...}
    ret

最佳使用call。我不建议跳到Part1 or Part2然后跳回EndIf.
这将创建意大利面条式代码。可读性较差,并且很快就会变得难以维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Assembly 中实现流程“(1) if {...} else if {...} ... (2)” 的相关文章

随机推荐