During the previous week I found out some tricks and tips in assembly, and thought of sharing them in this brief post. I hope you will find these useful. I used NASM compiler to compile these codes.
Clearing a register:
Suppose you want to clear the ax register. XOR’ing it with itself will set all the bits in the register to zero.
xor ax, ax
Printing a single character on screen:
The interrupt 0x10 will print a given character on screen. The following code can be used to print a single character on screen.
mov al, '@' ; character or the ASCII code of the character to be printed mov ah, 0x0e ; video – teletype output int 0x10
Extracting some bits from a register:
Suppose you want to extract bits 3 and 4 of the AX register, and then print the decimal value on screen. The following code can be used to achieve this.
‘AND’ the register with a binary number which contains 1’s in the bit positions you want to extract. For our example it would be 0b0000000000011000 or 0x0018 (in hexadecimal). Then shift it right until our bits are the right-most bits. Then add 4b to it to get the ASCII number (ASCII value of ‘0’ is 48)
and ax, 0x0018 ; mask out bits 3 – 4 shr ax, 3 ; shift it right 3 times add ax, 48 ; add 48 to get ASCII character mov ah, 0x0e ; print it int 0x10
Remember the above code will work only if you are going to print values less than 9. If you want to convert a value more than 9 to decimal this will not work (I hope you understand why it doesn’t work 😉 ).
Printing out a register in binary:
For most of our debugging work, we will need to print the contents of a register in binary format. The following code can be used to print the contents of the CX register.
_print_reg: ;print the CX reg push dx ; save registers dx,ax,bx push ax push bx mov dx, cx mov cx, 16 ; loop for 16 times print_loop: mov ax, 32768 ; set ax = ob1000.... and ax, dx ; mask out the MSB of dx and store it in ax shr ax, 15 ; shift it to right 15 times add al, 48 ; add 48 to get the ASCII (would be either 0 or 1 mov ah, 0x0e int 0x10 ; print it out shl dx, 1 ; shift left dx by 1 loop print_loop pop bx; ; restore the registers pop ax pop dx ret
Hope these few tips will be helpful. That’s all for now