是否可以在单个比较指令后进行多条件跳转?
例如:
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。
这可能吗?更重要的是,是否有更好的方法来实现相同的程序?
答案 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语句)分支到许多不同的位置,这通常会在汇编中使用跳转表编写。跳转表是一个简单的表,其中包含您可能跳转到的所有可能目标。如果您正在打开一个数字,您可以使用该数字来索引跳转表并找到您的目标。