lib/lib_in_asm.asm

Code:
  1. ;By Marcus Xing   
  2. ;lib/lib_kernel_in_asm.asm   
  3. ;内核中用到的用汇编写的工具函数   
  4. ;注意,有些函数使用了IO操作,根据当前特权级和EFLAG的相应限制使用   
  5.   
  6. ;---------------------------------------------------------------------global集合   
  7. global  Disp_Str   
  8. global  Disp_Color_Str   
  9. global  I_To_A   
  10. global  Out_Byte   
  11. global  In_Byte   
  12. global  Memory_Copy   
  13. global  Enable_IRQ   
  14. global  Disable_IRQ   
  15. global  Enable_Int   
  16. global  Disable_Int   
  17.   
  18. ;---------------------------------------------------------------------extern集合   
  19. extern  d_Disp_Pos   
  20. extern  Cursor_Loc   
  21.   
  22. ;-----------------------------------------------------------------------Disp_Str   
  23. Disp_Str:   
  24. ;C函数原型:   
  25. ;void Disp_Str(const char *psz_Str)   
  26. ;打印一个字符串   
  27.     push    ebp   
  28.     mov ebp,esp   
  29.        
  30.     push    eax   
  31.     push    ebx   
  32.     push    edx   
  33.     push    esi   
  34.     push    edi   
  35.        
  36.     mov edi,[d_Disp_Pos]                ;edi为显示位置   
  37.     mov esi,[ebp + 8]                   ;esi指向要打印的串   
  38.        
  39. .1:   
  40.     cmp byte [esi],0                    ;判断串是否结束   
  41.     je  .3                              ;结束就退出打印   
  42.     cmp byte [esi],0ah                  ;判断是否是回车   
  43.     jne .2                              ;不是就打印   
  44.        
  45.     ;修改edi值,跳转下一行的开始   
  46.     mov eax,edi   
  47.     xor edx,edx   
  48.     mov ebx,160   
  49.     div ebx   
  50.     inc eax   
  51.     mul ebx   
  52.     mov edi,eax   
  53.     inc esi   
  54.     jmp .1                              ;处理串下一个字符   
  55.        
  56. .2:   
  57.     mov ah,0fh                          ;黑底白字   
  58.     mov al,[esi]   
  59.     mov [gs:edi],ax                     ;写入显存   
  60.     add edi,2   
  61.     inc esi   
  62.     jmp .1                              ;处理下一个字符   
  63.        
  64. .3:   
  65.     mov [d_Disp_Pos],edi                ;把位置写回变量   
  66.        
  67.     call    Cursor_Loc                  ;调用功能函数,光标跟随字符   
  68.        
  69.     pop edi   
  70.     pop esi   
  71.     pop edx   
  72.     pop ebx   
  73.     pop eax   
  74.        
  75.     pop ebp   
  76.     ret   
  77.        
  78. ;-----------------------------------------------------------------Disp_Color_Str   
  79. Disp_Color_Str:   
  80. ;C函数原型:   
  81. ;void Disp_Str(const char *psz_Str,u8 color)   
  82. ;打印一个带颜色的字符串   
  83.     push    ebp   
  84.     mov ebp,esp   
  85.        
  86.     push    eax   
  87.     push    ebx   
  88.     push    edx   
  89.     push    esi   
  90.     push    edi   
  91.        
  92.     mov edi,[d_Disp_Pos]                ;edi为显示位置   
  93.     mov esi,[ebp + 8]                   ;esi指向要打印的串   
  94.     mov eax,[ebp + 12]                  ;eax为颜色值   
  95.     mov ah,al                           ;颜色值送ah   
  96.        
  97. .1:   
  98.     cmp byte [esi],0                    ;判断串是否结束   
  99.     je  .3                              ;结束就退出打印   
  100.     cmp byte [esi],0ah                  ;判断是否是回车   
  101.     jne .2                              ;不是就打印   
  102.        
  103.     ;修改edi值,跳转下一行的开始   
  104.     mov eax,edi   
  105.     xor edx,edx   
  106.     mov ebx,160   
  107.     div ebx   
  108.     inc eax   
  109.     mul ebx   
  110.     mov edi,eax   
  111.     inc esi   
  112.     jmp .1                              ;处理串下一个字符   
  113.        
  114. .2:   
  115.     mov al,[esi]   
  116.     mov [gs:edi],ax                     ;写入显存   
  117.     add edi,2   
  118.     inc esi   
  119.     jmp .1                              ;处理下一个字符   
  120.        
  121. .3:   
  122.     mov [d_Disp_Pos],edi                ;把位置写回变量   
  123.        
  124.     call    Cursor_Loc                  ;调用功能函数,光标跟随字符   
  125.        
  126.     pop edi   
  127.     pop esi   
  128.     pop edx   
  129.     pop ebx   
  130.     pop eax   
  131.        
  132.     pop ebp   
  133.     ret   
  134.   
  135. ;-------------------------------------------------------------------------I_to_A   
  136. I_To_A:   
  137. ;C函数原型:   
  138. ;void I_To_A(const char *p_sz_buffer,int num);   
  139. ;把num中的数字转化为一个ASCII数组存放到buffer中,   
  140. ;最高位的0去掉,以0x开头以16进制格式存放   
  141.     push    ebp   
  142.     mov ebp,esp   
  143.        
  144.     push    eax   
  145.     push    ecx   
  146.     push    esi   
  147.        
  148.     mov esi,[ebp + 8]                   ;BUFFER指针赋给esi   
  149.        
  150.     ;开头2字符'0x'填充到BUFFER   
  151.     mov byte [esi],'0'   
  152.     inc esi   
  153.     mov byte [esi],'x'   
  154.     inc esi    
  155.        
  156.     mov eax,[ebp + 12]                  ;要转化的数赋给eax   
  157.     test    eax,eax                     ;测试eax是否为0   
  158.     je  .4                              ;如果为0则直接跳转到.4   
  159.        
  160.     mov ecx,28                          ;移位计数器   
  161.        
  162. .1:   
  163.     mov eax,[ebp + 12]                  ;要转化的数赋给eax   
  164.     shr eax,cl                          ;右移cl位   
  165.     and al,0fh                          ;清掉al高4位   
  166.     test    al,al                       ;测试al是否为0   
  167.     jne .2                              ;如果不为0则就开始继续填充BUFFER   
  168.     sub cl,4                            ;cl减4   
  169.     jmp .1                              ;继续左移   
  170.        
  171. .2:   
  172.     and al,0fh                          ;清掉al高4位   
  173.     cmp al,9                            ;与9比较   
  174.     jbe .3                              ;<=9则添砖到.3,直接加30h   
  175.     add al,7h                           ;>9则转化为A-F   
  176.        
  177. .3:                                                
  178.     add al,30h                          ;转化为相应的ASCII码   
  179.     mov byte [esi],al                   ;存入BUFFER   
  180.     inc esi                             ;指向下一个BUFFER   
  181.        
  182.     cmp cl,0                            ;判断cl==0   
  183.     je  .5                              ;if(cl==0) then 添上结束符    
  184.     sub cl,4                            ;else go on   
  185.     mov eax,[ebp + 12]                  ;要转化的数赋给eax   
  186.     shr eax,cl   
  187.     jmp .2                              ;跳转到.2   
  188.        
  189. .4:   
  190.     mov byte [esi],'0'                  ;处理num=0的情况   
  191.     inc esi   
  192.   
  193. .5:   
  194.     mov byte [esi],0                    ;BUFFER最后置'/0'作为结束符   
  195.        
  196.     pop esi   
  197.     pop ecx   
  198.     pop eax   
  199.        
  200.     pop ebp   
  201.     ret   
  202.        
  203. ;-----------------------------------------------------------------------Out_Byte   
  204. Out_Byte:   
  205. ;C函数原型:   
  206. ;void Out_Byte(u16 port,u8 value)   
  207. ;向一个16位的端口写一个8位的值   
  208.     push    ebp   
  209.     mov ebp,esp   
  210.        
  211.     push    eax   
  212.     push    edx   
  213.        
  214.     mov edx,[ebp + 8]                   ;端口值送edx   
  215.     mov eax,[ebp + 12]                  ;值送eax   
  216.     out dx,al                           ;out   
  217.        
  218.     ;延时   
  219.     nop   
  220.     nop   
  221.        
  222.     pop edx   
  223.     pop eax   
  224.        
  225.     pop ebp   
  226.     ret   
  227.   
  228. ;------------------------------------------------------------------------In_Byte   
  229. ;C函数原型:   
  230. ;u8 In_Byte(u16 port);   
  231. ;从端口读一个值并返回   
  232. In_Byte:   
  233.     push    ebp   
  234.     mov ebp,esp   
  235.        
  236.     push    edx   
  237.        
  238.     mov edx,[ebp + 8]                   ;edx<-port  
  239.     in  al,dx   
  240.        
  241.     ;延时   
  242.     nop   
  243.     nop   
  244.        
  245.     pop edx   
  246.        
  247.     pop ebp   
  248.     ret   
  249.        
  250. ;--------------------------------------------------------------------Memory_Copy   
  251. Memory_Copy:   
  252. ;C函数原型:   
  253. ;void Memory_Copy(void *dest,void *src,int len);   
  254. ;数据从src流向dest,单位为len个字节   
  255.     push    ebp   
  256.     mov ebp,esp   
  257.        
  258.     push    eax   
  259.     push    ecx   
  260.     push    esi   
  261.     push    edi   
  262.        
  263.     mov esi,[ebp + 12]                  ;esi指向源地址   
  264.     mov edi,[ebp + 8]                   ;edi指向目的地址   
  265.     mov ecx,[ebp + 16]                  ;ecx为复制字节数   
  266.        
  267. .1:   
  268.     mov al,byte [esi]   
  269.     mov byte [edi],al   
  270.     inc esi   
  271.     inc edi   
  272.     loop    .1   
  273.        
  274.     pop edi   
  275.     pop esi   
  276.     pop ecx   
  277.     pop eax   
  278.        
  279.     pop ebp   
  280.     ret   
  281.   
  282. ;---------------------------------------------------------------------Enable_IRQ   
  283. Enable_IRQ:   
  284. ;C函数原型:   
  285. ;void Enable_IRQ(int irq_no);   
  286. ;激活irq_no号外中断   
  287.     push    ebp   
  288.     mov ebp,esp   
  289.        
  290.     push    eax   
  291.     push    ecx   
  292.        
  293.     pushf                               ;标志寄存器进栈   
  294.     cli                                 ;关中断   
  295.        
  296.     mov ecx,[ebp + 8]                   ;中断号送ecx   
  297.     cmp cl,7                            ;中断号>7,则为从片   
  298.     ja  .1   
  299.        
  300.     ;主片顺序执行   
  301.     in  al,21h                          ;得到原主片的值   
  302.     ;得到欲比较的相应值   
  303.     mov ah,1   
  304.     shl ah,cl   
  305.     not ah   
  306.     and al,ah   
  307.     out 21h,al                          ;写回去   
  308.     jmp .2                              ;ret   
  309.        
  310. .1:   
  311.     ;从片开始   
  312.     sub cl,8                            ;减8   
  313.     in  al,0a1h                         ;得到原从片的值   
  314.     ;得到欲比较的相应值   
  315.     mov ah,1   
  316.     shl ah,cl   
  317.     not ah   
  318.     and al,ah   
  319.     out 0a1h,al                         ;写回去   
  320.        
  321. .2:   
  322.     popf                                ;恢复标志寄存器   
  323.        
  324.     pop ecx   
  325.     pop eax   
  326.        
  327.     pop ebp   
  328.     ret   
  329.   
  330. ;--------------------------------------------------------------------Disable_IRQ   
  331. Disable_IRQ:   
  332. ;C函数原型:   
  333. ;void Enable_IRQ(int irq_no);   
  334. ;屏蔽irq_no号外中断   
  335.     push    ebp   
  336.     mov ebp,esp   
  337.        
  338.     push    eax   
  339.     push    ecx   
  340.        
  341.     pushf                               ;标志寄存器进栈   
  342.     cli                                 ;关中断   
  343.        
  344.     mov ecx,[ebp + 8]                   ;中断号送ecx   
  345.     cmp cl,7                            ;中断号>7,则为从片   
  346.     ja  .1   
  347.        
  348.     ;主片顺序执行   
  349.     in  al,21h                          ;得到原主片的值   
  350.     ;得到欲比较的相应值   
  351.     mov ah,1   
  352.     shl ah,cl   
  353.     or  al,ah   
  354.     out 21h,al                          ;写回去   
  355.     jmp .2                              ;ret   
  356.        
  357. .1:   
  358.     ;从片开始   
  359.     sub cl,8                            ;减8   
  360.     in  al,0a1h                         ;得到原从片的值   
  361.     ;得到欲比较的相应值   
  362.     mov ah,1   
  363.     shl ah,cl   
  364.     or  al,ah   
  365.     out 0a1h,al                         ;写回去   
  366.        
  367. .2:   
  368.     popf                                ;恢复标志寄存器   
  369.        
  370.     pop ecx   
  371.     pop eax   
  372.        
  373.     pop ebp   
  374.     ret   
  375.        
  376. ;---------------------------------------------------------------------Enable_Int   
  377. Enable_Int:   
  378. ;C函数原型:   
  379. ;void Enable_Int();   
  380. ;简单的开中断   
  381.     sti   
  382.     ret   
  383.   
  384. ;--------------------------------------------------------------------Disable_Int   
  385. Disable_Int:   
  386. ;C函数原型:   
  387. ;void Disable_Int();   
  388. ;简单的关中断   
  389.     cli   
  390.     ret   

 

你可能感兴趣的:(lib/lib_in_asm.asm)