pmtest5a_b(ring0到ring3_无tss)

2024-04-11 15:08
文章标签 tss ring3 ring0 pmtest5a

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894426

相关文章

Ring3枚举进程

在Ring3枚举进程通常有一下几种方法: ToolHelper32PsapiZwQuerySystemInformationWTSEnumerateProcesses 一、ToolHelper32 头文件:TlHelp32.h 关键函数:CreateToolhelp32Snapshot,Process32Next BOOL EnumProces

浅析ring3下对抗08瑞星主动防御

<script src="http://www.hookbase.com/Article/GetHits.asp?ArticleID=15534" language="javascript" type="text/javascript"></script> 骇客基地 阅读:50 时间:2007-12-21 12:53:51 来源:www.hookbase.com 注:文章已经发表在200

SSDT Hook的妙用-对抗ring0 inline hook

SSDT Hook的妙用-对抗ring0 inline hook(转) 1,SSDT      SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章):      typedef struct _SYSTEM_SERVICE_TABLE      {        PVOID   ServiceTableBase;

雷卯推荐电磁兼容保护器件-TSS半导体放电管

一、TSS的简介 半导体放电管, 简称TSS。TSS 是根据可控硅原理采用离子注入技术生产的一种新型保护器件,具有精确导通、快速响应(响应时间ns级)、浪涌吸收能力较强、双向对称、可靠性高等特点。 由于其浪涌通流能力较同尺寸的TVS管强,可在无源电路中代替TVS管使用。 但它的导通特性接近于短路,不能直接用于有源电路中,在这样的电路中使用时必须加限流组件,使其续流小于最小维持电流。 半导

手写简易操作系统(八)--特权级以及TSS

前情提要 我们在这里梳理一下上面几节讲的内容 首先是计算机开机,BIOS接过第一棒,将第一个扇区MBR的内容导入到内存 0x7c00 的位置。 然后就是MBR中我们自己写的内容,将Loader导入到 0x600 的地址,Loader设置了GDT,打开了保护模式,并且开启了内存分页。最后将内核载入到内存的 0xc0001500 的位置,也就是物理内存 0x1500 的位置。 这一节没有代码,

x86中的TSS与任务切换

前言 今天在学习《深入理解Linux内核》的时候,发现出现了一个新的名词TSS(Task-State Segment),这还是我第一次了解到原来x86提供了硬件级别的任务切换功能,之前以为任务切换都是操作系统实现的来着,这里也记录一下我的发现。 参考资料 Intel白皮书的Volume 3A Chapter 8: Task Management 什么是TSS TSS是一块特殊的内存区域,

2017.05.19回顾 TSS = ESS + RSS证明

1、对风控描述文档进行了修改,交付给了相关同事 2、然后就是把Ken的接口加入到合作方决策引擎中,没什么问题,还是老套路,只是对于AS前置模型的情况进行了一些小处理 3、下午我记得还Henry微信沟通了一下,放宽了AS某个渠道的客户 4、下午还研究了手机三要素的问题,发现根本就没拉3A的手机三要素,然后又是一番沟通,过程中也了解到3A的一些库表结构 5、下午的另外一半时间都是集中在领悟线性

适合无线通信设备应用 TSS-53LNB+、TSS-53LNB3+、TSS-183A+、TSS-13LN+、TSS-23LN+低噪声、增益放大器【RF】

1、TSS-53LNB+ 射频放大器 IC 通用 500MHz 至5GHz,12MCLP TSS-53LNB+(符合RoHS标准)是一款先进的超平坦增益低噪声宽带放大器,采用E-PHEMT技术制造,在宽频率范围内提供极高的动态范围。它集成了开关,使用户能够在高信号条件下旁路放大器。此外,TSS-53LNB+在宽频率范围内具有良好的输入和输出回损,无需外部匹配元件。它采用12引脚3x3 mm

【笔记】RING0 与 RING3之间的简单交互

RING0 与 RING3之间的简单交互          叫简单交互的原因是,只从ring3传给ring0一个变量的值,不涉及到锁事件的问题(有点像多线程的那个东东...)。这里我使用了最简单的例子,就是SSDT HOOK NtOpenProcess. ring3的应用程序将自己的PID传给ring0的驱动,驱动hook NtOpenProcess之后就无法从任务管理器终止应用程序了。

matlab GOCI水色数据画TSS变化过程+批量读取.he5文件

下载地址: http://kosc.kiost.ac.kr/eng/ clear all;close all;clc%% 读取经纬度file='COMS_GOCI_L2P_GA_20110524031644.LON_1.he5';LON=h5read(file,'/HDFEOS/GRIDS/Image Data/Data Fields/Longitud