TomodaMaki 发表于 2013-3-18 23:20:45

关于CS寄存器.

最近在看于渊同志写的书《Orange's 一个操作系统的实现》,第三章,遇到一个问题,在这里请教下大家.

第三章第一个程序。先把代码贴出来:

; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================

%include        "pm.inc"        ; 常量, 宏, 以及一些说明

org        07c00h
        jmp        LABEL_BEGIN


; GDT
;                              段基址,       段界限   , 属性
LABEL_GDT:           Descriptor       0,                0, 0         ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO:Descriptor 0B8000h,         0ffffh, DA_DRW             ; 显存首地址
; GDT 结束

GdtLen                equ        $ - LABEL_GDT        ; GDT长度
GdtPtr                dw        GdtLen - 1        ; GDT界限
                dd        0                ; GDT基地址

; GDT 选择子
SelectorCode32                equ        LABEL_DESC_CODE32        - LABEL_GDT
SelectorVideo                equ        LABEL_DESC_VIDEO        - LABEL_GDT
; END of



LABEL_BEGIN:
        mov        ax, cs
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        sp, 0100h

        ; 初始化 32 位代码段描述符
        xor        eax, eax
        mov        ax, cs
        shl        eax, 4
        add        eax, LABEL_SEG_CODE32
        mov        word , ax
        shr        eax, 16
        mov        byte , al
        mov        byte , ah

        ; 为加载 GDTR 作准备
        xor        eax, eax
        mov        ax, ds
        shl        eax, 4
        add        eax, LABEL_GDT                ; eax <- gdt 基地址
        mov        dword , eax        ; <- gdt 基地址

        ; 加载 GDTR
        lgdt       

        ; 关中断
        cli

        ; 打开地址线A20
        in        al, 92h
        or        al, 00000010b
        out        92h, al

        ; 准备切换到保护模式
        mov        eax, cr0
        or        eax, 1
        mov        cr0, eax

        ; 真正进入保护模式
        jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs,
                                        ; 并跳转到 Code32Selector:0处
; END of


; 32 位代码段. 由实模式跳入.


LABEL_SEG_CODE32:
        mov        ax, SelectorVideo
        mov        gs, ax                        ; 视频段选择子(目的)

        mov        edi, (80 * 11 + 79) * 2        ; 屏幕第 11 行, 第 79 列。
        mov        ah, 0Ch                        ; 0000: 黑底    1100: 红字
        mov        al, 'P'
        mov        , ax

        ; 到此停止
        jmp        $

SegCode32Len        equ        $ - LABEL_SEG_CODE32
; END of
我有个疑惑:我没看到任何赋值给cs寄存器的操作。不过程序中用cs寄存器中的值给其他几个寄存器赋值了。cs寄存器中的值是什么?谢谢

思来想去 发表于 2013-3-30 11:01:03

71.      jmp      dword SelectorCode32:0      ; 执行这一句会把 SelectorCode32 装入 cs,
页: [1]
查看完整版本: 关于CS寄存器.