首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跳转到保存在英特尔程序集中的寄存器中的地址?

如何跳转到保存在英特尔程序集中的寄存器中的地址?
EN

Stack Overflow用户
提问于 2015-06-13 07:14:36
回答 1查看 1.7K关注 0票数 1

如果我计算标签的地址并将其存储在eax寄存器中,我如何有条件地跳转(使用JE)到eax

代码语言:javascript
复制
jmp eax

编译,但我没有检查它是否有效。

代码语言:javascript
复制
je eax

不编译(操作码和操作数的无效组合)。为什么会有区别?如果我和eax相等,我怎么跳?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 07:25:25

根本就没有这种形式的je。您可以做的是根据相反的条件放置一个相对条件跳转,然后是一个无条件的寄存器--间接跳转:

代码语言:javascript
复制
jne skip
jmp eax
skip:

你可以用它做一个宏来防止你一遍又一遍地写同样的东西。例如,在NASM语法中,该宏可能如下所示:

代码语言:javascript
复制
%macro je_reg 1 
    jne %%skip 
    jmp %1 
    %%skip: 
%endmacro

可以像这样使用:

代码语言:javascript
复制
je_reg eax
je_reg ebx

宏可以泛化为使用任何条件代码:

代码语言:javascript
复制
%macro jcc_reg 2 
    j%-1 %%skip   ; %-1 expands to the inverse of the condition in the first macro argument
    jmp %2 
    %%skip: 
%endmacro

; Example usage
jcc_reg e,eax
jcc_reg no,ebx
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30816084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档