Logical AND implementation in x86_64 Linux assembly

415 Views Asked by At

I'm trying to implement logical NOT and logical AND in assembly, I did logical NOT already using x < 1 but I can't think of how to implement AND, I can use binary and but that's broken for negative numbers (it assumes -1 is true) and it doesn't make any sense when NOT obviously works because -1 < 1 would return 1

So I'm confused, how could I do it, any known implementation which I could use? I can't find it, been looking for a while

3

There are 3 best solutions below

2
fuz On BEST ANSWER

The standard solution is to implement a && b as

if (a)
    return (b);
else
    return (0);

i.e. use a conditional jump. On sufficiently new x86, you can also use a cmov instruction like this:

; assumes input in eax and ebx
mov ecx, eax    ; ecx = A
test ebx, ebx   ; B?
cmovnz ecx, ebx ; ecx = A ? B : A
2
pts On

One way to do it is doing logical not twice on each input, and then doing a bitwise and (AND instruction).

6
Kolodez On

This is an answer without jumps: Assume you want to compute logical AND of RCX and RDX and store it in RAX and you may use RBX (note that called functions usually must preserve RBX!).

xorl %eax, %eax   # RAX = 0
xorl %ebx, %ebx   # RBX = 0
cmpq %rcx, %rbx   # CF = (RCX != 0)
adcb %bl, %al     # RAX = (RCX != 0)
cmpq %rdx, %rbx   # CF = (RDX != 0)
adcb %bl, %al     # RAX = (RCX != 0) + (RDX != 0)
shrb $1, %al      # RAX = ((RCX != 0) + (RDX != 0)) >> 1

Now RAX == 1 if and only if RCX != 0 and RDX != 0; otherwise, RAX == 0