2007年11月11日 星期日

OrzMicrokernel tasks.asm 尋找工作函式註解

Standard
到目前為止,從 Orz Microkernel 運作流程來看,我們已經看過主要的程式碼了,剩下的部份就只有些零零星星的函式和各種服務程式的實作。其中最重要的就是 Orz Microkernel 自訂的 IPC 訊息中斷服務(Message Service),該服務會運用到工作處理方面的函式,所以現在先將工作相關的函式註解補齊。

程式碼和詳細註解:
;------------------------------------------------------------------------------
; 尋找工作 FindTask
;;;; 輸入值: EAX = 工作編號 ID
;;;; 返回值:若進位旗標 CF=1 則表示找不到工作,否則 EAX = 工作狀態編號,EBP = 工作狀態指標
;;;; 會影響到的暫存器:EAX, ECX, ESI, EBP

FindTask:
mov ecx, [tasksCount] ; 設 ECX 為工作總數量
jecxz FindTask1 ; 若 ECX 為零,則跳到 FindTask1

mov esi, tasksList ; 設 ESI 為工作清單的記憶體位址

FindTask0:
movzx ebp, BYTE [esi] ; 從 ESI 取 2 Bytes(工作編號)到 EBP
imul ebp, s_task.msize ; EBP = EBP x s_task.msize
add ebp, tasks ; EBP = EBP + 工作狀態記錄所在記憶體位址

cmp eax, [ebp + s_task.taskID] ; 若 EAX = s_task.taskID 則零值旗標 ZF = 0
jz FindTask2 ; 若零值旗標 ZF = 0 則跳到 FindTask2

inc esi ; ESI 加一
loop FindTask0 ; 迴圈 ECX 次,繼續尋找工作

FindTask1:
stc ; 設進位旗標 CF = 1
ret

FindTask2:
mov eax, esi ; 設 EAX 為 ESI
sub eax, tasksList ; EAX = EAX - tasksList
clc ; 設進位旗標 CF = 0



後記

下星期要期中考,忙裡偷閒來看一下 Orz Microkernel 的 Source Code :)

另外補充,下星期四﹝11/15﹞是我的生日。唉,又要老一歲了。