double condition checking in assembly
There is a way to express a range check like this using only a single conditional jump:
sub eax, 20
cmp eax, 80
ja END
// do something
END: ret
This is a very common optimization trick when working with integer ranges. The initial subtract maps the range [20,100] to [0,80]; membership in that range is then be checked with a single unsigned comparison.
Note also that the same thing can be done in C:
unsigned int upperBound = 100;
unsigned int lowerBound = 20;
if (yourValue - lowerBound <= upperBound - lowerBound) {
// do something
}
Depending on what syntax you're using, and assuming x
is in the eax
register, something like this:
cmp eax, 20
jl ELSE
cmp eax, 100
jg ELSE
#do something
jmp END
ELSE:
#do else
END:
You can try compiling it from a higher level language (C/C++/ ...) with optimalisations at high (-O3 for gcc), and have a look at what the compiler generates (objdump). It should generate very efficient code.