Did you know? You can build your own solar panels, saving $10,000’s off retail price? You have probably read about it or seen it on TV, but have you tried it yourself?

Click here to go to website

Click here to go to website

Click here to go to website

Still struggling to Write Articles, Submitting them to get Traffic, and make money? Brand new technology now allows you to now create 100's and even thousands of UNIQUE and readable articles out of just one main seed article - with just a few clicks of your mouse button... and then have them submitted to the top article directories on autopilot!

Click Here to go to website

Click Here to go to website

Click Here to go to website

Click Here to go to website

Click Here to go to website

Find out the owner of any cell phone or unlisted number. Results include name, address, carrier, and other details when available.

Click Here to go to website

Natural Bodybuilder Thumbs Nose At WeightLoss "Experts" Who Earn Fortunes On The

Sweat And Dreams Of Young Men & Women,And Finally Reveals The Simple Proven Science Of Fat Loss No One Else Will Tell You About...

Click Here to go to Burn the fat website

Click Here to go to Burn the fat website

Click Here to go to Burn the fat website

1. Write a program to swap every pair of bits in the AX register.

2. Give the value of the AX register and the carry flag after each of the following instructions.

stc

mov ax,

adc ah,

xor ah, al mov cl, 4 shr al, cl rcr ah, cl

3. Write a program to swap the nibbles in each byte of the AX register.

4. Calculate the number of one bits in BX and complement an equal number of least significant bits in AX.

HINT: Use the XOR instruction

5. Write a program to multiply two 32bit numbers and store the answer in a 64bit location.

6. Declare a 32byte buffer containing random data. Consider for this problem that the bits in these 32 bytes are numbered from 0 to 255. Declare another byte that contains the starting bit number. Write a program to copy the byte starting at this starting bit number in the AX register. Be careful that the starting bit number may not be a multiple of 8 and therefore the bits of the desired byte will be split into two bytes.

7. AX contains a number between 0-15. Write code to complement the corresponding bit in BX. For example if AX contains 6; complement the 6th bit of BX.

8. AX contains a non-zero number. Count the number of ones in it and store the result back in AX. Repeat the process on the result (AX) until AX contains one. Calculate in BX the number of iterations it took to

make AX one. For example BX should contain 2 in the following case: AX = 1100 0101 1010 0011 (input – 8 ones)

AX = 0000 0000 0000 1000 (after first iteration – 1 one)

AX = 0000 0000 0000 0001 (after second iteration – 1 one) STOP

Selective Bit Clearing

Another use of AND is to make selective bits ze ro in its destination operand. The source operand is loaded with a mask containing one at positions which are retain their old value and zero at positions which are to be zeroed. The effect of applying this operation on the destination with mask in the source is to clear the desired bits. This operation is called masking. For example if the lower nibble is to be cleared then the operation can be applied with F0 in the source. The upper nibble will retain its old value and the lower nibble will be cleared.

Selective Bit Setting

The operation can be used as a masking operation to set selective bits. The bits in the mask are cleared at positions which are to retain their values, and are set at positions which are to be set. For example to set the lower nibble of the destination operand, the operation should be applied with a mask of 0F in the source. The upper nibble will retain its value and the lower nibble will be set as a result.

56

Selective Bit Inversion

XOR can also be used as a masking operation to invert selective bits. The bits in the mask are cleared at positions, which are to retain their values, and are set at positions, which are to be inverted. For example to invert the lower nibble of the destination operand, the operand should be applied with a mask of 0F in the source. The upper nibble will retain its value and the lower nibble will be set as a result. Compare this with NOT which inverts everything. XOR on the other hand allows inverting selective bits.

Selective Bit Testing

AND can be used to check whether particular bits of a number are set or not. Previously we used shifting and JC to test bits one by one. Now we introduce another way to test bits, which is more powerful in the sense that any bit can be tested anytime and not necessarily in order. AND can be applied on a destination with a 1-bit in the desired position and a source, which is to be checked. If the destination is zero as a result, which can be checked with a JZ instruction, the bit at the desired position in the source was clear.

However the AND operation destroys the destination mask, which might be needed later as well. Therefore Intel provided us with another instruction analogous to CMP, which is non-destructive subtraction. This is the TEST instruction and is a non-destructive AND operation. It doesn’t change the destination and only sets the flags according to the AND operation. By checking the flags, we can see if the desired bit was set or cleared.

We change our multiplication algorithm to use selective bit testing instead of checking bits one by one using the shifting operations.

Example 4.3

01 ; 16bit multiplication using test for bit testing

02 [org 0x0100]

03 jmp start

04

05 multiplicand: dd 1300 ; 16bit multiplicand 32bit space

06 multiplier: dw 500 ; 16bit multiplier

07 result: dd 0 ; 32bit result

08

09 start: mov cl, 16 ; initialize bit count to 16

10 mov bx, 1 ; initialize bit mask

11

12 checkbit: test bx, [multiplier] ; move right most bit in carry

13 jz skip ; skip addition if bit is zero

14

15 mov ax, [multiplicand]

16 add [result], ax ; add less significant word

17 mov ax, [multiplicand+2]

18 adc [result+2], ax ; add more significant word

19

20 skip: shl word [multiplicand], 1

21 rcl word [multiplicand+2], 1 ; shift multiplicand left

22 shl bx, 1 ; shift mask towards next bit

23 dec cl ; decrement bit count

24 jnz checkbit ; repeat if bits left

25

26 mov ax, 0x4c00 ; terminate program

27 int 0x21

12 The test instruction is used for bit testing. BX holds the mask and in

every next iteration it is shifting left, as our concerned bit is now the

next bit.

22-24 We can do without counting in this example. We can stop as soon as

our mask in BX becomes zero. These are the small tricks that

assembly allows us to do and optimize our code as a result.

57

Inside the debugger observe that both the memory location and the mask in BX do not change as a result of TEST instruction. Also observe how our mask is shifting towards the left so that the next TEST instruction tests the next bit. In the end we get the same result of 0009EB10 as in the previous example.