Сложный оператор IF в сборке
Как написать такой оператор if
в сборке?
if ((a == b AND a > c) OR c == b) { ...
Платформа: 32-разрядная машина Intel, синтаксис NASM.
Обновление
Для переменных типов и значений используйте все, что более легко понять. Полагаю, что целые числа отлично подходят для меня.
Ответы
Ответ 1
В общей сборке это будет в основном что-то вроде этого (a
в ax
, b
в bx
, c
в 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
Если нет ложного бита, его можно упростить:
cmp bx, cx
jeq istrue
cmp ax, bx
jne nextinstr
cmp ax, cx
jle nextinstr
istrue:
; do true bit
nextinstr:
; carry on
Ответ 2
Вам нужно разбить оператор if на ряд сравнений и переходов. Точно так же, как в C, вы можете написать:
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
}
Что нарушает сложное выражение в составные части, ваш asm будет делать то же самое, хотя вы можете написать его более чисто в asm, перепрыгнув на части, которые все еще актуальны.
Предполагая, что a, b и c передаются вам в стеке (если они не загружают их из других источников)
mov eax, DWORD PTR [ebp+8]
cmp eax, DWORD PTR [ebp+12] ; a == b?
jne .SECOND ; if it 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 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: