本文主要是介绍文本比较pmtest3 4(ldt gate),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文本比较pmtest2 pmtest3 (进阶和ldt)已生成: 2010-4-7 22:44:31
模式: 全部
左侧文件: C:Documents and Settings66_不思进取桌面下载os6631767673chapter3chapter3dpmtest4.asm
右侧文件: C:Documents and Settings66_不思进取桌面下载os6631767673chapter3chapter3cpmtest3.asm
; ========================================== | = | ; ========================================== |
; pmtest4.asm | <> | ; pmtest3.asm |
; 编译方法:nasm pmtest4.asm -o pmtest4.com | ; 编译方法:nasm pmtest3.asm -o pmtest3.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_DATA: Descriptor 0, DataLen-1, DA_DRW ; Data | LABEL_DESC_DATA: Descriptor 0, DataLen - 1, DA_DRW+DA_DPL1 ; 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_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 ; 显存首地址 | LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址 | |
; 门 目标选择子,偏移,DCount, 属性 | ||
LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate+DA_DPL0 | ||
; 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 | +- | |
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 | |
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 | ||
; 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] | |
[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 | ||
mov ax, cs | ||
shl eax, 4 | ||
add eax, LABEL_SEG_CODE_DEST | ||
mov word [LABEL_DESC_CODE_DEST + 2], ax | ||
shr eax, 16 | ||
mov byte [LABEL_DESC_CODE_DEST + 4], al | ||
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 | |
; 初始化 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 | |
; 为加载 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 | |
; 测试调用门(无特权级变换),将打印字母 'C' | +- | |
call SelectorCallGateTest: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 ; 跳入局部任务 |
= | ||
; ------------------------------------------------------------------------ | ; ------------------------------------------------------------------------ | |
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]; 调用门目标段 | ||
[BITS 32] | ||
LABEL_SEG_CODE_DEST: | ||
;jmp $ | ||
mov ax, SelectorVideo | ||
mov gs, ax ; 视频段选择子(目的) | ||
mov edi, (80 * 12 + 0) * 2 ; 屏幕第 12 行, 第 0 列。 | ||
mov ah, 0Ch ; 0000: 黑底 1100: 红字 | ||
mov al, 'C' | ||
mov [gs:edi], ax | ||
retf | ||
SegCodeDestLen equ $ - LABEL_SEG_CODE_DEST | ||
; 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 * 12 + 0) * 2 ; 屏幕第 10 行, 第 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] |
这篇关于文本比较pmtest3 4(ldt gate)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!