boot/include/lib_in_protect_mode.inc

Code:
  1. ;By Marcus Xing   
  2. ;boot/include/lib_in_protect_mode.inc   
  3. ;在boot/loader.asm中保护模式下使用的函数   
  4.   
  5. ;------------------------------------------------------------------------Disp_Str   
  6. Disp_Str:   
  7. ;C函数原型(保护模式模式下调用,短调用):   
  8. ;void Disp_Str(const char *p_sz_Str);   
  9. ;调用前gs必须指向显存段   
  10.     push    ebp   
  11.     mov ebp,esp   
  12.        
  13.     push    eax   
  14.     push    ebx   
  15.     push    edx   
  16.     push    esi   
  17.     push    edi   
  18.        
  19.     mov edi,[d_Disp_Pos_In_PM]              ;edi为显示位置   
  20.     mov esi,[ebp + 8]                       ;esi指向要打印的串   
  21.        
  22. .1:   
  23.     cmp byte [esi],0                        ;判断串是否结束   
  24.     je  .3                                  ;结束就退出打印   
  25.     cmp byte [esi],0ah                      ;判断是否是回车   
  26.     jne .2                                  ;不是就打印   
  27.        
  28.     ;修改edi值,跳转下一行的开始   
  29.     mov eax,edi   
  30.     xor edx,edx   
  31.     mov ebx,160   
  32.     div ebx   
  33.     inc eax   
  34.     mul ebx   
  35.     mov edi,eax   
  36.     inc esi   
  37.     jmp .1                                  ;处理串下一个字符   
  38.        
  39. .2:   
  40.     mov ah,0fh                              ;黑底白字   
  41.     mov al,[esi]   
  42.     mov [gs:edi],ax                         ;写入显存   
  43.     add edi,2   
  44.     inc esi   
  45.     jmp .1                                  ;处理下一个字符   
  46.        
  47. .3:   
  48.     mov [d_Disp_Pos_In_PM],edi              ;把位置写回变量   
  49.        
  50.     call    Cursor_Loc                      ;调用功能函数,光标跟随字符   
  51.        
  52.     pop edi   
  53.     pop esi   
  54.     pop edx   
  55.     pop ebx   
  56.     pop eax   
  57.        
  58.     pop ebp   
  59.     ret   
  60.        
  61. ;-----------------------------------------------------------------------Disp_Int   
  62. ;C函数原型(保护模式模式下调用,短调用):   
  63. ;void Disp_Int(int i_int);   
  64. ;把形参以32位整数16进制显示出来,最后加个h   
  65. ;调用前gs必须指向显存段   
  66. Disp_Int:   
  67.     push    ebp   
  68.     mov ebp,esp   
  69.        
  70.     push    eax   
  71.     push    ecx   
  72.     push    edi   
  73.        
  74.     mov eax,[ebp + 8]                       ;要显示的数放到eax中   
  75.     mov ecx,4                               ;循环4次   
  76.        
  77. .1:   
  78.     rol eax,8                               ;循环右移8位   
  79.     call    Disp_Al   
  80.     loop .1   
  81.        
  82.     mov edi,[d_Disp_Pos_In_PM]   
  83.     mov ah,7h                               ;黑底灰字   
  84.     mov al,'h'   
  85.     mov [gs:edi],ax   
  86.     add edi,2   
  87.     mov [d_Disp_Pos_In_PM],edi             
  88.        
  89.     call    Cursor_Loc         
  90.        
  91.     pop edi   
  92.     pop ecx   
  93.     pop eax   
  94.        
  95.     pop ebp   
  96.     ret    
  97.        
  98. ;------------------------------------------------------------------------Disp_Al   
  99. Disp_Al:   
  100. ;C函数原型(保护模式模式下调用,短调用):   
  101. ;void Disp_Str(byte al);   
  102. ;调用前把欲显示的数字放到al中,以16进制打印出来   
  103. ;调用前gs必须指向显存段   
  104.     push    esi   
  105.     push    ecx   
  106.        
  107.     push    eax                             ;暂存eax   
  108.     mov ecx,2                               ;循环2次   
  109.     shr al,4                                ;把al高4位移到低4位   
  110.        
  111. .3:   
  112.     and al,0fh                              ;al高4位清零   
  113.     cmp al,9                                ;与9比较   
  114.     jbe .1                                  ;小于等于9准备打印   
  115.     add al,7                                ;大于9的话则转化为字母   
  116.        
  117. .1:   
  118.     add al,30h   
  119.     mov esi,[d_Disp_Pos_In_PM]              ;esi为显示位置   
  120.     mov byte [gs:esi],al   
  121.     mov byte [gs:esi + 1],0fh               ;黑底白字   
  122.     add dword [d_Disp_Pos_In_PM],2          ;写入显存   
  123.        
  124.     dec ecx   
  125.     cmp ecx,0                               ;判断是否为0   
  126.     je  .2                                  ;是则退出函数   
  127.     pop eax                                 ;否则继续显示   
  128.     jmp .3   
  129.        
  130. .2:   
  131.     pop ecx   
  132.     pop esi   
  133.   
  134.     ret   
  135.        
  136. ;--------------------------------------------------------------------Disp_Return   
  137. ;C函数原型(保护模式模式下调用,短调用):   
  138. ;void Disp_Return();   
  139. ;功能为换行   
  140. Disp_Return:   
  141.     push    sz_Return   
  142.     call    Disp_Str   
  143.     add esp,4   
  144.     ret   
  145.        
  146. ;---------------------------------------------------------------------Disp_Space   
  147. ;C函数原型(保护模式模式下调用,短调用):   
  148. ;void Disp_Space();   
  149. ;功能为打印一个空格   
  150. Disp_Space:   
  151.     push    sz_Space   
  152.     call    Disp_Str   
  153.     add esp,4   
  154.     ret   
  155.        
  156. ;---------------------------------------------------------------------Cursor_Loc   
  157. Cursor_Loc:   
  158. ;C函数原型(保护模式下调用,短调用):   
  159. ;void Cursor();   
  160. ;光标跟随着变量d_Disp_Pos_In_PM   
  161.     push    eax   
  162.     push    ebx   
  163.     push    edx   
  164.           
  165.     xor edx,edx   
  166.     mov eax,[d_Disp_Pos_In_PM]   
  167.     mov ebx,2   
  168.     div ebx   
  169.     push    eax   
  170.     shr eax,8   
  171.     and eax,0ffh   
  172.     push    eax   
  173.     mov dx,3d4h   
  174.     mov al,0eh   
  175.     out dx,al   
  176.     pop eax   
  177.     mov dx,3d5h   
  178.     out dx,al   
  179.   
  180.     mov dx,3d4h   
  181.     mov al,0fh   
  182.     out dx,al   
  183.     pop eax   
  184.     and eax,0ffh   
  185.     mov dx,3d5h   
  186.     out dx,al   
  187.   
  188.     pop edx   
  189.     pop ebx   
  190.     pop eax   
  191.     ret   
  192.        
  193. ;--------------------------------------------------------------------Memory_Copy   
  194. ;C函数原型(保护模式下调用,短调用):   
  195. ;void Memory_Copy(void *p_src,void *p_des,int len);   
  196. ;按字节复制,从src流向des   
  197. Memory_Copy:   
  198.     push    ebp   
  199.     mov ebp,esp   
  200.        
  201.     push    eax   
  202.     push    ecx   
  203.     push    esi   
  204.     push    edi   
  205.        
  206.     mov ecx,[ebp + 16]                      ;取得要复制的字节长度   
  207.     mov edi,[ebp + 12]                      ;取得目的指针   
  208.     mov esi,[ebp + 8]                       ;取得源指针   
  209.        
  210.     ;开始复制   
  211. .1:   
  212.     cmp ecx,0   
  213.     je  .2   
  214.     mov al,[ds:esi]   
  215.     mov [es:edi],al   
  216.     inc esi   
  217.     inc edi   
  218.     dec ecx   
  219.     jmp  .1   
  220.        
  221. .2:    
  222.     pop edi   
  223.     pop esi   
  224.     pop ecx   
  225.     pop eax   
  226.        
  227.     pop ebp   
  228.     ret   
  229.       

你可能感兴趣的:(c)