鱼C论坛

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

关于CS寄存器.

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

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

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

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

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

  1. ; ==========================================
  2. ; pmtest1.asm
  3. ; 编译方法:nasm pmtest1.asm -o pmtest1.bin
  4. ; ==========================================

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

  6. org        07c00h
  7.         jmp        LABEL_BEGIN

  8. [SECTION .gdt]
  9. ; GDT
  10. ;                              段基址,       段界限     , 属性
  11. LABEL_GDT:           Descriptor       0,                0, 0           ; 空描述符
  12. LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
  13. LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW             ; 显存首地址
  14. ; GDT 结束

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

  18. ; GDT 选择子
  19. SelectorCode32                equ        LABEL_DESC_CODE32        - LABEL_GDT
  20. SelectorVideo                equ        LABEL_DESC_VIDEO        - LABEL_GDT
  21. ; END of [SECTION .gdt]

  22. [SECTION .s16]
  23. [BITS        16]
  24. LABEL_BEGIN:
  25.         mov        ax, cs
  26.         mov        ds, ax
  27.         mov        es, ax
  28.         mov        ss, ax
  29.         mov        sp, 0100h

  30.         ; 初始化 32 位代码段描述符
  31.         xor        eax, eax
  32.         mov        ax, cs
  33.         shl        eax, 4
  34.         add        eax, LABEL_SEG_CODE32
  35.         mov        word [LABEL_DESC_CODE32 + 2], ax
  36.         shr        eax, 16
  37.         mov        byte [LABEL_DESC_CODE32 + 4], al
  38.         mov        byte [LABEL_DESC_CODE32 + 7], ah

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

  45.         ; 加载 GDTR
  46.         lgdt        [GdtPtr]

  47.         ; 关中断
  48.         cli

  49.         ; 打开地址线A20
  50.         in        al, 92h
  51.         or        al, 00000010b
  52.         out        92h, al

  53.         ; 准备切换到保护模式
  54.         mov        eax, cr0
  55.         or        eax, 1
  56.         mov        cr0, eax

  57.         ; 真正进入保护模式
  58.         jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs,
  59.                                         ; 并跳转到 Code32Selector:0  处
  60. ; END of [SECTION .s16]


  61. [SECTION .s32]; 32 位代码段. 由实模式跳入.
  62. [BITS        32]

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

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

  70.         ; 到此停止
  71.         jmp        $

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

本版积分规则

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

GMT+8, 2025-7-12 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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