• 原来gdt和gdtr可以这么得来


    原来看得都是赵博的书,讲的很详细,理论性很强,最近想动手实践下,看《自己动手写操作系统》第三章的一个例子,突然发现gdt和gdtr可以这么得来

    赵博的书上,这两个东西是直接设定好的(一直认为也要这么做)。

    今天就来说下,《自己动手写操作系统》这本书是怎么实现的

    我主要说gdt和gdtr其他的都简单

     1 ; ==========================================
     2 ; pmtest1.asm
     3 ; ±àÒë·œ·š£ºnasm pmtest1.asm -o pmtest1.com
     4 ; ==========================================
     5 
     6 %include    "pm.inc"    ; 
     7 
     8 org    0100h
     9     jmp    LABEL_BEGIN
    10 
    11 [SECTION .gdt]
    12 ; GDT
    13 ;                                        
    14 LABEL_GDT:        Descriptor           0,                0, 0             ; 
    15 LABEL_DESC_CODE32:    Descriptor           0, SegCode32Len - 1, DA_C + DA_32    ; 
    16 LABEL_DESC_VIDEO:    Descriptor     0B8000h,           0ffffh, DA_DRW        ;
    17 ; GDT œáÊø
    18 
    19 GdtLen        equ    $ - LABEL_GDT    ; 
    20 GdtPtr        dw    GdtLen - 1    ; 
    21         dd    0        ; GDT»ùµØÖ·
    22 
    23 ; GDT Ñ¡Ôñ×Ó
    24 SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDT
    25 SelectorVideo        equ    LABEL_DESC_VIDEO    - LABEL_GDT
    26 ; END of [SECTION .gdt]
    27 
    28 [SECTION .s16]
    29 [BITS    16]
    30 LABEL_BEGIN:
    31     mov    ax, cs
    32     mov    ds, ax
    33     mov    es, ax
    34     mov    ss, ax
    35     mov    sp, 0100h
    36 
    37     ; 这段的意思好好看看,在实模式下把代码段的物理地址求出来(左移四位加偏移),把这个物理地址保存在描述符中(这是我在赵博的书上没有见到过的),留着在实模式的时候用38     xor    eax, eax
    39     mov    ax, cs
    40     shl    eax, 4
    41     add    eax, LABEL_SEG_CODE32
    42     mov    word [LABEL_DESC_CODE32 + 2], ax;这里我建议最好看看全局描述符的2,3,4,7字节都表示的是什么意思
    43     shr    eax, 16
    44     mov    byte [LABEL_DESC_CODE32 + 4], al
    45     mov    byte [LABEL_DESC_CODE32 + 7], ah
    46 
    47     ; 这里同上,再实模式下求出要加载到gdtr里的地址,保存下来,到实模式的时候用
    48     xor    eax, eax
    49     mov    ax, ds
    50     shl    eax, 4
    51     add    eax, LABEL_GDT        ; 52     mov    dword [GdtPtr + 2], eax    ;53 
    54 55     lgdt    [GdtPtr]
    56 
    57 58     cli
    59 
    60 61     in    al, 92h
    62     or    al, 00000010b
    63     out    92h, al
    64 
    65 66     mov    eax, cr0
    67     or    eax, 1
    68     mov    cr0, eax
    69 
    70 71     jmp    dword SelectorCode32:0    ; 72 ; END of [SECTION .s16]
    73 
    74 
    75 [SECTION .s32];76 [BITS    32]
    77 
    78 LABEL_SEG_CODE32:
    79     mov    ax, SelectorVideo
    80     mov    gs, ax            
    81 
    82     mov    edi, (80 * 10 + 0) * 2   83     mov    ah, 0Ch            ;84     mov    al, 'P'
    85     mov    [gs:edi], ax
    86 
    87 88     jmp    $
    89 
    90 SegCode32Len    equ    $ - LABEL_SEG_CODE32
    91 ; END of [SECTION .s32]

    本来源代码上是有注释的,在linux下全成乱码了,上面的注释都是我自己理解添加的,请多多指正。

    我也不知到说清楚没有……

  • 相关阅读:
    不能交易的物料不可做接收
    限制车间备料方式更改
    成本维护不允许超过设定比例
    车间不可操作非车间仓
    手工成本维护不可以将成本改为零
    手工成本维护超过1500元提醒
    成本查询
    同一供应商只能有一个有效的报价单
    新增报价单状态为有效状态
    同一供应商同一物料存在有效报价时不能再新增报价
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2883110.html
Copyright © 2020-2023  润新知