8080寫多線程

版權聲明:本文爲博主原創文章,遵循 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章