版權聲明:本文爲博主原創文章,遵循 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寫多線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.