Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# Assembly logic and/or...

Posted on 2000-03-20
Medium Priority
384 Views
Would you please tell me are there instructions in Assembly I can use to logically and/or/xor two number?

I only know and or ...but they are bitwise.

Good Luck
0
Question by:ASH
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 2

LVL 4

Accepted Solution

nils pipenbrinck earned 75 total points
ID: 2635323
There are no logic binary operations in assembler.. you have to evaluate every single expression of your code... in most cases you can combine several expressions into one using binary logic.

AND-instructions must be evaluated for each expression while OR and XOR can be combined.. if you take a look at the examples below you'll get the point why..

here is one example where AND binary doesn't work:

int a = 16;
int b = 32;

if (a&&b)
{
// will be called because a && b is true... note: a&b would evaluate to zero!
blah();
}

that would translate into: (x86 code assumed) (remember: this is wrong code!)

mov eax, 16
mov ebx, 32
and eax, ebx
jnz .label
call blah
..label:

however, if you rewrite it this way it works:

if (a) if (b)
{
blah();
}

translated:

mov eax, 16
mov ebx, 32
test eax, eax
jz   .label1
test ebx, ebx
jz   .label1
call blah
..label:

for the logical or operation you can simply use the binary or since or preserves bits:

int a = 16;
int b = 32;

if (a||b)
{
blah();
}

translates nicely into:

mov eax, 16
mov ebx, 32
or  eax, ebx
jz  .label1
call blah
..label1:

Logical or operations can always be evaluated using the binary or instruction (unless you do more arithmetics with the result.. see below)...

xor will always be evaluated binary.. there is no logical version of xor.

there are still some things to keep in mind: the compiler use a internal representation of the "true" state..

for example:

int a = 2;
int b = 2;
printf ("%d\n", (a&&b)|1);

this will print a 1, not a 3 because (a&&b) evaluates to true which is 0x01.. (I'm not 100% sure if it depends on the compiler).

if you have code that does such bad things you have to use the 1 for logical arithmetics in your assembly code.

mov ecx, 0
mov eax, 2
mov ebx, 2
test eax, eax
jz   .label1
mov  ecx, 1
..label1:
test ebx, ebx
jz   .label2
mov  ecx, ecx
..label2:

; now the or-part:
or   ecx, 1
push ecx
call print_integer

I hope this helped,
Nils
0

LVL 4

Expert Comment

ID: 2635330
ehm. the last example was incorrect..

try this one..

; ecx will hold the result:
mov ecx, 0
mov eax, 2
mov ebx, 2
test eax, eax
jz   .label1
mov  ecx, 1
..label1:
test ebx, ebx
jz   .label2
mov  ecx, 1
..label2:

; now the or-part:
or   ecx, 1
push ecx
call print_integer

0

LVL 22

Expert Comment

ID: 2635709
Assembly is CPU-specific.  What CPU?

>> logically and/or/xor two number?
*   *   *
>> I only know and or ...but they are
>> bitwise.

logical and/or/xor doesn't apply to numbers, only to boolean (true/false) values.   Bitwise and/or/xor applies to numbers.  If you represent your boolean values with true as 1 and false as 0, then you use the bitwise operators to perform logical (boolean) evaluations.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
###### Suggested Courses
Course of the Month8 days, 21 hours left to enroll