Top Banner
1 Logic, Shift, and Rotate Instructions Read Sections 6.2, 7.2 and 7.3 of textbook
22

Logic, Shift, and Rotate Instructions - Raw-D

Mar 13, 2023

Download

Documents

Khang Minh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Logic, Shift, and Rotate Instructions - Raw-D

1

Logic, Shift, and Rotate InstructionsRead Sections 6.2, 7.2 and 7.3 of textbook

Page 2: Logic, Shift, and Rotate Instructions - Raw-D

2

Logic Instructions

Syntax for AND, OR, XOR, and TEST instructions:op-code destination, source

They perform the Boolean bitwise operation 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 typeeither byte, word or dword

Both operands cannot be mem again: mem to mem operations are forbidden

They clear (ie: put to zero) CF and OFThey affect SF and ZF according to the result of the operation (as usual)

Page 3: Logic, Shift, and Rotate Instructions - Raw-D

3

Logic Instructions (cont.)

The source is often an imm operand called a bit mask: used to fix certain bits to 0 or 1To clear a bit we use an AND since:

0 AND b = 0 (b is cleared)1 AND b = b (b is conserved)

Ex: to clear the sign bit of AL without affecting the others, we do:

AND al,7Fh ;msb of AL is cleared

since 7Fh = 0111 1111b

Page 4: Logic, Shift, and Rotate Instructions - Raw-D

4

Logic Instructions (cont.)

To set (i.e: fix to 1) certain bits, we use OR:1 OR b = 1 (b is set)0 OR b = b (b is conserved)

To set the sign bit of AH, we do:OR ah,80h

To test if ECX=0 we can do:OR ecx,ecx

since this does not change the number in ECX and set ZF=1 if and only if ECX=0

Page 5: Logic, Shift, and Rotate Instructions - Raw-D

5

Logic Instructions (cont.)

XOR can be used to inverse certain bits:b XOR 1 = NOT(b) (b is complemented)b XOR 0 = b (b is conserved)

Ex: to initialize a register to 0 we can use: XOR ax,ax

Since b XOR b = 0 (b is cleared)This instruction uses only 2 bytes of space.The next instruction uses 3 bytes of space:MOV ax,0

Compilers prefer the XOR method

Page 6: Logic, Shift, and Rotate Instructions - Raw-D

6

Logic Instructions (cont.)*

To convert from upper case letter to lower case we can use the usual method:

ADD dl,20h

But 20h = 0010 0000b and bit #5 is always 0 for chars from ‘A’ (41h) to ‘Z’ (5Ah). Uppercase (41h-5Ah) A-Z Lowercase (61h-Ah) a-z

4X 0 1 0 0 X 6X 0 1 1 0 X5X 0 1 0 1 X 7X 0 1 1 1 X

Hence, adding 20h gives the same result as setting this bit #5 to 1. Thus:

OR dl,20h ;converts from upper to lower caseAND dl,0DFh;converts from lower to upper case

since DFh = 1101 1111b

Page 7: Logic, Shift, and Rotate Instructions - Raw-D

7

Logic Instructions (cont.)

To invert all the bits (ones complement), we use:NOT destination

does not affect any flag and destination cannot be an imm operand

Recall that to perform twos complement, we useNEG destination

affect SF and ZF according to resultCF is set to 1 unless the result is 0OF=1 iff there is a signed overflow

Page 8: Logic, Shift, and Rotate Instructions - Raw-D

8

Exercise 1

Use only one instruction among AND, OR, XOR, and TEST to do the following task:

(A) Convert the ASCII code of a decimal digit ('0‘ to '9‘) contained in AL to its numerical value.(B) Fix to 1 the odd numbered bits in EAX (ie: the bits numbered 1, 3, 5…) without changing the even numbered bits.(C) Clear to 0 the most significant bit and the least significant bit of BH without changing the other bits.(D) Inverse the least significant bit of EBX without changing the other bits.

Page 9: Logic, Shift, and Rotate Instructions - Raw-D

9

Shifting Bits to the Left

To shift 1 bit to the left we use:SHL dest,1

each bit is shifted one position to the leftthe lsb (least significant bit) is filled with 0the msb (most significant bit) is moved into CF (so the previous content of CF is lost)dest can be either byte, word or dword

Example:mov bx, 80h ; BX = 0080hshl bl, 1 ; BX = 0000h, CF=1 (only BL is affected)

Page 10: Logic, Shift, and Rotate Instructions - Raw-D

10

Shifting Multiple Times to the LeftTwo forms are permitted:

SHL dest, CL ; CL = number of shiftsSHL dest, imm8

SHL affects SF and ZF according to the resultCF contains the last bit shifted out

mov bh, 82h ;BH = 1000 0010bshl bh, 2 ;BH = 0000 1000b, CF=0

Effect on OF for all shift and rotate instructions (left and right):

For any single-bit shift/rotate: OF=1 iff the shift or rotate changes the sign bitFor multiple-bit shift/rotate: the effect on OF is undefinedHence, sign overflows are signaled only for single-bit shifts and rotates

Page 11: Logic, Shift, and Rotate Instructions - Raw-D

11

Fast Multiplication

