Eigentlich ganz einfach.
Wenn hier a <> 0 ist, gehts direkt weiter mit c = 1 und b wird nicht mehr beachtet.
Wenn a = 0 ist, wird geprüft, ob b <> 0 ist und wenn ja geht es weiter mit c = 1; wenn nicht, geht es weiter mit c = 2.
Hier werden a und b in zwei Register gelesen, dann wird das bitweise Oder
angewendet und dann wird mittels CMP überprüft, ob das Ergebnis
ungleich Null ist. Wenn ja, geht es mit c = 1 weiter, sonst mit c = 2.
Zusammenfassung:
Wenn man weiß, dass a statistisch öfter ungleich Null ist als b, schreibt
man 'If a Or b', sonst 'If b Or a'.
Falls im Code statt a und b Funktionen stehen, die auf jeden Fall
aufgerufen werden müssen, weil sie womöglich noch global etwas ändern,
schreibt man entweder 'If Funktion1() | Funktion2()', weil dann sicher
beide aufgerufen werden, auch wenn 'Funktion1()' Null ist, oder man
schreibt das Ergebnis der zweiten Funktion in eine Hilfsvariable vor der If-Zeile ('tmp = Funktion2() : If Funktion1() Or tmp'), was natürlich nur
sinnvoll ist, wenn 'Funktion2()' auch vor 'Funktion1()' aufgerufen werden
darf. Wenn die Reihenfolge der Funktionsaufrufe wichtig ist, braucht man
natürlich zwei Hilfsvariablen.
Die Möglichkeit 'If a | b' ist also hinfällig, da langsamer.
Zum Überblick nochmal ein Code und der passende ASM-Ausschnitt:
Code: Alles auswählen
a = 1
b = 2
If a Or b
c = 1
Else
c = 2
EndIf
If a | b
c = 3
Else
c = 4
EndIf
Code: Alles auswählen
; :
; a = 1
MOV dword [v_a],1
; b = 2
MOV dword [v_b],2
;
; If a Or b
CMP dword [v_a],0
JNE _AO_Ok0
CMP dword [v_b],0
JNE _AO_Ok0
JMP _AO_No0
_AO_Ok0:
MOV eax,1
JMP _AO0
_AO_No0:
XOR eax,eax
_AO0:
AND eax,eax
JE _EndIf2
; c = 1
MOV dword [v_c],1
; Else
JMP _EndIf1
_EndIf2:
; c = 2
MOV dword [v_c],2
; EndIf
_EndIf1:
;
; If a | b
MOV ebx,dword [v_a]
OR ebx,dword [v_b]
AND ebx,ebx
JE _EndIf5
; c = 3
MOV dword [v_c],3
; Else
JMP _EndIf4
_EndIf5:
; c = 4
MOV dword [v_c],4
; EndIf
_EndIf4:
Und zur Verdeutlichung nochmal das mit den Funktionsaufrufen:
Code: Alles auswählen
Global a.l, b.l
Procedure a()
Debug "a"
ProcedureReturn a
EndProcedure
Procedure b()
Debug "b"
ProcedureReturn b
EndProcedure
Debug "Mit 'Or' und a=1 und b=2:"
a = 1
b = 2
If a() Or b()
c = 1
Else
c = 2
EndIf
Debug "Mit 'Or' und a=0 und b=2:"
a = 0
b = 2
If a() Or b()
c = 1
Else
c = 2
EndIf
Debug "Mit '|' und a=0 und b=2:"
If a() | b()
c = 3
Else
c = 4
EndIf