boot/include/lib_in_protect_mode.inc

来源:互联网 发布:淘宝nba旗舰店是正品吗 编辑:程序博客网 时间:2024/06/03 13:28

;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
 

原创粉丝点击