MS ASM 8086比较和条件跳跃

时间:2017-08-21 07:50:01

标签: assembly x86 masm

跳转到标签之前条件跳转检查的是什么 例如:

    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

我解释得有些混乱,但我希望你明白这一点。

2 个答案:

答案 0 :(得分:0)

所有Jxx命令检查特殊寄存器的bitstate,称为“flags”。许多指令确实间接地改变了该寄存器的状态。因此Jxx命令有效地采用分支,具体取决于 last 此类指令的结果。

因此,顺序在这里很重要:inc ecx / jle repeatAgain在增量之后(并且仅当)ecx&lt; = 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