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:
Sử dụng cc -S để tìm hiểu – fuz
các loại là gì ' a', 'b' và' c'? – DCoder
@DCoder Tôi đã cập nhật câu hỏi! –