从跳跃回来

时间:2014-03-08 17:46:09

标签: assembly

我对集会很新,我有一个初学者的问题。假设我比较一下,然后我做je anotherLabel。如何在完成执行anotherlabel之后将其返回到原始je anotherlabel之后的行?

示例:

cmp ecx, '['
je it_is_open_bracket
cmp ecx, ']'
je it_is_close_bracket

it_is_open_bracket:
    dostuff

现在让我们假设第一个cmp返回相等,然后它执行it_is_open_bracket,我怎样才能让它返回到cmp ecx, ']',从而完成剩下的代码?< / p>

2 个答案:

答案 0 :(得分:4)

您可以更轻松地跳过实施子程序并使用CALL然后RET调用它来回到原来的位置。

  

call,ret - 子程序调用并返回

     

这些指令实现子程序调用并返回。调用指令首先将当前代码位置推送到   内存中的硬件支持堆栈(参见推送指令)   详细信息),然后执行无条件跳转到代码位置   标签操作数表示。与简单的跳转指令不同,   调用指令保存返回的位置   子程序完成。

     

ret指令实现子程序返回机制。该指令首先从支持的硬件弹出代码位置   内存堆栈(有关详细信息,请参阅pop指令)。然后呢   执行无条件跳转到检索到的代码位置。

Syntax
call <label>
ret

Source

答案 1 :(得分:2)

  cmp ecx, '['
  jne notob
  call it_is_open_bracket
notob:
  cmp ecx, ']'
  jne notcb
  call it_is_close_bracket
notcb:
  ...
it_is_open_bracket:
  ...
  RET

是经典的方式。通常,您创建一个像CE这样的宏来做同样的事情 - 精确的语法取决于您正在使用的汇编程序 - 但这将允许您编写代码

  cmp ecx, '['
  ce it_is_open_bracket
  cmp ecx, ']'
  ce it_is_close_bracket

用宏做驴工作。