⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s10_05.htm

📁 Programmer s Reference Manual is an improtant book on Intel processor architecture and programming.
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><HTML><HEAD><TITLE>80386 Programmer's Reference Manual -- Section 10.5</TITLE></HEAD><BODY><B>up:</B> <A HREF="c10.htm">Chapter 10 -- Initialization</A><BR><B>prev:</B> <A HREF="s10_04.htm">10.4  Software Initialization for Protected Mode</A><BR><B>next:</B> <A HREF="s10_06.htm">10.6  TLB Testing</A><P><HR><P><H1>10.5  Initialization Example</H1><PRE>$TITLE ('Initial Task')NAME    INITinit_stack  SEGMENT RWDW  20  DUP(?)tos         LABEL   WORDinit_stack  ENDSinit_data   SEGMENT RW PUBLICDW  20  DUP(?)init_data   ENDSinit_code   SEGMENT ER PUBLICASSUME      DS:init_datanopnopnopinit_start:; set up stackmov ax, init_stackmov ss, axmov esp, offset tosmov a1,1blink:xor a1,1out 0e4h,a1mov cx,3FFFhhere:dec cxjnz herejmp SHORT blinkhltinit_code   endsEND init_start, SS:init_stack, DS:init_data$TITLE('Protected Mode Transition -- 386 initialization')NAME  RESET;*****************************************************************; Upon reset the 386 starts executing at address 0FFFFFFF0H.  The; upper 12 address bits remain high until a FAR call or jump is; executed.;; Assume the following:;;; -  a short jump at address 0FFFFFFF0H (placed there by the;    system builder) causes execution to begin at START in segment;    RESET_CODE.;;; -  segment RESET_CODE is based at physical address 0FFFF0000H,;    i.e.   at the start of the last  64K in the 4G address space.;    Note that  this is the base of the CS register at reset.  If;    you locate ROMcode above  this  address,  you  will  need  to;    figure out an adjustment factor to address things within this;    segment.;;*****************************************************************$EJECT ;; Define addresses to locate GDT and IDT in RAM.; These addresses are also used in the BLD386 file that defines; the GDT and IDT. If you change these addresses, make sure you; change the base addresses specified in the build file.GDTbase         EQU    00001000H   ; physical address for GDT baseIDTbase         EQU    00000400H   ; physical address for IDT basePUBLIC     GDT_EPROMPUBLIC     IDT_EPROMPUBLIC     STARTDUMMY      segment rw      ; ONLY for ASM386 main module stack initDW 0DUMMY   ends;*****************************************************************;; Note: RESET CODE must be USEl6 because the 386 initally executes;       in real mode.;RESET_CODE segment er PUBLIC    USE16ASSUME DS:nothing, ES:nothing;; 386 Descriptor templateDESC       STRUClim_0_15    DW  0              ; limit bits (0..15)bas_0_15    DW  0              ; base bits (0..15)bas_16_23   DB  0              ; base bits (16..23)access      DB  0              ; access bytegran        DB  0              ; granularity bytebas_24_31   DB  0              ; base bits (24..31)DESC       ENDS; The following is the layout of the real GDT created by BLD386.; It is located in EPROM and will be copied to RAM.;; GDT[O]      ...  NULL; GDT[1]      ...  Alias for RAM GDT; GDT[2]      ...  Alias for RAM IDT; GDT[2]      ...  initial task TSS; GDT[3]      ...  initial task TSS alias; GDT[4]      ...  initial task LDT; GDT[5]      ...  initial task LDT alias;; define entries in GDT and IDT.GDT_ENTRIES    EQU    8IDT_ENTRIES    EQU    32; define some constants to index into the real GDTGDT_ALIAS      EQU    1*SIZE DESCIDT_ALIAS      EQU    2*SIZE DESCINIT_TSS       EQU    3*SIZE DESCINIT_TSS_A     EQU    4*SIZE DESCINIT_LDT       EQU    5*SIZE DESCINIT_LDT_A     EQU    6*SIZE DESC;; location of alias in INIT_LDTINIT_LDT_ALIAS    EQU    1*SIZE DESC;; access rights byte for DATA and TSS descriptorsDS_ACCESS   EQU   010010010BTSS_ACCESS  EQU   010001001B;; This temporary GDT will be used to set up the real GDT in RAM.Temp_GDT    LABEL   BYTE        ; tag for begin of scratch GDTNULL_DES    DESC <>             ; NULL descriptor; 32-Gigabyte data segment based at 0FLAT_DES    DESC <0FFFFH,0,0,92h,0CFh,0>GDT_eprom     DP    ?           ; Builder places GDT address and limit; in this 6 byte area.IDT_eprom     DP    ?           ; Builder places IDT address and limit; in this 6 byte area.;; Prepare operand for loadings GDTR and LDTR.TGDT_pword     LABEL  PWORD                 ; for temp GDTDW     end_Temp_GDT_Temp_GDT -1DD     0GDT_pword      LABEL  PWORD                 ; for GDT in RAMDW     GDT_ENTRIES * SIZE DESC -1DD     GDTbaseIDT_pword      LABEL   PWORD                ; for IDT in RAMDW     IDT_ENTRIES * SIZE DESC -1DD     IDTbaseend_Temp_GDT   LABEL   BYTE;; Define equates for addressing convenience.GDT_DES_FLAT        EQU DS:GDT_ALIAS +GDTbaseIDT_DES_FLAT        EQU DS:IDT_ALIAS +GDTbaseINIT_TSS_A_OFFSET   EQU DS:INIT_TSS_AINIT_TSS_OFFSET     EQU DS:INIT_TSSINIT_LDT_A_OFFSET   EQU DS:INIT_LDT_AINIT_LDT_OFFSET     EQU DS:INIT_LDT; define pointer for first task switchENTRY POINTER LABEL DWORDDW 0, INIT_TSS;******************************************************************;;   Jump from reset vector to here.START:CLI                ;disable interruptsCLD                ;clear direction flagLIDT    NULL_des   ;force shutdown on errors;;   move scratch GDT to RAM at physical 0XOR DI,DIMOV ES,DI           ;point ES:DI to physical location 0MOV SI,OFFSET Temp_GDTMOV CX,end_Temp_GDT-Temp_GDT        ;set byte countINC CX;;   move tableREP MOVS BYTE PTR ES:[DI],BYTE PTR CS:[SI]LGDT    tGDT_pword                ;load GDTR for Temp. GDT;(located at 0);   switch to protected modeMOV EAX,CR0                       ;get current CROMOV EAX,1                         ;set PE bitMOV CRO,EAX                       ;begin protected mode;;   clear prefetch queueJMP SHORT flushflush:; set DS,ES,SS to address flat linear space (0 ... 4GB)MOV BX,FLAT_DES-Temp_GDTMOV US,BXMOV ES,BXMOV SS,BX;; initialize stack pointer to some (arbitrary) RAM locationMOV ESP, OFFSET end_Temp_GDT;; copy eprom GDT to RAMMOV ESI,DWORD PTR GDT_eprom +2 ; get base of eprom GDT; (put here by builder).MOV EDI,GDTbase                ; point ES:EDI to GDT base in RAM.MOV CX,WORD PTR gdt_eprom +0   ; limit of eprom GDTINC CXSHR CX,1                       ; easier to move wordsCLDREP MOVS   WORD PTR ES:[EDI],WORD PTR DS:[ESI];; copy eprom IDT to RAM;MOV ESI,DWORD PTR IDT_eprom +2 ; get base of eprom IDT; (put here by builder)MOV EDI,IDTbase                ; point ES:EDI to IDT base in RAM.MOV CX,WORD PTR idt_eprom +0   ; limit of eprom IDTINC CXSHR CX,1CLDREP MOVS   WORD PTR ES:[EDI],WORD PTR DS:[ESI]; switch to RAM GDT and IDT;LIDT IDT_pwordLGDT GDT_pword;MOV BX,GDT_ALIAS               ; point DS to GDT aliasMOV DS,BX;; copy eprom TSS to RAM;MOV BX,INIT_TSS_A              ; INIT TSS A descriptor base; has RAM location of INIT TSS.MOV ES,BX                      ; ES points to TSS in RAMMOV BX,INIT_TSS                ; get inital task selectorLAR DX,BX                      ; save access byteMOV [BX].access,DS_ACCESS      ; set access as data segmentMOV FS,BX                      ; FS points to eprom TSSXOR si,si                      ; FS:si points to eprom TSSXOR di,di                      ; ES:di points to RAM TSSMOV CX,[BX].lim_0_15           ; get count to moveINC CX;; move INIT_TSS to RAM.REP MOVS BYTE PTR ES:[di],BYTE PTR FS:[si]MOV [BX].access,DH             ; restore access byte;; change base of INIT TSS descriptor to point to RAM.MOV AX,INIT_TSS_A_OFFSET.bas_0_15MOV INIT_TSS_OFFSET.bas_0_15,AXMOV AL,INIT_TSS_A_OFFSET.bas_16_23MOV INIT_TSS_OFFSET.bas_16_23,ALMOV AL,INIT_TSS_A_OFFSET.bas_24_31MOV INIT_TSS_OFFSET.bas_24_31,AL;; change INIT TSS A to form a save area for TSS on first task; switch. Use RAM at location 0.MOV BX,INIT_TSS_AMOV WORD PTR [BX].bas_0_15,0MOV [BX].bas_16_23,0MOV [BX].bas_24_31,0MOV [BX].access,TSS_ACCESSMOV [BX].gran,OLTR BX                         ; defines save area for TSS;; copy eprom LDT to RAMMOV BX,INIT_LDT_A              ; INIT_LDT_A descriptor has; base address in RAM for INIT_LDT.MOV ES,BX                      ; ES points LDT location in RAM.MOV AH,[BX].bas_24_31MOV AL,[BX].bas_16_23SHL EAX,16MOV AX,[BX].bas_0_15           ; save INIT_LDT base (ram) in EAXMOV BX,INIT_LDT                ; get inital LDT selectorLAR DX,BX                      ; save access rightsMOV [BX].access,DS_ACCESS      ; set access as data segmentMOV FS,BX                      ; FS points to eprom LDTXOR si,si                      ; FS:SI points to eprom LDTXOR di,di                      ; ES:DI points to RAM LDTMOV CX,[BX].lim_0_15           ; get count to moveINC CX;; move initial LDT to RAMREP MOVS BYTE PTR ES:[di],BYTE PTR FS:[si]MOV [BX].access,DH             ; restore access rights in; INIT_LDT descriptor;; change base of alias (of INIT_LDT) to point to location in RAM.MOV ES:[INIT_LDT_ALIAS].bas_0_15,AXSHR EAX,16MOV ES:[INIT_LDT_ALIAS].bas_16_23,ALMOV ES:[INIT_LDT_ALIAS].bas_24_31,AH;; now set the base value in INIT_LDT descriptorMOV AX,INIT_LDT_A_OFFSET.bas_0_15MOV INIT_LDT_OFFSET.bas_0_15,AXMOV AL,INIT_LDT_A_OFFSET.bas_16_23MOV INIT_LDT_OFFSET.bas_16_23,ALMOV AL,INIT_LDT_A_OFFSET.bas_24_31MOV INIT_LDT_OFFSET.bas_24_31,AL;; Now GDT, IDT, initial TSS and initial LDT are all set up.;; Start the first task!'JMP ENTRY_POINTERRESET_CODE endsEND START, SS:DUMMY,DS:DUMMY</PRE><P><HR><P><B>up:</B> <A HREF="c10.htm">Chapter 10 -- Initialization</A><BR><B>prev:</B> <A HREF="s10_04.htm">10.4  Software Initialization for Protected Mode</A><BR><B>next:</B> <A HREF="s10_06.htm">10.6  TLB Testing</A></BODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -