鱼C论坛

 找回密码
 立即注册
查看: 1787|回复: 1

关于CS寄存器.

[复制链接]
发表于 2013-3-18 23:20:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

第三章第一个程序。先把代码贴出来:
; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================

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

org        07c00h
        jmp        LABEL_BEGIN

[SECTION .gdt]
; 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 [SECTION .gdt]

[SECTION .s16]
[BITS        16]
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 [LABEL_DESC_CODE32 + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_CODE32 + 4], al
        mov        byte [LABEL_DESC_CODE32 + 7], ah

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

        ; 加载 GDTR
        lgdt        [GdtPtr]

        ; 关中断
        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 [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS        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        [gs:edi], ax

        ; 到此停止
        jmp        $

SegCode32Len        equ        $ - LABEL_SEG_CODE32
; END of [SECTION .s32]
我有个疑惑:我没看到任何赋值给cs寄存器的操作。不过程序中用cs寄存器中的值给其他几个寄存器赋值了。cs寄存器中的值是什么?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-30 11:01:03 | 显示全部楼层
71.        jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 20:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表