版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gyx2545965/article/details/2047404
;定义了两个宏!!
TIMEOFF macro
in al,21h
and al,0feh
or al,01
out 21h,al
endm
TIMEON macro
in al,21h
and al,0feh
out 21h,al
endm
DATAS SEGMENT
spmain dw ?
ssmain dw ?
spsub1 dw ?
sssub1 dw ?
spsub2 dw ?
sssub2 dw ?
spsub3 dw ?
sssub3 dw ?
spsub4 dw ?
sssub4 dw ?
spsub5 dw ?
sssub5 dw ?
spcst dw ?
sscst dw ?
task_cur db 0
issuspend db 1fh ;检测任务状态!低5位对应5个任务,为1代表就绪,为0代表挂起!!第六个切换任务任何时候都运行
cur_input db 0 ;当前输入任务,只有当前输入任务是正在运行的任务,那么此任务才有输入功能!
input_task db 0 ;为1代表当前为输入状态
count1 dw ? ;记录每秒任务1运行的次数!
count2 dw ? ;记录每秒任务2运行的次数!
count3 dw ? ;记录每秒任务3运行的次数!
count4 dw ? ;记录每秒任务4运行的次数!
count5 dw ? ;记录每秒任务5运行的次数!
count dw 0 ;记录ppp的运行次数,预设滴答为364/s,固20次调用一次系统时间中断!
ccount dw 0 ;0-20
change dw 0 ;
sign_out db 0;1为退出信号
infor1 db 'Task1 is running!',0ah,0dh,'$'
infor2 db 'Task2 is running!',0ah,0dh,'$'
infor3 db 'Task3 is running!',0ah,0dh,'$'
infor4 db 'Task4 is running!',0ah,0dh,'$'
infor5 db 'Task5 is running!',0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
dw 99 dup(?)
smain dw ?
dw 99 dup(?)
ssub1 dw ?
dw 99 dup(?)
ssub2 dw ?
dw 99 dup(?)
ssub3 dw ?
dw 99 dup(?)
ssub4 dw ?
dw 99 dup(?)
ssub5 dw ?
dw 99 dup(?)
scst dw ?
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,stacks
mov ss,ax
mov sp,offset smain
;此处输入代码段代码
push ds
mov dx,offset addtask ;设置新增任务函数
mov ax,cs
mov ds,ax
mov ah,25h ;设置中断
mov al,82h
int 21h
pop ds
;通过以下方式注册5个函数!!
pushf
push cs
call sub1
pushf
push cs
call sub2
pushf
push cs
call sub3
pushf
push cs
call sub4
pushf
push cs
call sub5
pushf
push cs
call cst
;所有函数注册完毕!
mov ah,35h ;获得原来旧的时钟中断向量
mov al,1ch
int 21h
push es ;进嶘保护
push bx
cli ;屏蔽中断
mov dx,bx
push ds
mov ax,es
mov ds,ax
mov ah,25h
mov al,81h
int 21h
mov dx,offset ppp ;设置新的时钟中断向量
mov ax,cs
mov ds,ax
mov ah,25h
mov al,1ch
int 21h
pop ds
in al,21h ;设置掩码
and al,0feh
out 21h,al
sti
;主函数任务完成
_main01:
mov al,sign_out
cmp al,0
je _main01
pop dx ;恢复原来的中断向量
pop ds
mov ah,25h
mov al,1ch
int 21h
MOV AH,4CH
INT 21H
ret
;功能没有加上!
show proc near
ret
show endp
;以下函数在调度的过程中有多余的部分,对这个任务来说的!
ppp proc far ;任务调度函数
push ds
push es
push bp
push di
push si
push dx
push cx
push bx
push ax
mov ax,datas
mov ds,ax
;清切换任务标志
mov ax,0
mov change,0
mov al,sign_out
cmp al,1
je _tomain
;任务执行计数
mov ax,ccount
inc ax
cmp ax,19
jg _ac
mov ccount,ax
jmp _ab
_ac:mov ax,0
mov ccount,ax
int 81h ;调用原来的时间中断
_ab:
mov ax,count
inc ax
cmp ax,363
jg _ae;ax>363
mov count,ax
jmp _ad
_ae:;负责显示count清零;
call show ;show 负责显示每秒运行的情况!
mov ax,0
mov count,ax
mov count1,ax
mov count2,ax
mov count3,ax
mov count4,ax
mov count5,ax
;下面进入任务切换的主要部分!
_ad:
mov al,task_cur ;检测当前运行的任务
cmp al,1
je _a1
cmp al,2
je _a2
cmp al,3
je _a3
cmp al,4
je _a4
cmp al,5
je _a5
cmp al,6 ;切换任务
je _a6
cmp al,0 ;main ;当前任务是0,代表此时是从主函数跳过来的!
je _a7
;不属于以上任何一种任务,非法,退出
mov ax,4c00h
int 21h
_a1:mov spsub1,sp ;保存堆栈指针
_b1:
mov al,issuspend
mov bl,2
and al,bl
jz _b2
mov al,input_task
mov bl,2
and al,bl
jz _c1 ; 不为1,可以切换
mov al,cur_input ;
cmp al,2 ;当前输入窗口是2号任务
jne _b2 ;
_c1:
mov ax,spsub2
mov sp,ax
mov ax,count2
inc ax
mov count2,ax
mov al,2
mov task_cur,al
jmp _exit
_a2:mov spsub2,sp
_b2:
mov al,issuspend
mov bl,4
and al,bl
jz _b3
mov al,input_task
mov bl,4
and al,bl
jz _c2 ; 不为1,可以切换
mov al,cur_input ;
cmp al,3 ;当前输入窗口是3号任务
jne _b3 ;
_c2:
mov ax,spsub3
mov sp,ax
mov ax,count3
inc ax
mov count3,ax
mov al,3
mov task_cur,al
jmp _exit
_a3:mov spsub3,sp
_b3:
mov al,issuspend
mov bl,8
and al,bl
jz _b4
mov al,input_task
mov bl,8
and al,bl
jz _c3 ; 不为1,可以切换
mov al,cur_input ;
cmp al,4 ;当前输入窗口是4号任务
jne _b4 ;
_c3:
mov ax,spsub4
mov sp,ax
mov ax,count4
inc ax
mov count4,ax
mov al,4
mov task_cur,al
jmp _exit
_a4:mov spsub4,sp
_b4:
mov al,issuspend
mov bl,16
and al,bl
jz _b5
mov al,input_task
mov bl,16
and al,bl
jz _c4 ; 不为1,可以切换
mov al,cur_input ;
cmp al,5 ;当前输入窗口是5号任务
jne _b5 ;
_c4:
mov ax,spsub5
mov sp,ax
mov ax,count5
inc ax
mov count5,ax
mov al,5
mov task_cur,al
jmp _exit
_a5:mov spsub5,sp
_b5:
mov ax,spcst
mov sp,ax
mov al,6
mov task_cur,al
jmp _exit
;*------------------------------------
_tomain: ;退回主函数
mov al,0
mov task_cur,al
mov ax,spmain
mov sp,ax
jmp _exit
_a7:mov spmain,sp ;从主函数过来的
mov al,1
mov task_cur,al
mov ax,spsub1
mov sp,ax
jmp _exit
;*------------------------------------
_a6:mov spcst,sp
_b6:
mov al,issuspend
mov bl,1
and al,bl
jz _b1
mov al,input_task
mov bl,1
and al,bl
jz _c6 ; 不为1,可以切换
mov al,cur_input ;
cmp al,1 ;当前输入窗口是1号任务
jne _b1 ;
_c6:
mov ax,spsub1
mov sp,ax
mov ax,count1
inc ax
mov count1,ax
mov al,1
mov task_cur,al
_exit:
in al,20h
or al,20h
out 20h,al
pop ax
pop bx
pop cx
pop dx
pop si
pop di
pop bp
pop es
pop ds
iret
ppp endp
;加载任务的函数!
addtask proc far
;子任务初始化,自动返回主函数,bx第几号task调用?
push ds
push es
push bp
push di
push si
push dx
push cx
push bx
push ax
mov ax,datas
mov ds,ax
mov ax,bx
mov bx,04
mul bx
mov si,ax
mov ds:[si],sp ;保存堆栈指针
add si,2
mov ds:[si],ss
mov si,0
mov sp,ds:[si] ;更换堆栈指针
add si,2
mov ss,ds:[si]
iret
addtask endp
;------------------以下是子任务部分----------------------------
;后台任务!
cst proc near ;
MOV AX,DATAS
MOV DS,AX
mov di,0
mov [di],sp
add di,2
mov [di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset scst
mov bx,6
int 82h
mov ax,0
mov change,ax
_af:
;mov al,2 ;test
;mov cur_input,al ;test
mov ax,change
cmp ax,1
je _af
mov ah,02h
cli
int 16h
sti
;mov bx,ax
and al,1100b ;+alt+ctrl
cmp al,1100b
jne _af
mov ax,1
mov change,ax
mov al,1
mov sign_out,al ;退出任务
jmp _af
ret
cst endp
;子任务1;
sub1 proc near
MOV AX,DATAS
MOV DS,AX
mov di,0
mov ds:[di],sp
add di,2
mov ds:[di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset ssub1
mov bx,1
int 82h
;在这里输入你的任务1代码
_sub101:
mov ah,09
mov dx,offset infor1
TIMEOFF
int 21h
TIMEON
jmp _sub101
ret
sub1 endp
sub2 proc near
MOV AX,DATAS
MOV DS,AX
mov di,0
mov [di],sp
add di,2
mov [di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset ssub2
mov bx,2
int 82h
;在这里输入你的任务2代码
_sub201:
mov ah,09
mov dx,offset infor2
TIMEOFF
int 21h
TIMEON
jmp _sub201
ret
sub2 endp
sub3 proc near
MOV AX,DATAS
MOV DS,AX
mov di,0
mov [di],sp
add di,2
mov [di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset ssub3
mov bx,03
int 82h
;在这里输入你的任务3代码
_sub301:
mov ah,09
mov dx,offset infor3
TIMEOFF
int 21h
TIMEON
jmp _sub301
ret
sub3 endp
sub4 proc near
MOV AX,DATAS
MOV DS,AX
mov di,0
mov [di],sp
add di,2
mov [di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset ssub4
mov bx,4
int 82h
;在这里输入你的任务4代码
_sub401:
mov ah,09
mov dx,offset infor4
TIMEOFF
int 21h
TIMEON
jmp _sub401
ret
sub4 endp
sub5 proc near
MOV AX,DATAS
MOV DS,AX
mov di,0
mov [di],sp
add di,2
mov [di],ss
mov ax,stacks
mov ss,ax
mov sp,ss:offset ssub5
mov bx,5
int 82h
;在这里输入你的任务5代码
_sub501:
mov ah,09
mov dx,offset infor5
TIMEOFF
int 21h
TIMEON
jmp _sub501
ret
sub5 endp
CODES ENDS
END START
————————————————
版权声明:本文为CSDN博主「gyx2545965」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gyx2545965/article/details/2047404
8080写多线程
最新推荐文章于 2022-06-14 10:02:05 发布