Each left shift multiplies by 2 the operand for both signed and unsigned interpretations. Ex:

mov ax, 4 ;AX = 0004hmov bx, -1 ;BX = FFFFhshl ax, 2 ;AX = 0010h = 16shl bx, 3 ;BX = FFF8h = -8

Multiplication by shifting is very fast. Try to factor your multiplier into powers of 2:

BX * 36 = BX * (32 + 4) = BX*32 + BX*4So add (BX shifted by 5) to (BX shifted by 2)

Page 12: Logic, Shift, and Rotate Instructions - Raw-D

12

Shifting bits to the right

To shift to the right use either:SHR dest, CL ;value of CL = number of shiftsSHR dest, imm8

the msb of dest is filled with 0the lsb of dest is moved into CF

Each single-bit right shift divides the unsigned value by 2. Ex:

mov bh,13 ;BH = 0000 1101b = 13shr bh,2 ;BH = 0000 0011b = 3 (div by 4),CF=0

(the remainder of the division is lost)

Page 13: Logic, Shift, and Rotate Instructions - Raw-D

13

Arithmetic Shift SAR

Is needed to divide the signed value by 2:SAR dest, CL ;value of CL = number of shiftsSAR dest, imm8

the msb of dest is filled with its previous value (so the sign is preserved)the lsb of dest is moved into CFmov ah, -15 ;AH = 1111 0001bsar ah, 1 ;AH = 1111 1000b = -8

the result is rounded to the smallest integer (-8 instead of -7…)in contrast:shr ah, 1 ;gives ah = 0111 1000b = 78h

Page 14: Logic, Shift, and Rotate Instructions - Raw-D

14

Rotate (without the CF)

ROL rotates the bits to the left (same syntax)CF gets a copy of the msb

ROR rotates the bits to the right (same syntax)CF gets a copy of the lsb

CF reflect the action of the last rotate

Page 15: Logic, Shift, and Rotate Instructions - Raw-D

15

Examples of ROL

mov ah,40h ;ah = 0100 0000brol ah,1 ;ah = 1000 0000b, CF = 0rol ah,1 ;ah = 0000 0001b, CF = 1rol ah,1 ;ah = 0000 0010b, CF = 0

mov ax,1234h ;ax = 0001 0010 0011 0100brol ax,4 ;ax = 2341hrol ax,4 ;ax = 3412hrol ax,4 ;ax = 4123h

Page 16: Logic, Shift, and Rotate Instructions - Raw-D

16

Rotate with CF

RCL rotates to the left with participation of CF

RCR rotates to the right with participation of CF

Page 17: Logic, Shift, and Rotate Instructions - Raw-D

17

Ex: inverting the content of AL*

Ex: whenever AL = 1 1 0 0 0 0 0 1b we want to have

AL = 1 0 0 0 0 0 1 1b mov ecx, 8 ;number of bits to rotatestart:shl al, 1 ;CF = msb of ALrcr bl, 1 ;push CF into msb of BLloop start ;repeat for 8 bits

mov al, bl ;store result into AL

Page 18: Logic, Shift, and Rotate Instructions - Raw-D

18

Exercise 2

Give the binary content of AX immediately after the execution of the each instruction below (Consider that AX = 1011 0011 1100 1010b before each of these instructions):

(A) SHL AL,2 ; AX = (B) SAR AH,2 ; AX = (C) ROR AX,4 ; AX = (D) ROL AX,3 ; AX = (E) SHL AL,8 ; AX =

Page 19: Logic, Shift, and Rotate Instructions - Raw-D

19

Application: Binary Output

To display the binary number in EAX:

MOV ECX,32 ; count 32 binary charsSTART:ROL EAX,1 ;CF gets msbJC ONE ;if CF =1MOV EBX, ’0’JMP DISPONE: MOV EBX,’1’

DISP:PUTCH EBXLOOP START

Page 20: Logic, Shift, and Rotate Instructions - Raw-D

20

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 entrynext:getchcmp eax, 10 ;end of input line reached?je exit ;yes then exitand al, 0Fh ;no, convert to binary valueshl ebx, 1 ;make room for new valueor bl, al ;put value in ls bitjmp 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 1hHence, OR BL,AL possibly changes only the lsb of BL

Page 21: Logic, Shift, and Rotate Instructions - Raw-D

21

Algorithm for Hex Output

To display in hexadecimal the content of EAXRepeat 8 times {ROL EAX, 4 ;the ms 4bits goes into ls 4bitsMOV DL, ALAND DL, 0Fh ;DL contains num value of 4bits

If DL < 10 then convert to ‘0’..’9’else convert to ‘A’..’F’

} end Repeat

The complete ASM coding is left to the reader ☺

Page 22: Logic, Shift, and Rotate Instructions - Raw-D

22

Algorithm for Hex Input

To load EAX with the numerical value of the hexadecimal string entered at the keyboard:

XOR EBX, EBX ;EBX will hold resultWhile (input char != <CR>) DO {convert char into numerical valueleft shift EBX by 4 bitsinsert value into lower 4 bits of EBX

} end whileMOV EAX,EBX

The complete ASM coding is left to the reader ☺