我一开始没注意这个问题,只是通过陷阱门觉得很绕弯子,为何不在3级用户代码里直接调用write_char,今天自己写程序想用call调用代码段,才发现了大问题。我写了个类似于write_char的过程,代码如下:
dividing_line:
push %gs
pushl %ebx
pushl %ecx
movl $10,%ecx/*输出10个空格' '*/
movl $SCRN_SEL,%ebx
movw %bx,%gs
1: movl scr_loc,%ebx
shl $1,%ebx
movb $32,%gs:(%ebx)/*' '空格ASCII码*/
shr $1,%ebx
incl %ebx
cmpl $2000,%ebx
jb 2f
movl $0,%ebx
2: movl %ebx,scr_loc
loop 1b
popl %ecx
popl %ebx
pop %gs
ret
其功能为在屏幕上输出10个空格而已。简直和write_char几乎一样,只不过我指定了要输出的字符,不是通过ax获取罢了。还有一个不同就是我要通过call来调用dividing_line,而不是像write_char一样被陷阱门调用。