Section
03 Part 03 – The OR Instruction |
“Because an appeal makes logical sense is no guarantee that it will work.” ~William Bernbach |
Introduction
OR – OR logical
This
instruction will perform OR logical between the source operand and destination
operand, the
result is saved to the destination operand.
So
what is OR logical?
Again,
we need to look at this from a broad perspective. Let us take two bits, one from the source operand and one from the destination operand, and perform OR logical:
source operand |
|
destination operand |
|
Result |
|
|
|
|
|
0 |
OR |
0 |
= |
0 |
0 |
OR |
1 |
= |
1 |
1 |
OR |
0 |
= |
1 |
1 |
OR |
1 |
= |
1 |
The
idea is that either one has to be 1 for the result to be 1. To understand why it’s called OR, pretend that 0 is referred to as “false” and 1 is referred
to as “true”. So let’s look at the table
again:
source operand |
|
destination operand |
|
Result |
|
|
|
|
|
False |
OR |
False |
= |
False |
False |
OR |
True |
= |
True |
True |
OR |
False |
= |
True |
True |
OR |
True |
= |
True |
The
description of this logic is; “If the source or the destination, or
both are true, then the result is true”, and that’s where the name originates.
Examples
So,
here is an example (we’ll pretend that d0 contains 01234567, just like the AND
example):
ori.b #$EC,d0 |
This
instruction will OR the byte EC
with the byte 67 inside d0. Since this is a binary instruction, EC and 67 in binary is 1110 1100 and 0110 0111.
EC |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
|
|
|
|
|
|
|
|
|
OR |
OR |
OR |
OR |
OR |
OR |
OR |
OR |
OR |
|
|
|
|
|
|
|
|
|
67 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
|
|
|
|
|
|
|
|
|
= |
= |
= |
= |
= |
= |
= |
= |
= |
|
|
|
|
|
|
|
|
|
EF |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
As
you can see in the table, either the source or the destination (or even both of them), must be set to 1 for the result to be 1.
EC OR 67 = EF
And so,
EF is saved into d0, d0 now contains 012345EF.
The
OR instruction can do (and not do) pretty much the same as the AND
instruction. For example, you can OR one
register to another:
or.w d0,d1 |
You
can OR on memory in various ways too:
ori.w #$07FF,$00004000 or.w d0,$00004000 or.l $00004000,d7 |
And
you can do it on memory using the address registers:
ori.w #$07FF,(a1) or.w d0,(a3) or.l (a6),d7 |
Just
like AND, you cannot do
things such as OR-ing from one memory directly to
another, or directly to an address register:
or.w $00020000,$0002004E ori.w #$3F10,a0 |
OR
Immediate
Again,
just like “add”, “sub” and “AND”. If the source operand is “immediate”, you must use the instruction “ori”
instead of “or”:
ori.w #$FC00,d0 |
Again,
don’t worry if you use “or” instead, as the assembler will turn it into “ori” for you, when it assembles your code.