最后,就是在AP1和AP2上各自运行的两个用户进程了。
这两个用户进程的功能极度简单,就是调用BSP安装的0x80号系统调用,在指定的位置显示指定的字符而已:
task1.asm的代码:
;===============================================================================
;=== 该处开始用户代码 ===
;===============================================================================
SECTION task1 vstart=0x0
[bits 32]
print_letter dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
debug_caller dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
_sleep:
mov ebx, show_str
mov eax, 396
mov ecx, show_str
int 0x80
mov ebx, show_str
add ebx, 0
mov al, [ebx]
inc al
cmp al, '9'
jb _1
mov al, '0'
_1:
mov [ebx], al
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jmp _sleep
;----------------------------- 全局变量定义 ----------------------------------
align 4
show_str db "0", 0x0, 0x0 ,0x0
;-------------------------------------------------------------------------------
SECTION core_trail
;-------------------------------------------------------------------------------
core_end:
task2.asm的代码:
;===============================================================================
;=== 该处开始用户代码 ===
;===============================================================================
SECTION task2 vstart=0x0
[bits 32]
print_letter dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
debug_caller dd 0x0 ;偏移(不用)
dw 0x0 ;选择子
_sleep:
mov ebx, show_str
mov eax, 556
mov ecx, show_str
int 0x80
mov ebx, show_str
add ebx, 0
mov al, [ebx]
inc al
cmp al, 'Z'
jb _1
mov al, 'A'
_1:
mov [ebx], al
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jmp _sleep
;----------------------------- 全局变量定义 ----------------------------------
align 4
show_str db "A", 0x0, 0x0 ,0x0
;-------------------------------------------------------------------------------
SECTION core_trail
;-------------------------------------------------------------------------------
core_end:
以上就是本次多线程、多任务系统的全部代码,功能极度简单,整体也就是启动了三个线程,然后让每个线程都跑了起来。
俺的工作一直比较繁忙,晚上回到家还要带娃。对于编程也就是爱好,觉得看书调代码玩弄CPU比打游戏好玩多了,代码调通了还能有爽的感觉。
后面准备再研究一下如何通过汇编来做图,感觉这玩意儿能看得见,玩起来应该不枯燥。同时儿子也在学编程,给他做个榜样,别天天惦记着游戏,自己写个游戏比玩别人的游戏爽多了。