是否可以在没有'cmp`的情况下在汇编中使用条件跳转?

Und*_*der 3 x86 assembly

所以我正在阅读一些用于学习目的的汇编源代码,并且遇到了一些非常奇怪的东西(或者我可能只是一个新东西):

.ver:
    mov al, [redoxfs.header + Header.version +  bx]
    mov ah, [.version + bx]
    cmp al, ah
    jne .ver_err
    inc bx
    jl .ver
Run Code Online (Sandbox Code Playgroud)

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

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

我最初认为它是基于cmp al, ah,但jne如果不相等则跳跃.

我错过了什么吗?

Sep*_*and 5

考虑以下3种说明:

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

例子

cmp al, ah
jne .ver_err
Run Code Online (Sandbox Code Playgroud)

jne .ver_err基于由最近的标志修改指令设置的标志位的跳转,cmp al, ah在这种情况下.

inc bx
jl .ver
Run Code Online (Sandbox Code Playgroud)

jl .ver基于由最近的标志修改指令设置的标志位的跳转,inc bx在这种情况下.

inc bx
lea si, [si+1]
jl .ver
Run Code Online (Sandbox Code Playgroud)

由于此插入的lea指令不会修改任何标志,因此jl .ver指令仍然会根据inc bx指令设置的标志位跳转,因为它仍然是最新的标志修改指令.