如何在Assembly中实现“多分支”条件跳转

时间:2017-05-17 23:27:43

标签: assembly optimization x86

是否可以在单个比较指令后进行多条件跳转?

例如:

Sub Set_Background_Color ()
    Dim lRow As Long
    Dim MR As Range
    Dim cel As Range
    lRow = Range("E" & Rows.Count).End(xlUp).Row
    Set MR = Range("E2:E" & lRow)
    For Each cel In MR
        If cel.Value = "string" Then
            If cel.Offset(, -1).Value = "" Then
                cel.Offset(, -1).Interior.ColorIndex = 19
            ElseIf cel.Offset(, -1).Value = "*" Then
                cel.Offset(, -1).Interior.ColorIndex = -4142
            End If
        End If
    Next
End Sub

当EAX>时程序运行“More”分支。 ECX,并且当EAX<时,“Less”分支。 ECX。

这可能吗?更重要的是,是否有更好的方法来实现相同的程序?

1 个答案:

答案 0 :(得分:1)

是的,可以在单个比较指令后进行多次条件跳转。比较指令(在本例中为CMP EAX, ECX)设置EFLAGS状态寄存器中的状态位,在决定是否跳转时由以下条件分支使用。

以此代码为例:

MOV EAX, 5    ; set EAX to 5
MOV ECX, 3    ; set ECX to 3
CMP EAX, ECX  ; sets comparison bits
JL  _target1  
JG  _target2

在此代码部分中,5大于3,因此代码将跳转到_target2。

有4个标准标志,ZNCV(零标志,负标志,进位标志,溢出标志),它们在不同的时间由不同的指令设置。例如,如果添加的数字非常大并且导致整数溢出,则加法(ADD EAX, ECX)将设置溢出标志。

对于CMP,Carry标志用于显示第一个数字是大于还是小于第二个数字。如果两个数字相等,则Zero标志设置为1。

就不同的方法而言,如果基于单个值(相当于C中的switch语句)分支到许多不同的位置,这通常会在汇编中使用跳转表编写。跳转表是一个简单的表,其中包含您可能跳转到的所有可能目标。如果您正在打开一个数字,您可以使用该数字来索引跳转表并找到您的目标。