首页 > 解决方案 > 从跳转返回主

问题描述

_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”,我最终会创建很多标签。

标签: windowsx86nasm

解决方案


没有条件调用之类的东西。但是您可以将调用与条件跳转结合起来:

  ...
  jne no_call
  call label_1 
no_call:
  operation_a
  ...

这样,如果不满足相等条件,则跳过该call命令并且不会发生调用。如果满足相等条件,JNE什么都不做,你做 a call,然后最终ret从它到operation_a

no_call不是操作,而是标签。所以地址no_call和地址operation_a是一回事,以防不清楚。

if()“JNE 到几行以下的标签”技巧与汇编中的语句一样接近。

在汇编代码中创建许多标签是生活中的不幸事实。:)


推荐阅读