📄 multi.asm
字号:
; Simple program to demonstrate the use of multitasking.
.xlist
include stdlib.a
includelib stdlib.lib
.list
dseg segment para public 'data'
ChildPID word 0
BackGndCnt word 0
; PCB for our background process:
BkgndPCB pcb {0,offset EndStk2, seg EndStk2}
; Data buffer to hold an input string.
InputLine byte 128 dup (0)
dseg ends
cseg segment para public 'code'
assume cs:cseg, ds:dseg
; A replacement critical error handler. This routine calls prcsquit
; if the user decides to abort the program.
CritErrMsg byte cr,lf
byte "DOS Critical Error!",cr,lf
byte "A)bort, R)etry, I)gnore, F)ail? $"
MyInt24 proc far
push dx
push ds
push ax
push cs
pop ds
Int24Lp: lea dx, CritErrMsg
mov ah, 9 ;DOS print string call.
int 21h
mov ah, 1 ;DOS read character call.
int 21h
and al, 5Fh ;Convert l.c. -> u.c.
cmp al, 'I' ;Ignore?
jne NotIgnore
pop ax
mov al, 0
jmp Quit24
NotIgnore: cmp al, 'r' ;Retry?
jne NotRetry
pop ax
mov al, 1
jmp Quit24
NotRetry: cmp al, 'A' ;Abort?
jne NotAbort
prcsquit ;If quitting, fix INT 8.
pop ax
mov al, 2
jmp Quit24
NotAbort: cmp al, 'F'
jne BadChar
pop ax
mov al, 3
Quit24: pop ds
pop dx
iret
BadChar: mov ah, 2
mov dl, 7 ;Bell character
jmp Int24Lp
MyInt24 endp
; We will simply disable INT 23h (the break exception).
MyInt23 proc far
iret
MyInt23 endp
; Okay, this is a pretty weak background process, but it does demonstrate
; how to use the Standard Library calls.
BackGround proc
sti
mov ax, dseg
mov ds, ax
inc BackGndCnt ;Bump call Counter by one.
yield ;Give CPU back to foregnd.
jmp BackGround
BackGround endp
Main proc
mov ax, dseg
mov ds, ax
mov es, ax
meminit
; Initialize the INT 23h and INT 24h exception handler vectors.
mov ax, 0
mov es, ax
mov word ptr es:[24h*4], offset MyInt24
mov es:[24h*4 + 2], cs
mov word ptr es:[23h*4], offset MyInt23
mov es:[23h*4 + 2], cs
prcsinit ;Start multitasking system.
lesi BkgndPCB ;Fire up a new process
fork
test ax, ax ;Parent's return?
je ParentPrcs
jmp BackGround ;Go do backgroun stuff.
ParentPrcs: mov ChildPID, bx ;Save child process ID.
print
byte "I am timing you while you enter a string. So type"
byte cr,lf
byte "quickly: ",0
lesi InputLine
gets
mov ax, ChildPID ;Stop the child from running.
kill
printf
byte "While entering '%s' you took %d clock ticks"
byte cr,lf,0
dword InputLine, BackGndCnt
prcsquit
Quit: ExitPgm ;DOS macro to quit program.
Main endp
cseg ends
sseg segment para stack 'stack'
; Here is the stack for the background process we start
stk2 byte 256 dup (?)
EndStk2 word ?
;Here's the stack for the main program/foreground process.
stk byte 1024 dup (?)
sseg ends
zzzzzzseg segment para public 'zzzzzz'
LastBytes db 16 dup (?)
zzzzzzseg ends
end Main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -