本文主要是介绍pmtest5a_b(ring0到ring3_无tss),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文本比较
已生成: 2010-4-9 10:33:29
模式: 全部
左侧文件: C:Documents and Settings66_不思进取桌面下载os6631767673chapter3chapter3epmtest5a.asm
右侧文件: C:Documents and Settings66_不思进取桌面下载os6631767673chapter3chapter3epmtest5b.asm
; ========================================== | = | ; ========================================== |
; pmtest5a.asm |
| ; pmtest5a.asm |
; 编译方法:nasm pmtest5a.asm -o pmtest5a.com |
| ; 编译方法:nasm pmtest5a.asm -o pmtest5a.com |
; ========================================== |
| ; ========================================== |
|
|
|
%include "pm.inc" ; 常量, 宏, 以及一些说明 |
| %include "pm.inc" ; 常量, 宏, 以及一些说明 |
|
|
|
org 0100h |
| org 0100h |
jmp LABEL_BEGIN |
| jmp LABEL_BEGIN |
|
|
|
[SECTION .gdt] |
| [SECTION .gdt] |
; GDT |
| ; GDT |
; 段基址, 段界限 , 属性 |
| ; 段基址, 段界限 , 属性 |
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符 |
| LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符 |
LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; Normal 描述符 |
| LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; Normal 描述符 |
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_C+DA_32; 非一致代码段,32 |
| LABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_C+DA_32; 非一致代码段,32 |
LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C ; 非一致代码段,16 |
| LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C ; 非一致代码段,16 |
LABEL_DESC_CODE_DEST: Descriptor 0, SegCodeDestLen-1, DA_C+DA_32; 非一致代码段,32 |
| LABEL_DESC_CODE_DEST: Descriptor 0, SegCodeDestLen-1, DA_C+DA_32; 非一致代码段,32 |
LABEL_DESC_CODE_RING3: Descriptor 0,SegCodeRing3Len-1, DA_C+DA_32+DA_DPL3 |
| LABEL_DESC_CODE_RING3: Descriptor 0,SegCodeRing3Len-1, DA_C+DA_32+DA_DPL3 |
LABEL_DESC_DATA: Descriptor 0, DataLen-1, DA_DRW ; Data | <> | LABEL_DESC_DATA: Descriptor 0, DataLen-1, DA_DRW ; Data |
LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA+DA_32;Stack, 32 位 | = | LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA+DA_32;Stack, 32 位 |
LABEL_DESC_STACK3: Descriptor 0, TopOfStack3, DA_DRWA+DA_32+DA_DPL3 |
| LABEL_DESC_STACK3: Descriptor 0, TopOfStack3, DA_DRWA+DA_32+DA_DPL3 |
LABEL_DESC_LDT: Descriptor 0, LDTLen-1, DA_LDT ; LDT |
| LABEL_DESC_LDT: Descriptor 0, LDTLen-1, DA_LDT ; LDT |
|
|
|
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW+DA_DPL3 |
| LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW+DA_DPL3 |
|
|
|
; 门 目标选择子,偏移,DCount, 属性 |
| ; 门 目标选择子,偏移,DCount, 属性 |
LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate+DA_DPL0 | <> | LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate+DA_DPL3 |
; GDT 结束 | = | ; GDT 结束 |
|
|
|
GdtLen equ $ - LABEL_GDT ; GDT长度 |
| GdtLen equ $ - LABEL_GDT ; GDT长度 |
GdtPtr dw GdtLen - 1 ; GDT界限 |
| GdtPtr dw GdtLen - 1 ; GDT界限 |
dd 0 ; GDT基地址 |
| dd 0 ; GDT基地址 |
|
|
|
; GDT 选择子 |
| ; GDT 选择子 |
SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT |
| SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT |
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT |
| SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT |
SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT |
| SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT |
SelectorCodeDest equ LABEL_DESC_CODE_DEST - LABEL_GDT |
| SelectorCodeDest equ LABEL_DESC_CODE_DEST - LABEL_GDT |
SelectorCodeRing3 equ LABEL_DESC_CODE_RING3 - LABEL_GDT + SA_RPL3 |
| SelectorCodeRing3 equ LABEL_DESC_CODE_RING3 - LABEL_GDT + SA_RPL3 |
SelectorData equ LABEL_DESC_DATA - LABEL_GDT |
| SelectorData equ LABEL_DESC_DATA - LABEL_GDT |
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT |
| SelectorStack equ LABEL_DESC_STACK - LABEL_GDT |
SelectorStack3 equ LABEL_DESC_STACK3 - LABEL_GDT + SA_RPL3 |
| SelectorStack3 equ LABEL_DESC_STACK3 - LABEL_GDT + SA_RPL3 |
SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT |
| SelectorLDT equ LABEL_DESC_LDT - LABEL_GDT |
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT |
| SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT |
|
|
|
SelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDT | <> | SelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDT + SA_RPL3 |
; END of [SECTION .gdt] | = | ; END of [SECTION .gdt] |
|
|
|
[SECTION .data1] ; 数据段 |
| [SECTION .data1] ; 数据段 |
ALIGN 32 |
| ALIGN 32 |
[BITS 32] |
| [BITS 32] |
LABEL_DATA: |
| LABEL_DATA: |
SPValueInRealMode dw 0 |
| SPValueInRealMode dw 0 |
; 字符串 |
| ; 字符串 |
PMMessage: db "In Protect Mode now. ^-^", 0 ; 进入保护模式后显示此字符串 |
| PMMessage: db "In Protect Mode now. ^-^", 0 ; 进入保护模式后显示此字符串 |
OffsetPMMessage equ PMMessage - $$ |
| OffsetPMMessage equ PMMessage - $$ |
StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0 |
| StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0 |
OffsetStrTest equ StrTest - $$ |
| OffsetStrTest equ StrTest - $$ |
DataLen equ $ - LABEL_DATA |
| DataLen equ $ - LABEL_DATA |
; END of [SECTION .data1] |
| ; END of [SECTION .data1] |
|
|
|
|
|
|
; 全局堆栈段 |
| ; 全局堆栈段 |
[SECTION .gs] |
| [SECTION .gs] |
ALIGN 32 |
| ALIGN 32 |
[BITS 32] |
| [BITS 32] |
LABEL_STACK: |
| LABEL_STACK: |
times 512 db 0 |
| times 512 db 0 |
|
|
|
TopOfStack equ $ - LABEL_STACK - 1 |
| TopOfStack equ $ - LABEL_STACK - 1 |
|
|
|
; END of [SECTION .gs] |
| ; END of [SECTION .gs] |
|
|
|
; 堆栈段ring3 |
| ; 堆栈段ring3 |
[SECTION .s3] |
| [SECTION .s3] |
ALIGN 32 |
| ALIGN 32 |
[BITS 32] |
| [BITS 32] |
LABEL_STACK3: |
| LABEL_STACK3: |
times 512 db 0 |
| times 512 db 0 |
TopOfStack3 equ $ - LABEL_STACK3 - 1 |
| TopOfStack3 equ $ - LABEL_STACK3 - 1 |
; END of [SECTION .s3] |
| ; END of [SECTION .s3] |
|
|
|
[SECTION .s16] |
| [SECTION .s16] |
[BITS 16] |
| [BITS 16] |
LABEL_BEGIN: |
| LABEL_BEGIN: |
mov ax, cs |
| mov ax, cs |
mov ds, ax |
| mov ds, ax |
mov es, ax |
| mov es, ax |
mov ss, ax |
| mov ss, ax |
mov sp, 0100h |
| mov sp, 0100h |
|
|
|
mov [LABEL_GO_BACK_TO_REAL+3], ax |
| mov [LABEL_GO_BACK_TO_REAL+3], ax |
mov [SPValueInRealMode], sp |
| mov [SPValueInRealMode], sp |
|
|
|
; 初始化 16 位代码段描述符 |
| ; 初始化 16 位代码段描述符 |
mov ax, cs |
| mov ax, cs |
movzx eax, ax |
| movzx eax, ax |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_SEG_CODE16 |
| add eax, LABEL_SEG_CODE16 |
mov word [LABEL_DESC_CODE16 + 2], ax |
| mov word [LABEL_DESC_CODE16 + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_CODE16 + 4], al |
| mov byte [LABEL_DESC_CODE16 + 4], al |
mov byte [LABEL_DESC_CODE16 + 7], ah |
| mov byte [LABEL_DESC_CODE16 + 7], ah |
|
|
|
; 初始化 32 位代码段描述符 |
| ; 初始化 32 位代码段描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, cs |
| mov ax, cs |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_SEG_CODE32 |
| add eax, LABEL_SEG_CODE32 |
mov word [LABEL_DESC_CODE32 + 2], ax |
| mov word [LABEL_DESC_CODE32 + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_CODE32 + 4], al |
| mov byte [LABEL_DESC_CODE32 + 4], al |
mov byte [LABEL_DESC_CODE32 + 7], ah |
| mov byte [LABEL_DESC_CODE32 + 7], ah |
|
|
|
; 初始化测试调用门的代码段描述符 |
| ; 初始化测试调用门的代码段描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, cs |
| mov ax, cs |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_SEG_CODE_DEST |
| add eax, LABEL_SEG_CODE_DEST |
mov word [LABEL_DESC_CODE_DEST + 2], ax |
| mov word [LABEL_DESC_CODE_DEST + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_CODE_DEST + 4], al |
| mov byte [LABEL_DESC_CODE_DEST + 4], al |
mov byte [LABEL_DESC_CODE_DEST + 7], ah |
| mov byte [LABEL_DESC_CODE_DEST + 7], ah |
|
|
|
; 初始化数据段描述符 |
| ; 初始化数据段描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_DATA |
| add eax, LABEL_DATA |
mov word [LABEL_DESC_DATA + 2], ax |
| mov word [LABEL_DESC_DATA + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_DATA + 4], al |
| mov byte [LABEL_DESC_DATA + 4], al |
mov byte [LABEL_DESC_DATA + 7], ah |
| mov byte [LABEL_DESC_DATA + 7], ah |
|
|
|
; 初始化堆栈段描述符 |
| ; 初始化堆栈段描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_STACK |
| add eax, LABEL_STACK |
mov word [LABEL_DESC_STACK + 2], ax |
| mov word [LABEL_DESC_STACK + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_STACK + 4], al |
| mov byte [LABEL_DESC_STACK + 4], al |
mov byte [LABEL_DESC_STACK + 7], ah |
| mov byte [LABEL_DESC_STACK + 7], ah |
|
|
|
; 初始化堆栈段描述符(Ring3) |
| ; 初始化堆栈段描述符(Ring3) |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_STACK3 |
| add eax, LABEL_STACK3 |
mov word [LABEL_DESC_STACK3 + 2], ax |
| mov word [LABEL_DESC_STACK3 + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_STACK3 + 4], al |
| mov byte [LABEL_DESC_STACK3 + 4], al |
mov byte [LABEL_DESC_STACK3 + 7], ah |
| mov byte [LABEL_DESC_STACK3 + 7], ah |
|
|
|
; 初始化 LDT 在 GDT 中的描述符 |
| ; 初始化 LDT 在 GDT 中的描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_LDT |
| add eax, LABEL_LDT |
mov word [LABEL_DESC_LDT + 2], ax |
| mov word [LABEL_DESC_LDT + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_LDT + 4], al |
| mov byte [LABEL_DESC_LDT + 4], al |
mov byte [LABEL_DESC_LDT + 7], ah |
| mov byte [LABEL_DESC_LDT + 7], ah |
|
|
|
; 初始化 LDT 中的描述符 |
| ; 初始化 LDT 中的描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_CODE_A |
| add eax, LABEL_CODE_A |
mov word [LABEL_LDT_DESC_CODEA + 2], ax |
| mov word [LABEL_LDT_DESC_CODEA + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_LDT_DESC_CODEA + 4], al |
| mov byte [LABEL_LDT_DESC_CODEA + 4], al |
mov byte [LABEL_LDT_DESC_CODEA + 7], ah |
| mov byte [LABEL_LDT_DESC_CODEA + 7], ah |
|
|
|
; 初始化Ring3描述符 |
| ; 初始化Ring3描述符 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_CODE_RING3 |
| add eax, LABEL_CODE_RING3 |
mov word [LABEL_DESC_CODE_RING3 + 2], ax |
| mov word [LABEL_DESC_CODE_RING3 + 2], ax |
shr eax, 16 |
| shr eax, 16 |
mov byte [LABEL_DESC_CODE_RING3 + 4], al |
| mov byte [LABEL_DESC_CODE_RING3 + 4], al |
mov byte [LABEL_DESC_CODE_RING3 + 7], ah |
| mov byte [LABEL_DESC_CODE_RING3 + 7], ah |
|
|
|
; 为加载 GDTR 作准备 |
| ; 为加载 GDTR 作准备 |
xor eax, eax |
| xor eax, eax |
mov ax, ds |
| mov ax, ds |
shl eax, 4 |
| shl eax, 4 |
add eax, LABEL_GDT ; eax <- gdt 基地址 |
| add eax, LABEL_GDT ; eax <- gdt 基地址 |
mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 |
| mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址 |
|
|
|
; 加载 GDTR |
| ; 加载 GDTR |
lgdt [GdtPtr] |
| lgdt [GdtPtr] |
|
|
|
; 关中断 |
| ; 关中断 |
cli |
| cli |
|
|
|
; 打开地址线A20 |
| ; 打开地址线A20 |
in al, 92h |
| in al, 92h |
or al, 00000010b |
| or al, 00000010b |
out 92h, al |
| out 92h, al |
|
|
|
; 准备切换到保护模式 |
| ; 准备切换到保护模式 |
mov eax, cr0 |
| mov eax, cr0 |
or eax, 1 |
| or eax, 1 |
mov cr0, eax |
| mov cr0, eax |
|
|
|
; 真正进入保护模式 |
| ; 真正进入保护模式 |
jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处 |
| jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0 处 |
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
LABEL_REAL_ENTRY: ; 从保护模式跳回到实模式就到了这里 |
| LABEL_REAL_ENTRY: ; 从保护模式跳回到实模式就到了这里 |
mov ax, cs |
| mov ax, cs |
mov ds, ax |
| mov ds, ax |
mov es, ax |
| mov es, ax |
mov ss, ax |
| mov ss, ax |
|
|
|
mov sp, [SPValueInRealMode] |
| mov sp, [SPValueInRealMode] |
|
|
|
in al, 92h ; ┓ |
| in al, 92h ; ┓ |
and al, 11111101b ; ┣ 关闭 A20 地址线 |
| and al, 11111101b ; ┣ 关闭 A20 地址线 |
out 92h, al ; ┛ |
| out 92h, al ; ┛ |
|
|
|
sti ; 开中断 |
| sti ; 开中断 |
|
|
|
mov ax, 4c00h ; ┓ |
| mov ax, 4c00h ; ┓ |
int 21h ; ┛回到 DOS |
| int 21h ; ┛回到 DOS |
; END of [SECTION .s16] |
| ; END of [SECTION .s16] |
|
|
|
|
|
|
[SECTION .s32]; 32 位代码段. 由实模式跳入. |
| [SECTION .s32]; 32 位代码段. 由实模式跳入. |
[BITS 32] |
| [BITS 32] |
|
|
|
LABEL_SEG_CODE32: |
| LABEL_SEG_CODE32: |
mov ax, SelectorData |
| mov ax, SelectorData |
mov ds, ax ; 数据段选择子 |
| mov ds, ax ; 数据段选择子 |
mov ax, SelectorVideo |
| mov ax, SelectorVideo |
mov gs, ax ; 视频段选择子 |
| mov gs, ax ; 视频段选择子 |
|
|
|
mov ax, SelectorStack |
| mov ax, SelectorStack |
mov ss, ax ; 堆栈段选择子 |
| mov ss, ax ; 堆栈段选择子 |
|
|
|
mov esp, TopOfStack |
| mov esp, TopOfStack |
|
|
|
|
|
|
; 下面显示一个字符串 |
| ; 下面显示一个字符串 |
mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
| mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
xor esi, esi |
| xor esi, esi |
xor edi, edi |
| xor edi, edi |
mov esi, OffsetPMMessage ; 源数据偏移 |
| mov esi, OffsetPMMessage ; 源数据偏移 |
mov edi, (80 * 10 + 0) * 2 ; 目的数据偏移。屏幕第 10 行, 第 0 列。 |
| mov edi, (80 * 10 + 0) * 2 ; 目的数据偏移。屏幕第 10 行, 第 0 列。 |
cld |
| cld |
.1: |
| .1: |
lodsb |
| lodsb |
test al, al |
| test al, al |
jz .2 |
| jz .2 |
mov [gs:edi], ax |
| mov [gs:edi], ax |
add edi, 2 |
| add edi, 2 |
jmp .1 |
| jmp .1 |
.2: ; 显示完毕 |
| .2: ; 显示完毕 |
|
|
|
call DispReturn |
| call DispReturn |
|
|
|
push SelectorStack3 |
| push SelectorStack3 |
push TopOfStack3 |
| push TopOfStack3 |
push SelectorCodeRing3 |
| push SelectorCodeRing3 |
push 0 |
| push 0 |
retf |
| retf |
|
|
|
; 测试调用门(无特权级变换),将打印字母 'C' |
| ; 测试调用门(无特权级变换),将打印字母 'C' |
call SelectorCallGateTest:0 |
| call SelectorCallGateTest:0 |
;call SelectorCodeDest:0 |
| ;call SelectorCodeDest:0 |
|
|
|
; Load LDT |
| ; Load LDT |
mov ax, SelectorLDT |
| mov ax, SelectorLDT |
lldt ax |
| lldt ax |
|
|
|
jmp SelectorLDTCodeA:0 ; 跳入局部任务,将打印字母 'L'。 |
| jmp SelectorLDTCodeA:0 ; 跳入局部任务,将打印字母 'L'。 |
|
|
|
; ------------------------------------------------------------------------ |
| ; ------------------------------------------------------------------------ |
DispReturn: |
| DispReturn: |
push eax |
| push eax |
push ebx |
| push ebx |
mov eax, edi |
| mov eax, edi |
mov bl, 160 |
| mov bl, 160 |
div bl |
| div bl |
and eax, 0FFh |
| and eax, 0FFh |
inc eax |
| inc eax |
mov bl, 160 |
| mov bl, 160 |
mul bl |
| mul bl |
mov edi, eax |
| mov edi, eax |
pop ebx |
| pop ebx |
pop eax |
| pop eax |
|
|
|
ret |
| ret |
; DispReturn 结束--------------------------------------------------------- |
| ; DispReturn 结束--------------------------------------------------------- |
|
|
|
SegCode32Len equ $ - LABEL_SEG_CODE32 |
| SegCode32Len equ $ - LABEL_SEG_CODE32 |
; END of [SECTION .s32] |
| ; END of [SECTION .s32] |
|
|
|
|
|
|
[SECTION .sdest]; 调用门目标段 |
| [SECTION .sdest]; 调用门目标段 |
[BITS 32] |
| [BITS 32] |
|
|
|
LABEL_SEG_CODE_DEST: |
| LABEL_SEG_CODE_DEST: |
mov ax, SelectorVideo |
| mov ax, SelectorVideo |
mov gs, ax ; 视频段选择子(目的) |
| mov gs, ax ; 视频段选择子(目的) |
|
|
|
mov edi, (80 * 12 + 0) * 2 ; 屏幕第 12 行, 第 0 列。 |
| mov edi, (80 * 12 + 0) * 2 ; 屏幕第 12 行, 第 0 列。 |
mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
| mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
mov al, 'C' |
| mov al, 'C' |
mov [gs:edi], ax |
| mov [gs:edi], ax |
|
|
|
retf |
| retf |
|
|
|
SegCodeDestLen equ $ - LABEL_SEG_CODE_DEST |
| SegCodeDestLen equ $ - LABEL_SEG_CODE_DEST |
; END of [SECTION .sdest] |
| ; END of [SECTION .sdest] |
|
|
|
|
|
|
; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式 |
| ; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式 |
[SECTION .s16code] |
| [SECTION .s16code] |
ALIGN 32 |
| ALIGN 32 |
[BITS 16] |
| [BITS 16] |
LABEL_SEG_CODE16: |
| LABEL_SEG_CODE16: |
; 跳回实模式: |
| ; 跳回实模式: |
mov ax, SelectorNormal |
| mov ax, SelectorNormal |
mov ds, ax |
| mov ds, ax |
mov es, ax |
| mov es, ax |
mov fs, ax |
| mov fs, ax |
mov gs, ax |
| mov gs, ax |
mov ss, ax |
| mov ss, ax |
|
|
|
mov eax, cr0 |
| mov eax, cr0 |
and al, 11111110b |
| and al, 11111110b |
mov cr0, eax |
| mov cr0, eax |
|
|
|
LABEL_GO_BACK_TO_REAL: |
| LABEL_GO_BACK_TO_REAL: |
jmp 0:LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值 |
| jmp 0:LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值 |
|
|
|
Code16Len equ $ - LABEL_SEG_CODE16 |
| Code16Len equ $ - LABEL_SEG_CODE16 |
|
|
|
; END of [SECTION .s16code] |
| ; END of [SECTION .s16code] |
|
|
|
|
|
|
; LDT |
| ; LDT |
[SECTION .ldt] |
| [SECTION .ldt] |
ALIGN 32 |
| ALIGN 32 |
LABEL_LDT: |
| LABEL_LDT: |
; 段基址 段界限 , 属性 |
| ; 段基址 段界限 , 属性 |
LABEL_LDT_DESC_CODEA: Descriptor 0, CodeALen - 1, DA_C + DA_32 ; Code, 32 位 |
| LABEL_LDT_DESC_CODEA: Descriptor 0, CodeALen - 1, DA_C + DA_32 ; Code, 32 位 |
|
|
|
LDTLen equ $ - LABEL_LDT |
| LDTLen equ $ - LABEL_LDT |
|
|
|
; LDT 选择子 |
| ; LDT 选择子 |
SelectorLDTCodeA equ LABEL_LDT_DESC_CODEA - LABEL_LDT + SA_TIL |
| SelectorLDTCodeA equ LABEL_LDT_DESC_CODEA - LABEL_LDT + SA_TIL |
; END of [SECTION .ldt] |
| ; END of [SECTION .ldt] |
|
|
|
|
|
|
; CodeA (LDT, 32 位代码段) |
| ; CodeA (LDT, 32 位代码段) |
[SECTION .la] |
| [SECTION .la] |
ALIGN 32 |
| ALIGN 32 |
[BITS 32] |
| [BITS 32] |
LABEL_CODE_A: |
| LABEL_CODE_A: |
mov ax, SelectorVideo |
| mov ax, SelectorVideo |
mov gs, ax ; 视频段选择子(目的) |
| mov gs, ax ; 视频段选择子(目的) |
|
|
|
mov edi, (80 * 13 + 0) * 2 ; 屏幕第 13 行, 第 0 列。 |
| mov edi, (80 * 13 + 0) * 2 ; 屏幕第 13 行, 第 0 列。 |
mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
| mov ah, 0Ch ; 0000: 黑底 1100: 红字 |
mov al, 'L' |
| mov al, 'L' |
mov [gs:edi], ax |
| mov [gs:edi], ax |
|
|
|
; 准备经由16位代码段跳回实模式 |
| ; 准备经由16位代码段跳回实模式 |
jmp SelectorCode16:0 |
| jmp SelectorCode16:0 |
CodeALen equ $ - LABEL_CODE_A |
| CodeALen equ $ - LABEL_CODE_A |
; END of [SECTION .la] |
| ; END of [SECTION .la] |
|
|
|
; CodeRing3 |
| ; CodeRing3 |
[SECTION .ring3] |
| [SECTION .ring3] |
ALIGN 32 |
| ALIGN 32 |
[BITS 32] |
| [BITS 32] |
LABEL_CODE_RING3: |
| LABEL_CODE_RING3: |
mov ax, SelectorVideo |
| mov ax, SelectorVideo |
mov gs, ax |
| mov gs, ax |
| +- |
|
mov edi, (80 * 14 + 0) * 2 | = | mov edi, (80 * 14 + 0) * 2 |
mov ah, 0Ch |
| mov ah, 0Ch |
mov al, '3' |
| mov al, '3' |
mov [gs:edi], ax |
| mov [gs:edi], ax |
|
|
|
| -+ | call SelectorCallGateTest:0 |
|
|
|
jmp $ | = | jmp $ |
SegCodeRing3Len equ $ - LABEL_CODE_RING3 |
| SegCodeRing3Len equ $ - LABEL_CODE_RING3 |
; END of [SECTION .ring3] |
| ; END of [SECTION .ring3] |
|
|
|
这篇关于pmtest5a_b(ring0到ring3_无tss)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!