Będziesz musiał podzielić instrukcję if na serię porównań i skoków. W taki sam sposób, w C można napisać:
int test = 0;
if (a == b) {
if (a > c) {
test = 1;
}
}
// assuming lazy evaluation of or:
if (!test) {
if (c == b) {
test = 1;
}
}
if (test) {
// whole condition checked out
}
Który łamie wyrażenie złożone na części składowych Twój ASM postąpi podobnie, choć można napisać to bardziej czysto w asm skacząc do części, które są nadal aktualne .
Zakładając, B i C są przekazywane do Ciebie na stosie (jeśli nie są one załadować je z zewnątrz oczywiście)
mov eax, DWORD PTR [ebp+8]
cmp eax, DWORD PTR [ebp+12] ; a == b?
jne .SECOND ; if it's not then no point trying a > c
mov eax, DWORD PTR [ebp+8]
cmp eax, DWORD PTR [ebp+16] ; a > c?
jg .BODY ; if it is then it's sufficient to pass the
.SECOND:
mov eax, DWORD PTR [ebp+16]
cmp eax, DWORD PTR [ebp+12] ; second part of condition: c == b?
jne .SKIP
.BODY:
; .... do stuff here
jmp .DONE
.SKIP:
; this is your else if you have one
.DONE:
CC -S, aby dowiedzieć się – fuz
Jakie są rodzaje ' a', 'b' i' c'? – DCoder
@DCoder Zaktualizowałem pytanie! –