【PM复习】修正段界限

     在前几节中的GDT和LDT中,大部分描述符的段界限都是0xffff,这其实是不严谨的,段界限是多少,要从实际出发,在这节中各个段的最后,都要定义一个宏表示此段的长度,在描述符中用此宏来表示段界限。

     完整代码如下:

Code:
  1. %include "pm.inc"  
  2.   
  3. org 0100h       
  4. jmp LABEL_BEGIN       
  5.       
  6. [section .gdt]       
  7. LABEL_DESC_DUMMY:       
  8.     Descriptor  0,0,0     
  9. LABEL_DESC_CODE32:    
  10.     Descriptor  0,GDT_Code32_Len - 1,DA_C | DA_32     
  11. LABEL_DESC_CODE16:   
  12.     Descriptor  0,GDT_Code16_Len - 1,DA_C   
  13. LABEL_DESC_VIDEO:       
  14.     Descriptor  0b8000h,0ffffh,DA_DRW   
  15. LABEL_DESC_DATA:   
  16.     Descriptor  0,Data_Len - 1,DA_DRW   
  17. LABEL_DESC_TEST:   
  18.     Descriptor  50000h,0ffffh,DA_DRW   
  19. LABEL_DESC_STACK32:    
  20.     Descriptor  0,Stack_Len - 1,DA_DRW | DA_32   
  21. LABEL_DESC_NORMAL:   
  22.     Descriptor  0,0ffffh,DA_DRW   
  23. LABEL_DESC_LDT:   
  24.     Descriptor  0,LDT_LEN - 1,DA_LDT   
  25.            
  26. GDT_Len equ $ - LABEL_DESC_DUMMY       
  27. GDT_Ptr:       
  28.     dw  GDT_Len - 1       
  29.     dd  0       
  30.       
  31. Selector_Code32 equ LABEL_DESC_CODE32 - LABEL_DESC_DUMMY       
  32. Selector_Code16 equ LABEL_DESC_CODE16 - LABEL_DESC_DUMMY   
  33. Selector_Video  equ LABEL_DESC_VIDEO - LABEL_DESC_DUMMY     
  34. Selector_Data       equ LABEL_DESC_DATA - LABEL_DESC_DUMMY     
  35. Selector_Test       equ LABEL_DESC_TEST - LABEL_DESC_DUMMY   
  36. Selector_Stack32 equ    LABEL_DESC_STACK32 - LABEL_DESC_DUMMY   
  37. Selector_Normal equ LABEL_DESC_NORMAL - LABEL_DESC_DUMMY   
  38. Selector_LDT        equ LABEL_DESC_LDT - LABEL_DESC_DUMMY   
  39.   
  40. [section .ldt]   
  41. LABEL_LDT:   
  42.     Descriptor  0,0,0   
  43. LABEL_LDT_DESC_CODE32:   
  44.     Descriptor  0,LDT_Code32_Len - 1,DA_C | DA_32   
  45.   
  46. Selector_LDT_Code32 equ LABEL_LDT_DESC_CODE32 - LABEL_LDT + SA_TIL   
  47. LDT_LEN equ $ - $$   
  48.   
  49.   
  50. [section .stack32]   
  51. [bits 32]   
  52. LABEL_STACK32:   
  53.     times 512 db 0   
  54. Stack_Len   equ $ - $$   
  55.   
  56. [section .data]   
  57. LABEL_DATA:   
  58. _d_Disp_Pos dd  160 * 5   
  59. d_Disp_Pos  equ _d_Disp_Pos - $$   
  60. _w_SP_Value_In_Real_Mode    dw  0   
  61. w_SP_Value_In_Real_Mode equ _w_SP_Value_In_Real_Mode - $$   
  62.   
  63. Data_Len    equ $ - $$   
  64.       
  65. [section .s16]       
  66. [bits 16]       
  67. LABEL_BEGIN:       
  68.     mov ax,cs       
  69.   mov ds,ax       
  70.   mov es,ax       
  71.   mov   ax,ss   
  72.   mov   sp,0100h   
  73.      
  74.   mov   [LABEL_GO_BACK_TO_REAL + 3],ax   
  75.            
  76.   Fill_Descriptor   LABEL_DESC_CODE32,LABEL_CODE32   
  77.   Fill_Descriptor   LABEL_DESC_CODE16,LABEL_BEGIN   
  78.   Fill_Descriptor   LABEL_DESC_DATA,LABEL_DATA   
  79.   Fill_Descriptor   LABEL_DESC_STACK32,LABEL_STACK32   
  80.   Fill_Descriptor   LABEL_DESC_LDT,LABEL_LDT   
  81.   Fill_Descriptor   LABEL_LDT_DESC_CODE32,LABEL_LDT_CODE32   
  82.            
  83.   xor eax,eax       
  84.   mov ax,ds       
  85.   shl eax,4       
  86.   add eax,LABEL_DESC_DUMMY       
  87.   mov dword [GDT_Ptr + 2],eax       
  88.            
  89.   lgdt  [GDT_Ptr]       
  90.      
  91.   mov   [w_SP_Value_In_Real_Mode],sp   
  92.            
  93.   cli       
  94.            
  95.   in  al,92h       
  96.   or  al,00000010b       
  97.   out 92h,al       
  98.            
  99.   mov eax,cr0       
  100.   or  al,1       
  101.   mov cr0,eax       
  102.            
  103.   jmp dword Selector_Code32:0       
  104.        
  105. _LABEL_PREPARE_GO_BACK_TO_REAL:   
  106. LABEL_PREPARE_GO_BACK_TO_REAL equ   _LABEL_PREPARE_GO_BACK_TO_REAL - $$   
  107.     mov ax,Selector_Normal   
  108.     mov ds,ax   
  109.     mov es,ax   
  110.     mov ss,ax   
  111.     mov sp,[w_SP_Value_In_Real_Mode]   
  112.     mov gs,ax   
  113.     mov fs,ax   
  114.        
  115.     mov eax,cr0   
  116.     and al,11111110b   
  117.     mov cr0,eax   
  118.        
  119. LABEL_GO_BACK_TO_REAL:   
  120.     jmp 0:LABEL_ALREADY_REAL   
  121.        
  122. LABEL_ALREADY_REAL:   
  123.     in  al,92h   
  124.     and al,11111101b   
  125.     out 92h,al   
  126.        
  127.     sti   
  128.        
  129.     mov ax,4c00h   
  130.     int 21h   
  131.        
  132. GDT_Code16_Len  equ $ - $$   
  133.       
  134. [section .s32]   
  135. [bits 32]   
  136. LABEL_LDT_CODE32:   
  137.     mov ax,Selector_Video       
  138.   mov gs,ax       
  139.   mov ah,0ch       
  140.   mov al,'x'      
  141.   mov [gs:160 * 10],ax     
  142.      
  143.   jmp   Selector_Code16:LABEL_PREPARE_GO_BACK_TO_REAL    
  144.      
  145. LDT_Code32_Len  equ $ - $$   
  146.      
  147. [section .s32]       
  148. [bits 32]       
  149. LABEL_CODE32:       
  150.   ;mov ax,Selector_Video       
  151.   ;mov gs,ax       
  152.   ;mov ah,0ch       
  153.   ;mov al,'x'      
  154.   ;mov [gs:80 * 10],ax       
  155.      
  156.   mov   ax,Selector_Stack32   
  157.   mov   ss,ax   
  158.   mov   esp,Stack_Len   
  159.      
  160.   mov   ax,Selector_Data   
  161.   mov   ds,ax   
  162.   mov   ax,Selector_Video   
  163.   mov   gs,ax   
  164.   mov   ax,Selector_Test   
  165.   mov   fs,ax   
  166.      
  167.   call  Read_Test   
  168.   call  Disp_Return   
  169.   call  Write_Test   
  170.   call  Read_Test   
  171.      
  172.   mov   ax,Selector_LDT   
  173.   lldt  ax   
  174.      
  175.   jmp   Selector_LDT_Code32:0   
  176.      
  177. Read_Test:   
  178.     push    ebp   
  179.     mov ebp,esp   
  180.     push    ecx   
  181.     push    esi   
  182.        
  183.     mov ecx,8   
  184.     xor esi,esi   
  185.   
  186. .loop:   
  187.     mov al,[fs:esi]   
  188.     call    Disp_Al   
  189.     inc esi   
  190.     loop    .loop   
  191.        
  192.     pop esi   
  193.     pop ecx   
  194.     pop ebp   
  195.     ret   
  196.        
  197. Write_Test:   
  198.     push    ebp   
  199.     mov ebp,esp   
  200.     push    eax   
  201.     push    ecx   
  202.     push    esi   
  203.        
  204.     xor eax,eax   
  205.     mov eax,'A'  
  206.     xor esi,esi   
  207.     mov ecx,8   
  208.   
  209. .loop:   
  210.     mov [fs:esi],al   
  211.     inc esi   
  212.     inc eax   
  213.     loop .loop   
  214.        
  215.     pop esi   
  216.     pop ecx   
  217.     pop eax   
  218.     pop ebp   
  219.     ret   
  220.   
  221. Disp_Al:   
  222.     push    ebp   
  223.     mov ebp,esp   
  224.        
  225.     push    esi   
  226.     push    ecx   
  227.     push    eax   
  228.     mov ecx,2   
  229.     shr al,4   
  230.        
  231. .loop:   
  232.     and al,0fh   
  233.     cmp al,9   
  234.     jb  .1   
  235.     add al,7   
  236.        
  237. .1:   
  238.     add al,30h   
  239.     mov esi,[d_Disp_Pos]   
  240.     mov byte [gs:esi],al   
  241.     mov byte [gs:esi + 1],0ch   
  242.     add dword [d_Disp_Pos],2   
  243.        
  244.     dec ecx   
  245.     cmp ecx,0   
  246.     je  .2   
  247.     pop eax   
  248.     jmp .loop   
  249.        
  250. .2:   
  251.     pop ecx   
  252.     pop esi   
  253.     pop ebp   
  254.     ret   
  255.        
  256. Disp_Return:   
  257.     push    ebp   
  258.     mov ebp,esp   
  259.     push    eax   
  260.     push    ebx   
  261.        
  262.     mov eax,[d_Disp_Pos]   
  263.     mov bl,160   
  264.     div bl   
  265.     and eax,0ffh   
  266.     inc ax   
  267.     mov bl,160   
  268.     mul bl   
  269.     mov [d_Disp_Pos],eax   
  270.        
  271.     pop ebx   
  272.     pop eax   
  273.     pop ebp   
  274.     ret   
  275.   
  276. GDT_Code32_Len  equ $ - $$  

     运行结果跟前一节一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值