所以我正在阅读一些用于学习目的的汇编源代码,并且遇到了一些非常奇怪的东西(或者我可能只是一个新东西):
.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如果不相等则跳跃.
我错过了什么吗?
考虑以下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指令设置的标志位跳转,因为它仍然是最新的标志修改指令.
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |