谁有ASM的TSR示范程序,望请赐教。谢谢!!

zss1638 2000-02-17 09:18:00
加精
zzyzzy@fhnet.cn.net
...全文
285 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
81739649 2001-11-11
  • 打赏
  • 举报
回复
可以发给我吗?
cs83@163.net
AntiMatter 2000-03-07
  • 打赏
  • 举报
回复
哇塞,好多高手喂,这些程式未免有些...
sodawater 2000-03-07
  • 打赏
  • 举报
回复
这是我的第一TSR程序
是DOS下的时间显示程序
可以按F11暂停显示
可以按F12退出内存
.286
.MODEL SMALL
.CODE
;-----------------------
CLOCK DB 11 DUP(?)
FLAG DB 00H
OLD1C LABEL DWORD
OLD1COFF DW ?
OLD1CSEG DW ?
OLD09 LABEL DWORD
OLD09OFF DW ?
OLD09SEG DW ?
BUSY DB 00H
ZJW_PSP DW ?
ZJW_EVB DW ?
FLAG1 DB 0
;-----------------------
NEW1C PROC FAR
CMP CS:[FLAG],0
JE ONE
THE: IRET
ONE: CMP CS:[FLAG1],1
JE THE
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DS
MOV CS:[FLAG],1
LEA SI,CLOCK
MOV AH,02H
INT 1AH
MOV AH,CH
MOV AL,CL
MOV CL,4
SHR CH,CL
OR CH,30H
MOV DS:[SI],CH
INC SI
MOV CH,AH
AND CH,0FH
OR CH,30H
MOV DS:[SI],CH
INC SI
MOV DL,3AH
MOV DS:[SI],DL
INC SI
MOV AH,AL
SHR AL,CL
OR AL,30H
MOV DS:[SI],AL
INC SI
MOV AL,AH
AND AL,0FH
OR AL,30H
MOV DS:[SI],AL
INC SI
MOV DS:[SI],DL
INC SI
MOV AH,DH
SHR DH,CL
OR DH,30H
MOV DS:[SI],DH
INC SI
MOV DH,AH
AND DH,0FH
OR DH,30H
MOV DS:[SI],DH
INC SI
MOV DL,5AH
MOV DS:[SI],DL
INC SI
MOV DL,4AH
MOV DS:[SI],DL
INC SI
MOV DL,57H
MOV DS:[SI],DL
LEA SI,CLOCK
PUSH ES
PUSH DI
MOV AX,008AH
MOV DI,AX
MOV AX,0B800H
MOV ES,AX
MOV CX,11
MOV AH,34H
DISP: PUSH CX
MOV AL,[SI]
INC SI
MOV CX,1
STOSW
POP CX
LOOP DISP
POP DI
POP ES
MOV CS:[FLAG],0
EXIT1:POP DS
POP SI
POP DX
POP CX
POP BX
POP AX
EXIT: IRET
NEW1C ENDP
NEW09 PROC FAR
CMP CS:BUSY,0
JE TWO
JMP CS:OLD09
TWO: PUSH AX
IN AL,060H
PUSH AX
IN AL,061H
OR AL,080H
OUT 061H,AL
AND AL,07FH
OUT 061H,AL
MOV AL,020H
OUT 020H,AL
POP AX
CMP AL,58H
JNE EXIT_NOT
PUSH ES
PUSH DS
PUSH BX
MOV BX,1CH*04H
XOR AX,AX
MOV ES,AX
MOV AX,CS:[OLD1COFF]
MOV ES:[BX],AX
MOV AX,CS:[OLD1CSEG]
MOV ES:[BX+2],AX
MOV BX,09H*04H
XOR AX,AX
MOV AX,CS:[OLD09OFF]
MOV ES:[BX],AX
MOV AX,CS:[OLD09SEG]
MOV ES:[BX+2],AX
MOV BX,1
MOV AX,CS:[ZJW_EVB]
MOV ES,AX
MOV WORD PTR ES:[BX],0
MOV AX,CS:[ZJW_PSP]
MOV ES,AX
MOV WORD PTR ES:[BX],0
POP BX
POP DS
POP ES
EXIT_NOT:
CMP AL,57H
JNE EXT
CMP CS:FLAG1,1
JNE EZ
MOV CS:FLAG1,0
JMP EXT
EZ: MOV CS:FLAG1,1
EXT: POP AX
JMP CS:OLD09
NEW09 ENDP
INIT: MOV AX,DS
DEC AX
MOV CS:[ZJW_PSP],AX
MOV BX,2CH
MOV AX,DS:[BX]
DEC AX
MOV CS:[ZJW_EVB],AX
PUSH CS
POP DS
MOV AX,351CH
INT 21H
LEA DX,NEW1C
CMP DX,BX
JE EX
MOV CS:OLD1CSEG,ES
MOV CS:OLD1COFF,BX
MOV AX,3509H
INT 21H
MOV CS:OLD09OFF,BX
MOV CS:OLD09SEG,ES
MOV AX,251CH
LEA DX,NEW1C
INT 21H
MOV AX,2509H
LEA DX,NEW09
INT 21H
LEA DX,PROMPT
MOV AH,09H
INT 21H

MOV AX,3100H
LEA DX,INIT
MOV CL,4
SHR DX,CL
ADD DX,11H
INT 21H
EX: MOV AH,4CH
INT 21H
PROMPT DB 0AH,0DH
DB 'CLOCKDISP ver 2.30'
DB 0AH,0DH,'H.S-Software Zhong Junwei copyright(c) 1997.1'
DB ' by Mr.Zjw'
DB 0AH,0DH
DB 'HotKey:F11 Is Pause Disp;F12 Is Exit System'
DB 0AH,0DH,'$'
END INIT
sodawater 2000-03-07
  • 打赏
  • 举报
回复
code segment
assume cs:code,ds:code
star:jmp init
;----------
old1caddr label dword
old1coff dw ?
old1cseg dw ?
old09addr label dword
old09off dw ?
old09seg dw ?
mcb_evb dw ?
mcb_psp dw ?
show db 1
count dw 0
time equ 3
;------------
new1ch proc far
pushf
call cs:[old1caddr]
cmp byte ptr cs:[show],0
je reten
push ax
push dx
mov ax,word ptr cs:[count]
cmp ax,18*time*60
jne next1
mov dx,3c4h
mov al,1
out dx,al
inc dx
in al,dx
or al,20h
out dx,al
mov byte ptr cs:show,0
jmp eend
next1:
add word ptr cs:[count],1
eend:
pop dx
pop ax
reten:
iret
new1ch endp
;-----------
new09h proc far
pushf
call cs:[old09addr]
push ax
push dx
cmp byte ptr cs:[show],1
je retun
mov dx,3c4h
mov al,1
out dx,al
inc dx
in ax,dx
and al,0dfh
out dx,al
mov byte ptr cs:show,1
retun:
mov word ptr cs:count,0
;----------
mov ah,02h
int 16h
and al,03h
cmp al,03h
jne endd
push es
push ds
push bx
;---------
mov bx,1ch*04h
xor ax,ax
mov es,ax
mov ax,cs:[old1coff]
mov es:[bx],ax
mov ax,cs:[old1cseg]
mov es:[bx+2],ax
mov bx,09h*04h
xor ax,ax
mov es,ax
mov ax,cs:[old09off]
mov es:[bx],ax
mov ax,cs:[old09seg]
mov es:[bx+2],ax
;------------
mov bx,1
mov ax,cs:[mcb_evb]
mov ds,ax
mov word ptr es:[bx],0
mov ax,cs:[mcb_psp]
mov es,ax
mov word ptr es:[bx],0
pop bx
pop ds
pop es
;------------
endd:
pop dx
pop ax
iret
new09h endp
;------------
init:
mov ax,ds
dec ax
mov cs:[mcb_psp],ax
mov bx,2ch
mov ax,ds:[bx]
dec ax
mov cs:[mcb_evb],ax
;----------
push cs
pop ds
mov dx,offset prompt
mov ah,09h
int 21h
;-----------
mov ax,351ch
int 21h
mov old1cseg,es
mov old1coff,bx
mov dx,offset new1ch
mov ax,251ch
int 21h
;--------------
mov ax,3509h
int 21h
mov old09seg,es
mov old09off,bx
mov dx,offset new09h
mov ax,2509h
int 21h
mov ax,3100h
mov dx,offset init
mov cl,4
shr dx,cl
add dx,11h
int 21h
prompt db 0ah,0dh
db 'jing saver ver 1.0'
db 0ah,0dh,'H.S-Software Zhong Jun Wei copyright(c) 1997.1'
db ' by Mr.Zjw'
db 0ah,0dh,'$'
code ends
end star
AntiMatter 2000-03-06
  • 打赏
  • 举报
回复
请发信给我,告诉我你需要的主题,我会发给你我的心得.



antimatter_c@sina.com
zlin 2000-03-06
  • 打赏
  • 举报
回复
一个键盘中断替换程序(学生时代的老东西了,借此换点本钱,hehe)

清单:

INTA00 EQU 20H
INTA01 EQU 21H
DATA SEGMENT
MESS DB 'THIS IS A 8259 INTERRUPT!',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,CS
MOV DS,AX
MOV DX,OFFSET INT_PROC
MOV AX,250BH
INT 21H
CLI
MOV DX,INTA01
IN AL,DX
AND AL,0FBH
OUT DX,AL
MOV BX,10
STI
L1: JMP L1
INT_PROC:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,09H
INT 21H
MOV DX,INTA00
MOV AL,20H
OUT DX,AL
SUB BX,1
JNZ NEXT
MOV DX,INTA01
IN AL,DX
OR AL,04H
OUT DX,AL
STI
MOV AH,4CH
INT 21H
NEXT: IRET
CODE ENDS
END START
Roy 2000-03-03
  • 打赏
  • 举报
回复
这是一个屏幕抓图程序
程序清单:
CSEG SEGMENT
ORG 100H
ASSUME CS:CSEG,DS:CSEG
counter db ?
psp_segment dw 0
wei db 'already installed!'
wei1 db 'off installed!'
right db 'THE PROGRAM IS NOW INSTALLED!'
right1 db 'PLEASE PRESS ALT+V TO SAVE THE PICTURE!'
handle dw ?
filename db 'c:\picture.000',0
oldint09 dd 0
DRAW PROC
pushf
call dword ptr cs:oldint09
push ax
mov ah,02h
int 16h
test al,08h
jz exit2
in al,60h
cmp al,2fh
jz begin
mov al,20h
out 20h,al
exit2:
pop ax
iret
begin:
mov al,20h
out 20h,al
push bx
push cx
push dx
push ds
sti
push cs
pop ds
mov ah,3ch
mov cx,0
lea dx,cs:filename
int 21h
jc error
mov cs:handle,ax
mov cs:[counter],3
mov dx,3ceh
mov al,4
out dx,al
mov ax,0a000h
mov ds,ax
next:mov dx,3cfh
mov al,cs:[counter]
out dx,al
xor dx,dx
mov ah,40h
mov bx,cs:handle
mov cx,38400
int 21h
jc exit
dec cs:[counter]
jge next
mov ax,0e07h
int 10h
exit:mov bx,cs:handle
mov ah,3eh
int 21h
mov dx,3ceh
mov al,3
out dx,al
inc dx
mov al,0
out dx,al
inc cs:[filename+14]
error:
pop ds
pop dx
pop cx
pop bx
pop ax
iret
DRAW ENDP
MAIN PROC FAR
mov ax,cs
mov ds,ax
mov psp_segment,ax
mov ax,3509h
int 21h
cmp byte ptr cs:[80h],0
je inst
cmp bx,178h
jne exit1
lds dx,es:oldint09
mov ax,2509
int 21h
push es
mov ax,es:[002ch]
mov es,ax
mov ah,49h
int 21h
pop es
mov ah,49h
int 21h
mov ax,cs
mov ds,ax
lea bp,wei1
mov ax,1300h
mov bx,001fh
mov cx,15
mov dx,0808h
int 10h
jmp exit1
inst:cmp bx,178h
jne setv
lea bp,wei
mov ax,1300h
mov bx,001fh
mov cx,18
mov dx,0808h
int 10h
exit1:
push cs
pop ds
mov ax,4c00h
int 21h
setv:push cs
pop ds
MOV WORD PTR CS:OLDINT09,BX
MOV WORD PTR CS:OLDINT09+2,ES
PUSH CS
POP DS
MOV DX,OFFSET DRAW
MOV AX,2509H
INT 21H
PUSH CS
POP ES
MOV AH,6
MOV AL,0
MOV CX,0
MOV DH,79
MOV DL,80
MOV BH,7
INT 10H
LEA BP,RIGHT
MOV AH,13H
MOV AL,0
MOV BH,0
MOV BL,1FH
MOV CX,29
MOV DH,8
MOV DL,8
INT 10H
LEA BP,RIGHT1
MOV AH,13H
MOV AL,0
MOV BH,0
MOV BL,1FH
MOV CX,39
MOV DH,10
MOV DL,8
INT 10H
MOV AX,3100H
MOV DX,60
INT 21H
iRET
; MOV AX,4C00H
; INT 21H
MAIN ENDP
CSEG ENDS
END MAIN
lzwei 2000-03-02
  • 打赏
  • 举报
回复
;come from intel.com

STAK SEGMENT STACK
DW 4096
STAK ENDS

DDATA SEGMENT
DDATA ENDS

EDATA SEGMENT
EDATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DDATA,ES:EDATA,SS:STAK
START:
MOV AX,0
MOV ES,AX
MOV SI,20H ;timer0 ISR vector address is stored here
MOV WORD PTR ES:[SI], OFFSET TIMER_0_ISR
MOV WORD PTR ES:[SI+2], SEG TIMER_0_ISR

MOV DX,0F804H ;set the prescale to 512 p.8-7
IN AX,DX
AND AX,0FE00h
OR AX,01Fh
OUT DX,AX

MOV DX,0F834H ;disable the counters p.10-21
MOV AL,10000000B
OUT DX,AL

MOV DX,0F043H ;counter 0 will read/write least sig dig
MOV AL,00110100B ;first, the most second,mode 2, binary p.10-25
OUT DX,AL


MOV DX,0F040H ;the prescale (FFH) and timer count (FFFF)
MOV AL,0ffH ;give a delay of 1/2 sec approximately p.10-26
OUT DX,AL ;must be written twice for least/most sig
OUT DX,AL ;count

MOV DX,0F834H
MOV AL,01000010B ;enable timers, connect them all to
;PSCLK, disable timers 1 & 2, enable 0 p.10-21
OUT DX,AL


MOV DX,0F021H ;OCW1: enable timer 1 interrupt p.9-25
IN AL,DX
AND AL,0FEH
OUT DX,AL

MOV AL,0 ;initialize SI and AL for the infinite loops
MOV SI,0
LOOP_FOREVER:
MOV DX,0B800H ;DS holds the screen offset for video output
MOV DS,DX
MOV AH,2 ;AH holds color code, 2 is green
ADD AL,1 ;add 1 to AL
AND AL,0FH ;convert AL for ASCII representation
OR AL,030H
MOV [DS:3974],AX ;output the character to screen
MOV CX,0FFFH ;create a wait loop of count FFFFFH
LOOP1:
PUSH CX
MOV CX,0FH
LOOP2:
LOOP LOOP2
POP CX
LOOP LOOP1
JMP LOOP_FOREVER


TIMER_0_ISR:
PUSH AX
PUSH DX
PUSH DS
PUSH ES

MOV DX,0B800H ;initialize SI and AL for the infinite loops
MOV DS,DX
ADD SI,1 ;add 1 to SI
AND SI,000FH ;convert SI for ASCII representation, notice that
OR SI,0430H ;the top byte holds 4 which represents the color red
MOV AX,SI
MOV [DS:3972],AX ;output the character to screen


MOV DX,0F020H
MOV AL,20H ;end of interrupt command for 8259 p.9-26
OUT DX,AL
POP ES
POP DS
POP DX
POP AX
IRET


CODE ENDS
END start
SCUM 2000-02-29
  • 打赏
  • 举报
回复
实模式下的TSR我想你已不需要了吧?
保护模式下的我可以寄给你。
如果要的话,请寄一个自己的asm case给我:
scum9@sohu.com
netmare 2000-02-26
  • 打赏
  • 举报
回复
作为一个tsr程序,首先要截获某个中断:
用ax=35xxh int 21h得到int xx的中断向量,保存这个中断向量
用ax=25xxh int 21h置中断向量为你的程序,在你的中断服务程序中处理后,调用原中断处理程序.
用ah=31h int 21h驻留退出
其实一个真正的tsr程序还要复杂的多,要判断本程序是否已经驻留,避免重复驻留.还要提供退出驻留的方法等,而且tsr程序要尽可能的小.
具体情况,我寄给你一个TSR的例子,慢慢研究吧.

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