LOGIC, SHIFT AND ROTATE INSTRUCTIONS • Syntax for AND, OR

advertisement
LOGIC, SHIFT AND ROTATE INSTRUCTIONS
• Syntax for AND, OR, XOR and TEST instructions
OpCode Destination Source
• They perform Boolean bitwise operations and store
the result into Destination
TEST is just an AND but the result is not stored. TEST
affects the flags just like AND does
• Both operands must be of the same type
Either byte, word or dword
• Operands cannot be both Mem
Again: Mem to Mem operations are forbidden
• They clear (i.e. put to 0) CF and OF
• They affect SF and ZF according to the result of the
operation (as usual)
Logic Instructions (Continued)
• The source is often an Imm operand called a bit mask:
used to fix certain bits to 0 or 1
• To clear a certain bit b we use an AND since
1. 0 AND b = 0
à b is cleared
2. 1 AND b = b
à b is conserved
Ex: to clear the sign-bit of AL without affecting the
others, we do: AND AL, 7Fh ;since 7Fh = 0111 1111b
• To set (i.e. six to 1) a certain bit we use an OR since
1. 1 OR b = 1
à b is set
2. 0 OR b = b
à b is conserved
Ex: to set the sign-bit of AH without affecting the
others, we do: OR AH, 80h ;since 80h = 1000 0000b.
To test if ECX = 0 we can do: OR ECX, ECX
Since this does not change the number in ECX and
sets ZF (=1) iff ECX= 0
Logic Instructions (Continued)
• XOR can be used to inverse certain bits
1. b AND 1 = NOT(b)
à b is complemented
2. b AND 0 = b
à b is conserved
• To initialize a register to 0 we can use
XOR AX, AX
1. Since b XOR b = 0 Ã b is cleared
2. This instruction uses only 2 bytes of space
3. The next instruction uses 3 bytes of space
MOV Ax, 0
4. Compilers prefer the XOR method
Logic Instructions (Continued)
• To convert from uppercase letter to lowercase letter
we can use the usual method
ADD DL, 20h
• But 20h = 0100 0000b and bit #5 is always 0 for
characters from ’A’ (41h) to ’Z’ (5Ah)
Uppercase
’A’ → ’Z’
⇓
41h → 5Ah
0
1
↓
0
0
X
X
Lowercase
’a’ → ’z’
⇓
61h → 7Ah
X
X
0
1
↓
1
0
⇓
0
1
0
↑
1
X
X
X
X
X
X
X
X
⇓
X
X
X
0
1
1
↑
1
X
• Hence, adding 20h gives the same result as setting
this bit #5 to 1. Thus
OR DL, 20h ;convert from uppercase to lowercase
AND DL, 0FDh ;convert from lowercase to uppercase
Since DFh = 1101 1111b
Logic Instructions (Continued)
• NOT Destination → inverts all the bits (one’s complement)
Does not affect any flag, and Destination cannot
be an Imm operand
• Recall that to perform two’s complement, we use
NEG Destination
1. Affect SF and ZF according to result
2. CF is set to 1 unless the result is 0
3. OF = 1 iff there is a signed overflow
• Exercise #1: Use only one instruction among AND, OR, XOR
and TEST to do the following task
1. Convert the ASCII code of a decimal digit (’0’ to ’9’) contained in AL to its numerical value
2. Set to 1 the odd numbered bits in EAX (i.e. the bits numbered
1,3,5 . . . ) without changing the even numbered bits
3. Clear to 0 the most significant bit (MSB) and the least
significant bit (LSB) of BH without changing the other bits.
4. Invert the LSB of EBX without changing the other bits
Shifting Bits to the Left
• SHL Destination, 1 → shifts one bit to the left
1. Each bit is shifted one position to the left
2. The LSB is cleared to 0
3. The MSB is moved to CF (so the previous content
of CF is lost)
4. Destination can be either byte, word or dword, and
Mem or Reg (for all shift and rotate instructions)
MOV BX, 80h ;BX = 0080h
SHL BL, 1
;BX = 0000h, CF = 1
;(only BL is affected)
• There are two forms of multiple left-shift
SHL Destination, CL
;CL contains number of shifts
SHL Destination, Imm8
Where Source should be CL or Imm8 (for all shift and
rotate instructions)
Shift’s Effects on Flags
• SF and ZF are affected according to result
• CF contains the last bit shifted out
MOV BH, 82h ;BH = 1000 0010b
SHL BH, 2
;BH = 0000 1000b, CF = 0
• Effect on OF for all (left and right) shift/rotate
1. For any single-bit shift/rotate: OF = 1 iff the
shift/rotate changes the sign-bit
2. For multiple-bit shift/rotate: OF is undefined
• Ex: Fast Multiplication
Each left-shift multiplies by 2 the operand for both
signed and unsigned interpretations
MOV
MOV
SHL
SHL
AX,
BX,
AX,
BX,
4
-1
2
3
;AX
;BX
;AX
;BX
=
=
=
=
0004h
FFFFh
0010h = 16
FFF8h = -8
Very fast. Factor your multiplier into powers of 2
1. BX * 36 = BX * (32 + 4) = BX*32 + BX*4
2. So add (BX shifted by 5) to (BX shifted by 2)
Shifting Bits to the Right
• To shift to the right, use either
SHR Destination, CL
;CL contains number of shifts
SHR Destination, Imm8
1. The MSB of Destination is cleared to 0
2. The LSB of Destination is moved into CF
• Each single-bit right-shift divides the unsigned value
by 2
MOV BH, 13 ;BH = 0000 1101b = 13
SHR BH, 2 ;Bh = 0000 0011b = 3 (div by 4), CF = 0
(The remainder of the division is lost)
Arithmetic Shift: SAR and SAL
• To divide a signed valued by 2, use either
SAR Destination, CL
;CL contains number of shifts
SAR Destination, Imm8
1. The MSB of Destination is filled with its previous
value (so the sign is preserved)
2. The LSB of Destination is moved into CF
MOV AH, -15 ;AH = 1111 0001b
SAR AH, 2
;AH = 1111 1000b = -8
3. The result is rounded to the smallest integer (−8
instead of −7)
4. In contrast
SHR AH, 1 ;gives AH = 0111 1000b = 78h
5. SAL 6= SHR
• The arithmetic left-shift, SAL, is equivalent to the
logical left-shift, SHL. That is they produce the same
result, for either signed or unsigned integer multiplication by two
Rotation without Carry Flag
• ROL Destination, Source → rotates bits to the left
CF gets a copy of the MSB
• ROR Destination, Source → rotates bits to the right
CF gets a copy of the LSB
• Destination should be Mem or Reg
• Source should be CL or Imm8
• CF reflects the action of the last rotate
Examples of ROL
MOV AH, 40h
;AH = 0100 0000b
ROL AH, 1
;AH = 1000 0000b
ROL AH, 1
;AH = 0000 0001b
ROL AH, 1
;AH = 0000 0010b
MOV AX, 1234h ;AX = 0001 0010 0011 0100b
ROL AX, 4
;AX = 2341h
ROL AX, 4
;AX = 3412h
ROL AX, 4
;AX = 4123h
Rotation with Carry Flag
• RCL Destination, Source → rotates to the left with
participation of CF
• RCR Destination, Source → rotates to the right with
participation of CF
• Destination should be Mem or Reg
• Source should be CL or Imm8
• CF reflects the action of the last rotate
• Inverting the content of AL
Ex: AL = 11000001b à AL = 10000011b
MOV ECX, 8 ;number of bits to rotate
start:
SHL AL, 1 ;CF = MSB of AL
RCR BL, 1 ;push CF into MSB of BL
LOOP start ;repeat for 8 bits
MOV AL, BL
;store result into AL
Exercise #2
• Give the hexadecimal content of AX immediately after the execution of each instruction below
(consider AX = B3CAh before each instruction)
1. SHL AL, 2 ;AX =
2. SAR AH, 2 ;AX =
3. ROR AX, 4 ;AX =
4. ROL AX, 3 ;AX =
5. SHL AL, 8 ;AX =
Application: Binary Output
• To display the binary number in EAX
MOV ECX, 32
;count 32 binary characters
start:
ROL EAX, 1
;CF gets MSB
JC one
;if CF = 1
MOV EBX, ’0’
JMP display
one:
MOV EBX, ’1’
display:
PUTCH EBX
LOOP start
Application: Binary Input
• To load EAX with the numerical value of a binary
string (ex: 101100101. . . ) entered at the keyboard
XOR EBX, EBX ;clear EBX to hold entry
next:
GETCH
CMP EAX, 10 ;EOLN reached?
JE exit
;yes! then exit
AND AL, 0Fh ;no! then convert to binary value
SHL EBX, 1
;make room for new value
OR BL, AL ;put value in LSB of BL
JMP next
exit:
MOV EAX, EBX ;EAX holds binary value
• In AL we have either 30h or 31h (ASCII code of ’0’
and ’1’)
• Hence, AND AL, 0Fh converts AL to either 0h or 1h
• Hence, OR BL, AL possibly changes only the LSB of
BL
Algorithms for Hexadecimal Input/Output
• To display EAX’s content in hexadecimal
Repeat 8 times
ROL EAX, 4
;the 4LSB gets the 4MSB of EAX
MOV DL, AL
AND DL, 0Fh ;DL contains numeric value of
;4LSB of AL
If DL < 10 then
Convert to ’0’ ... ’9’
Else
Convert to ’A’ ... ’F’
End Repeat
• To load EAX with numerical value of the hexadecimal
string entered at the keyboard
XOR EBX, EBX ;EBX will hold result
While (Input char 6= <CR>) Do
Convert Char into numerical Value
Left-shift EBX by 4 bits
Insert Value into 4LSB of EBX
End While
MOV EAX, EBX
• The complete ASM code is left to the reader
Download