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

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