因此,为了学习目的,我阅读了一些汇编源代码,发现了一些非常奇怪的东西(或者我可能只是个新手):
.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跳起来了,如果不是相等的话。
我是不是遗漏了什么?
发布于 2018-01-07 19:41:26
请考虑以下三种说明:
jne、jl等)将根据当前标志寄存器中一个或多个位的设置跳转。cmp指令之外,还有更多的指令将修改标志寄存器中的一些比特(如test、add等)。mov、push等等)。示例
cmp al, ah
jne .ver_errjne .ver_err基于设置的旗位跳转,最近的标志修改指令(在本例中为cmp al, ah )。
inc bx
jl .verjl .ver基于设置的旗位跳转,最近的标志修改指令(在本例中为inc bx )。
inc bx
lea si, [si+1]
jl .ver由于这个插入的lea指令不修改任何标志,所以jl .ver指令仍然是基于inc bx指令设置的标记跳起的,因为这仍然是--修改指令的最新标志。
发布于 2018-01-07 17:07:25
在设置标志的指令和测试标志的指令之间,您可以得到任意多的指令,只要它们都不影响要测试的标志,并且对指令和/或良好引用的详细知识是必不可少的。
cmp eax,edx
xchg eax,edx
jne label但是您不需要具体的cmp指令--任何设置标志的指令都可以后面跟着测试标志的指令。例如
sub eax, edx
js labelhttps://stackoverflow.com/questions/48139412
复制相似问题