|
楼主 |
发表于 2020-4-2 16:30:02
|
显示全部楼层
在《自己动手写操作系统中》有如下一段程序:
%include "pm.inc" ; 常量, 宏, 以及一些说明
ORG 0100H
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
程序执行到:MOV AX, CS处,CS似乎应该是0。因为CPU初始化后CS就是0,上面的程序似乎对CS并未做过修改。(除非“ORG 0100H”它能初始化CS为0100H,否则就是0),“MOV SS, AX”则把CS的值给了SS,似乎SS也是零,但在我的印象中SS好像应该指向栈底(高地址),可它却指向了低地址。“MOV SP, 0100H”没有问题,但似乎在程序开始时SS与SP指向一致的栈底0100H似乎更为妥当。
请高手门指点一二! |
|