- 论坛徽章:
- 0
|
- [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]
- ...
- 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]
复制代码 这是看《ORANGES'_自己动手写操作系统》的源码,关于选择子赋值有个小问题
- LABEL_SEG_CODE32:
- mov ax, SelectorVideo
- mov gs, ax ; 视频段选择子(目的)
复制代码
SelectorVideo这个值是GPT的偏移地址对应到相应的Descriptor宏的结果的地址
- Descriptor 0B8000h, 0ffffh, DA_DRW
复制代码 mov ax, SelectorVideo ;这句ax不应该得到的是下面这个字么,怎么会是显存段地址0B800h呢?
下面是Descriptor宏代码:
- ; 宏 ------------------------------------------------------------------------------------------------------
- ;
- ; 描述符
- ; usage: Descriptor Base, Limit, Attr
- ; Base: dd
- ; Limit: dd (low 20 bits available)
- ; Attr: dw (lower 4 bits of higher byte are always 0)
- %macro Descriptor 3
- dw %2 & 0FFFFh ; 段界限1
- dw %1 & 0FFFFh ; 段基址1
- db (%1 >> 16) & 0FFh ; 段基址2
- dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性1 + 段界限2 + 属性2
- db (%1 >> 24) & 0FFh ; 段基址3
- %endmacro ; 共 8 字节
复制代码
感谢~
|
|