【发布时间】:2019-05-10 15:55:52
【问题描述】:
_main:
.
..
...
call label_1
operation_a
...
..
.
"call" 推 label_1 的地址入栈,并执行它的代码。为了继续执行“operation_a”等,“label_1”必须包含一个“ret”,它弹出 label_1的地址并继续执行“operation_a”等等。
我遇到的问题
_main:
.
..
...
je label_1
operation_a
...
..
.
在这种情况下,“je”会跳转到label_1,因此我不能将“ret”添加到“label_1”中的指令集,然后...
我怎样才能从那个跳转返回到主代码?是否存在“调用”标签的条件跳转?
朋友提到我可以在label_1的末尾添加一个“jmp aux_label”,然后在main函数中添加那个“aux_label”,但是如果我碰巧做了很多“je”,我最终会创建很多标签.
【问题讨论】:
-
有没有“调用”标签的跳转?是的,它叫做
call。它在跳转之前推送一个返回地址。但是,它没有条件形式。 (但如果需要,您可以在call上使用jcc。) -
但是,如果您想要返回的区块只有一个“调用者”,请在您想要返回的地方添加一个标签,并在您的区块末尾添加
jmp,而不是这样做打电话/回复。通常,您不需要在条件分支之后立即返回该位置。如果您的分支变成一团意大利面条,您可能应该优化代码逻辑以简化分支。或者用C写;大多数时候,编译器都非常擅长布局分支。 -
我的意思是它的条件形式,多么糟糕!
-
是的,那是我朋友提到的解决方案,但我会做很多“jmp label_aux”......我可能会以一大堆代码结束(没有真正的组装经验)。我应该将此问题标记为已解决吗?
-
call label_1不会将label_1的地址压入堆栈。它将 CALL 之后的下一条指令的地址压入堆栈(因此operation_a的地址被压入堆栈)。当label_1处的代码(函数)最终调用 RET - CPU 将从堆栈中弹出该地址并将指令指针设置为有效地返回到operation_a的指令