TSR:
Terminate but Stay Resident Program is a type of assembly program which stays resident / or occupies memory on ram so that it can be executed upon interrupt.TSR is actually one of the best ways to ways to write viruses. The best part is that until the computer is restarted the virus can stay in the memory.
It consists of three sections:-
which you are supposed to find out.
Problem Statement in Layman Terms
You have to display the time on screen using a TSR.
Algorithm/Steps
Initialization
- First store the old cs:ip for interrupt.
- Second load new cs:ip for interrupt.
- Reserve memory in dos.
TSR execution
- Get the clock values.
- Set pointer to display ram.
- Print the values after converting them to ascii
- Jmp to old cs:ip
Code
.MODEL SMALL ;set the model to small .STACK 100H ;set stack size ORG 100H ;assembler directive for setting the beginning of the code segment CODE SEGMENT ;code segment begins ASSUME CS:CODE,DS:CODE,ES:CODE ;assigning logical name to segment OLD_IP DW 00 ;will be used to store the location of the orginal OLD_CS DW 00 ;address of interrupt vector JMP INIT ;jmp to init section MYTSR: PUSH AX ;push all the registers into stack PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH ES MOV AH,02H ;function two interrup 1Ah INT 1AH ;GET THE TIME FROM BIOS CHIP ;CH=HOURS,CL=MINS;DH=SECONDS ;stored in bcd format MOV AX,0B800H MOV ES,AX ;setting es to beginning of display ram MOV DI,3650 ;setting offset to use in display ram ;refer note 1 ;displaying hours now MOV BL,02H ;counter LOOP1: ;conversion from bcd to ascii ROL CH,4 MOV AL,CH AND AL,0FH ADD AL,30H MOV AH,17H ;refer note, static white on blue MOV ES:[DI],AX ;refer note INC DI INC DI DEC BL JNZ LOOP1 MOV AL,':' MOV AH,97H ;refer note ,blinking white on blue MOV ES:[DI],AX INC DI INC DI ;displaying minutes now MOV BL,02 LOOP2: ROL CL,04 MOV AL,CL AND AL,0FH ADD AL,30H MOV AH,17H MOV ES:[DI],AX INC DI INC DI DEC BL JNZ LOOP2 MOV AL,':' MOV AH,97H MOV ES:[DI],AX INC DI INC DI ;displaying the seconds now MOV BL,02 LOOP3: ROL DH,4 MOV AL,DH AND AL,0FH ADD AL,30H MOV AH,17H MOV ES:[DI],AX INC DI INC DI DEC BL JNZ LOOP3 POP ES ;pop in LIFO fashion POP DI POP SI POP DX POP CX POP BX POP AX JMP DWORD PTR CS:OLD_IP ;jump to old cs:ip INIT: ;THIS PORTION MAKES THE CODE RESIDENT MOV AX,CS MOV DS,AX ;initialize ds using cs value MOV AH,35H ;function 31 of int 21h MOV AL,08H ;store cs:ip for int8h INT 21H ;es:bx=cs:ip MOV OLD_CS,ES MOV OLD_IP,BX LEA DX,MYTSR ;load effective address for tsr MOV AH,25H ;function 25 of int21h MOV AL,08H ;store new cs:ip for int 8h INT 21H ;new cs:ip=ds:dx MOV DX,OFFSET INIT ;specifying the amount of memory requried ;for the resident portion of tsr MOV AH,31H ;function 31 of int21h STI ;set interrupt flag INT 21H ;interrupt CODE ENDS END
Note
1. The display ram starts at an 0B800h. This location refers to the first character on the first row of the screen. This display buffer is actually a 4000 byte buffer to display 2000 characters(25 rows * 80 cols) .So each character requires 2 bytes. The upper byte specifies the method in which the character should be displayed. While the lower byte is for ascii code.2. This upper byte has the following format
Bl BBB FFFF
where,
Bl =1 Blinking, else static
BBB=first 3 bits for background color, fourth bit assumed to be 0
FFFF=4 bits for background color
Colors
A nibble represent color IRGB
where
- I=Intensity
- R=Red
- G=Green
- B=Blue
So below is the color table
- 0000= Black
- 0001= Blue
- 0010= Green
- 0011= Cyan
- 0100= Red
- 0101=Magnetta
- 0110=Brown
- 0111=Light Gray
- 1000=Gray
- 1001=Light Blue
- 1010= Light Green
- 1100=Light Red
- 1101=Yellow
- 1111=White
How to run?
Steps for Ubuntu Linux
1.Install Dosbox.
sudo apt-get install dosbox
2.Paste Tasm compiler executables on /home/your_username
link for tasm :mediafire-TASM
extract it and paste in in home folder
3.Open dosbox
4.Fire the following commands
- mount c /home/your_username/TASM
- c:
- tasm clock.asm
- ld clock.obj
- clock.exe
Doubts
- For additional information feel free to google.
- In case you have any doubts feel free to bother yourself.
why not have a keyboard shortcut to kill it? Or if I try to run it again and its loaded... it unloads it?
ReplyDeleteThis comment has been removed by a blog administrator.
ReplyDelete