【问题标题】:Return from jump to main从跳转返回主
【发布时间】: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 的指令

标签: windows x86 nasm


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多