UMBC CMSC 211 |
A | B | A and B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
1011 1010 AND 0000 1111 0000 1010
1111 1111 AND 0000 1111 0000 1111
A | B | A or B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
1011 1010 OR 0000 1111 1011 1010
1111 1111 OR 0000 1111 0000 1111
A | B | A xor B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1011 1010 XOR 0000 1111 1011 0000
1111 1111 OR 0000 1111 1111 0000
A | not A |
---|---|
0 | 1 |
1 | 0 |
NOT 1011 1010 0100 0101
NOT 0000 1111 1111 0000
and/or/xor | reg/mem, reg/mem/constant |
not | reg/mem |
and | dest, source | ; dest := dest AND source |
or | dest, source | ; dest := dest OR source |
xor | dest, source | ; dest := dest XOR source |
not | dest | ; dest := NOT dest |
The and operation is used to clear bits and the or operation is used to set bits. The xor operation is used to toggle bits to the opposite set. The source is known as the mask for the operation.
AND,OR, XOR set the zero and sign flags according to the result and the overflow and carry flags are cleared.
The most common usage is to AND with a mask and then do a jz to determine if any of the bits corresponding to the mask were a 1. It is so common that they built a special instruction for it:
test | reg/mem, reg/mem/constant |
Bit | Mask | Interpretation |
---|---|---|
7 | 10000000B | Insert mode on |
6 | 01000000B | Caps lock on |
5 | 00100000B | Num lock on |
4 | 00010000B | Scroll lock on |
3 | 00001000B | Alt key down (either if more than one) |
2 | 00000100B | Ctrl key down (either if more than one) |
1 | 00000010B | Left shift key down |
0 | 00000001B | Right shift key down |
If the state is on (Insert mode is set) then the corresponding bit in the keyboard status will be true (1). Forunately for us, the BIOS does all the work to keep the keyboard status up-to-date.
Suppose that we are writing a program where we will do one thing if a certain key is pressed, but do something slightly different if the combination of Alt and a certain key is press. We will want to set a flag based on the Alt key and then proceed with the processing. We could do something like:
.MODEL | small | ||
.STACK | 100h | ||
ALTKEY | EQU | 00001000B | |
.DATA | |||
kbdStatus | DB | ? | |
altFlag | DB | 0 | ; Initialized to off |
.CODE | |||
example1 | PROC | ||
mov | ax, @data | ||
mov | ds, ax | ||
; | ... | ; Do something to get the keyboard status | |
mov | ax, kbdStatus | ||
and | ax, ALTKEY | ||
jne | noAlt | ||
mov | bx, 1 | ; Set the flag because the Alt key was pressed | |
mov | bx, altFlag | ||
noAlt: | |||
mov | al,0 | ||
mov | ah, 4ch | ||
int | 21h | ||
example1 | ENDP | ||
END | example1 | ||
year - 1900 | bits 9 - 15 (leftmost seven bits) |
month | bits 5 - 8 (January is 1) |
day | bits 0 - 4 (rightmost five bits) |
Now we can do the following:
.MODEL | small | ||
.STACK | 100h | ||
YEARMASK | EQU | 1111111000000000B | |
MONTHMASK | EQU | 0000000111100000B | |
DAYMASK | EQU | 0000000000011111B | |
.DATA | |||
modDate | DW | ? | ; The year is still in bits 9 - 15 |
funnyYear | DW | ? | ; The month is still in bits 5 - 8 |
funnyMonth | DW | ? | ; The day is in bits 0 - 4 and ; all other bits are off |
OKDay | DW | ? | |
.CODE | |||
example2 | PROC | ||
mov | ax, @data | ||
mov | ds, ax | ||
; | ... | ; Do something to get the ; modification date | |
mov | ax, modDate | ||
and | ax, YEARMASK | ||
mov | funnyYear, ax | ||
mov | ax, modDate | ||
and | ax, MONTHMASK | ||
mov | funnyMonth, ax | ||
mov | ax, modDate | ||
and | ax, DAYMASK | ||
mov | ax, OKDay | ||
; At this point, the values ; are not usualable yet | |||
mov | al,0 | ||
mov | ah, 4ch | ||
int | 21h | ||
example2 | ENDP | ||
END | example2 | ||