跳转到标签之前条件跳转检查的是什么 例如:
mov eax, 0
mov ecx, 1
repeatAgain:
add eax, ecx
cmp ecx, 3
inc ecx
jle repeatAgain
nop
ret
在这个例子中有条件跳转是什么(在继续跳跃之前检查相等性的地方?):
mov eax, 0
mov ecx, 1
repeatAgain:
add eax, ecx
inc ecx
cmp ecx, 3
jle repeatAgain
nop
ret
我解释得有些混乱,但我希望你明白这一点。
答案 0 :(得分:0)
所有Jxx
命令检查特殊寄存器的bitstate,称为“flags”。许多指令确实间接地改变了该寄存器的状态。因此Jxx
命令有效地采用分支,具体取决于 last 此类指令的结果。
因此,顺序在这里很重要:inc ecx / jle repeatAgain
在增量之后(并且仅当)ecx< = 0时进行分支(即大约2亿次迭代,直到ecx在最高/符号位中溢出)。虽然cmp ecx, 3 / jle repeatAgain
仅在ecx <= 3时才进行分支(即仅3次迭代)。
在继续跳跃之前检查相等性在哪里?
嗯,它是cmp ecx, 3
(它有效地设置了“标志”状态,好像你已经计算了表达式ecx - 3
,即ecx - 3
小于零,等于零,或大于零?),但实际上循环被“更大”条件打破。即只有当ecx变为4时才会进行后向分支。
答案 1 :(得分:0)
第一个条件跳转遵循let imageData:NSData = try? NSData(contentsOf: imageUrl)
if let imageData = imageData {
let image = UIImage(data: imageData)
}
指令:
inc
第二个是在inc ecx
jle repeatAgain
指令之后:
cmp
条件代码在条件跳转:cmp ecx, 3
jle repeatAgain
中是相同的,代表小于或等于。
如果逐个操作(le
)的结果为非正数,则在第一种情况下执行跳转;在第二种情况下,如果inc
低于或等于比ecx
。