首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在没有“jump”的情况下使用程序集中的条件跳转?

问是否可以在没有“jump”的情况下使用程序集中的条件跳转?
EN

Stack Overflow用户
提问于 2018-01-07 16:50:33
回答 2查看 6.5K关注 0票数 6

因此,为了学习目的,我阅读了一些汇编源代码,发现了一些非常奇怪的东西(或者我可能只是个新手):

代码语言:javascript
复制
.ver:
    mov al, [redoxfs.header + Header.version +  bx]
    mov ah, [.version + bx]
    cmp al, ah
    jne .ver_err
    inc bx
    jl .ver

所以在这个子标签里我们有两个跳转指令。

但是,关于最后一次跳转指令jl。如果我错了,请纠正我,但是跳转之前不应该有一个cmp,因为它是有条件的吗?

我最初认为它是基于cmp al, ah的,但是jne跳起来了,如果不是相等的话。

我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 19:41:26

请考虑以下三种说明:

  • 所有条件跳转(如jne、jl等)将根据当前标志寄存器中一个或多个位的设置跳转。
  • 除了cmp指令之外,还有更多的指令将修改标志寄存器中的一些比特(如test、add等)。
  • 还有很多指令不修改任何标志(比如mov、push等等)。

示例

代码语言:javascript
复制
cmp al, ah
jne .ver_err

jne .ver_err基于设置的旗位跳转,最近的标志修改指令(在本例中为cmp al, ah )。

代码语言:javascript
复制
inc bx
jl .ver

jl .ver基于设置的旗位跳转,最近的标志修改指令(在本例中为inc bx )。

代码语言:javascript
复制
inc bx
lea si, [si+1]
jl .ver

由于这个插入的lea指令不修改任何标志,所以jl .ver指令仍然是基于inc bx指令设置的标记跳起的,因为这仍然是--修改指令的最新标志。

票数 8
EN

Stack Overflow用户

发布于 2018-01-07 17:07:25

在设置标志的指令和测试标志的指令之间,您可以得到任意多的指令,只要它们都不影响要测试的标志,并且对指令和/或良好引用的详细知识是必不可少的。

代码语言:javascript
复制
cmp eax,edx
xchg eax,edx
jne label

但是您不需要具体的cmp指令--任何设置标志的指令都可以后面跟着测试标志的指令。例如

代码语言:javascript
复制
sub eax, edx
js label
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48139412

复制
相关文章

相似问题

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