Section
03 Part 01 – The NOT Instruction |
“I see the player piano as the grandfather of the computer, the ancestor of the entire nightmare we live in, the birth of the binary world where there is no option other than yes or no and where there is no refuge.” ~William Gaddis |
Introduction
NOT – logical complement
This
instruction will reverse all bits
of a destination
operand. Bits that are 0 become 1, and bits that are 1
become 0 (clear to set, set to clear).
Examples
The
first thing that was explained in Section 01 Part 01 was binary and data
sizes. As you should know, bits are in
one of two states, 0 or 1, the purpose of this instruction is to change the
bits to the opposite setting, effectively reversing the result.
Here
is an example:
not.b d0 |
The destination operand is d0; now let’s say d0
contains FE800174, since the instruction has .b for byte, only the end byte is
altered (you should know this by now). The
end byte is 74, to understand how it works; we need to look at that value in
binary.
74 is
0111 0100 in binary:
0111 0100 |||| |||| VVVV VVVV 1000 1011 |
As
you can see above, the bits that were 0 have been changed to 1, and the bits that
were 1 have been change to 0. 0111 0100
has changed to 1000 1011.
1000
1011 is 8B in hex, that final result is saved into d0, and d0 now contains
FE80018B.
This
instruction can be used on memory as well:
not.w $000048C0 |
This will
reverse the bits held in memory at offset 000048C0 and 000048C1:
Offset |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
000048B0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
11 |
000048C0 |
22 |
35 |
78 |
88 |
90 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
000048D0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
43 |
F8 |
8F |
EE |
CC |
C0 |
00 |
000048E0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
etc |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
So
the word loaded is 2235, in binary that’s 0010 0010
0011 0101, the NOT instruction will reverse the bits, resulting in:
0010 0010 0011 0101 |||| |||| |||| |||| VVVV VVVV VVVV VVVV 1101 1101 1100 1010 |
1101 1101 1100 1010 in hex is DDCA, and is saved back into
memory:
Offset |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
000048B0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
11 |
000048C0 |
DD |
CA |
78 |
88 |
90 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
000048D0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
43 |
F8 |
8F |
EE |
CC |
C0 |
00 |
000048E0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
etc |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This
can be used on memory via address registers too:
not.w (a0) not.b $0B(a0) not.l (a0)+ |
It cannot be used on address
registers directly though:
not.w a0 |