- ;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
boot/include/lib_in_protect_mode.inc
本文介绍了一组用于实现在保护模式下进行屏幕输出的汇编语言函数,包括字符串显示、整数显示、换行及光标定位等功能,并提供了详细的实现代码。

被折叠的 条评论
为什么被折叠?



