2013-01-12 12 views
10

Jak mam napisać taką instrukcję w zestawie o if?złożona instrukcja IF w zestawie

if ((a == b AND a > c) OR c == b) { ... 

Platforma: 32-bitowa maszyna Intel, składnia NASM.

Aktualizacja

Dla typów zmiennych i wartości, należy to, co jest łatwiejsze do zrozumienia. Uważam, że liczba całkowita sprawdzi się dobrze.

+2

CC -S, aby dowiedzieć się – fuz

+0

Jakie są rodzaje ' a', 'b' i' c'? – DCoder

+0

@DCoder Zaktualizowałem pytanie! –

Odpowiedz

17

W zespole generycznych, to będzie w zasadzie coś takiego (a w ax, b w bx, c w cx):

cmp bx, cx 
    jeq istrue 
    cmp ax, cx 
    jle isfalse 
    cmp ax, bx 
    jeq istrue 
isfalse: 
    ; do false bit 
    jmp nextinstr 
istrue: 
    ; do true bit 

nextinstr: 
    ; carry on 

Jeśli nie ma fałszywy bit, to można uprościć do:

cmp bx, cx 
    jeq istrue 
    cmp ax, bx 
    jne nextinstr 
    cmp ax, cx 
    jle nextinstr 
istrue: 
    ; do true bit 

nextinstr: 
    ; carry on 
+0

Świetne, dzięki! :) –

9

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: 
+1

Dzięki Flexo za odpowiedź, podoba mi się również twoje wyjaśnienie! :) –

Powiązane problemy