2013-01-12 103 views
10

Tôi nên viết câu lệnh if như thế nào trong hội đồng?câu lệnh IF phức tạp trong assembly

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

Nền tảng: Máy 32 bit Intel, cú pháp NASM.

Cập nhật

Đối với các loại biến và giá trị, sử dụng bất cứ điều gì là dễ dàng hơn để hiểu. Số nguyên sẽ làm việc tốt cho tôi, tôi đoán vậy.

+2

Sử dụng cc -S để tìm hiểu – fuz

+0

các loại là gì ' a', 'b' và' c'? – DCoder

+0

@DCoder Tôi đã cập nhật câu hỏi! –

Trả lời

17

Trong lắp ráp chung chung, nó sẽ được về cơ bản một cái gì đó như thế này (a trong ax, b trong bx, c trong 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 

Nếu không có chút sai, nó có thể được đơn giản hóa để:

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

nextinstr: 
    ; carry on 
+0

Tuyệt vời, cảm ơn! :) –

9

Bạn sẽ cần phải chia tuyên bố if thành một loạt các so sánh và nhảy. Trong cùng một cách mà trong C bạn có thể viết:

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 
} 

nào phá vỡ khái niệm phức tạp thành bộ phận cấu thành asm của bạn sẽ làm tương tự như vậy, mặc dù bạn có thể viết nó sạch hơn trong asm bằng cách nhảy đến bộ phận mà vẫn có liên quan .

Giả sử a, b và c đều được thông qua với bạn trên stack (nếu họ không tải chúng từ nơi khác rõ ràng)

 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

Cảm ơn Flexo vì câu trả lời, tôi cũng thích lời giải thích của bạn! :) –

Các vấn đề liên quan