我对集会很新,我有一个初学者的问题。假设我比较一下,然后我做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>
答案 0 :(得分:4)
您可以更轻松地跳过实施子程序并使用CALL
然后RET
调用它来回到原来的位置。
call,ret - 子程序调用并返回
这些指令实现子程序调用并返回。调用指令首先将当前代码位置推送到 内存中的硬件支持堆栈(参见推送指令) 详细信息),然后执行无条件跳转到代码位置 标签操作数表示。与简单的跳转指令不同, 调用指令保存返回的位置 子程序完成。
ret指令实现子程序返回机制。该指令首先从支持的硬件弹出代码位置 内存堆栈(有关详细信息,请参阅pop指令)。然后呢 执行无条件跳转到检索到的代码位置。
Syntax call <label> ret
答案 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
用宏做驴工作。