;By Marcus Xing
;boot/include/lib_in_protect_mode.inc
;在boot/loader.asm中保护模式下使用的函数
;------------------------------------------------------------------------Disp_Str
Disp_Str:
;C函数原型(保护模式模式下调用,短调用):
;void Disp_Str(const char *p_sz_Str);
;调用前gs必须指向显存段
push ebp
mov ebp,esp
push eax
push ebx
push edx
push esi
push edi
mov edi,[d_Disp_Pos_In_PM] ;edi为显示位置
mov esi,[ebp + 8] ;esi指向要打印的串
.1:
cmp byte [esi],0 ;判断串是否结束
je .3 ;结束就退出打印
cmp byte [esi],0ah ;判断是否是回车
jne .2 ;不是就打印
;修改edi值,跳转下一行的开始
mov eax,edi
xor edx,edx
mov ebx,160
div ebx
inc eax
mul ebx
mov edi,eax
inc esi
jmp .1 ;处理串下一个字符
.2:
mov ah,0fh ;黑底白字
mov al,[esi]
mov [gs:edi],ax ;写入显存
add edi,2
inc esi
jmp .1 ;处理下一个字符
.3:
mov [d_Disp_Pos_In_PM],edi ;把位置写回变量
call Cursor_Loc ;调用功能函数,光标跟随字符
pop edi
pop esi
pop edx
pop ebx
pop eax
pop ebp
ret
;-----------------------------------------------------------------------Disp_Int
;C函数原型(保护模式模式下调用,短调用):
;void Disp_Int(int i_int);
;把形参以32位整数16进制显示出来,最后加个h
;调用前gs必须指向显存段
Disp_Int:
push ebp
mov ebp,esp
push eax
push ecx
push edi
mov eax,[ebp + 8] ;要显示的数放到eax中
mov ecx,4 ;循环4次
.1:
rol eax,8 ;循环右移8位
call Disp_Al
loop .1
mov edi,[d_Disp_Pos_In_PM]
mov ah,7h ;黑底灰字
mov al,'h'
mov [gs:edi],ax
add edi,2
mov [d_Disp_Pos_In_PM],edi
call Cursor_Loc
pop edi
pop ecx
pop eax
pop ebp
ret
;------------------------------------------------------------------------Disp_Al
Disp_Al:
;C函数原型(保护模式模式下调用,短调用):
;void Disp_Str(byte al);
;调用前把欲显示的数字放到al中,以16进制打印出来
;调用前gs必须指向显存段
push esi
push ecx
push eax ;暂存eax
mov ecx,2 ;循环2次
shr al,4 ;把al高4位移到低4位
.3:
and al,0fh ;al高4位清零
cmp al,9 ;与9比较
jbe .1 ;小于等于9准备打印
add al,7 ;大于9的话则转化为字母
.1:
add al,30h
mov esi,[d_Disp_Pos_In_PM] ;esi为显示位置
mov byte [gs:esi],al
mov byte [gs:esi + 1],0fh ;黑底白字
add dword [d_Disp_Pos_In_PM],2 ;写入显存
dec ecx
cmp ecx,0 ;判断是否为0
je .2 ;是则退出函数
pop eax ;否则继续显示
jmp .3
.2:
pop ecx
pop esi
ret
;--------------------------------------------------------------------Disp_Return
;C函数原型(保护模式模式下调用,短调用):
;void Disp_Return();
;功能为换行
Disp_Return:
push sz_Return
call Disp_Str
add esp,4
ret
;---------------------------------------------------------------------Disp_Space
;C函数原型(保护模式模式下调用,短调用):
;void Disp_Space();
;功能为打印一个空格
Disp_Space:
push sz_Space
call Disp_Str
add esp,4
ret
;---------------------------------------------------------------------Cursor_Loc
Cursor_Loc:
;C函数原型(保护模式下调用,短调用):
;void Cursor();
;光标跟随着变量d_Disp_Pos_In_PM
push eax
push ebx
push edx
xor edx,edx
mov eax,[d_Disp_Pos_In_PM]
mov ebx,2
div ebx
push eax
shr eax,8
and eax,0ffh
push eax
mov dx,3d4h
mov al,0eh
out dx,al
pop eax
mov dx,3d5h
out dx,al
mov dx,3d4h
mov al,0fh
out dx,al
pop eax
and eax,0ffh
mov dx,3d5h
out dx,al
pop edx
pop ebx
pop eax
ret
;--------------------------------------------------------------------Memory_Copy
;C函数原型(保护模式下调用,短调用):
;void Memory_Copy(void *p_src,void *p_des,int len);
;按字节复制,从src流向des
Memory_Copy:
push ebp
mov ebp,esp
push eax
push ecx
push esi
push edi
mov ecx,[ebp + 16] ;取得要复制的字节长度
mov edi,[ebp + 12] ;取得目的指针
mov esi,[ebp + 8] ;取得源指针
;开始复制
.1:
cmp ecx,0
je .2
mov al,[ds:esi]
mov [es:edi],al
inc esi
inc edi
dec ecx
jmp .1
.2:
pop edi
pop esi
pop ecx
pop eax
pop ebp
ret