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

📄 convert.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 ASM
字号:
;************************************
;文件:Conver.asm                   *
;功能:演示任务内控制转移和特权改变 *
;************************************
.386p
;----------------------
CALL32 MACRO selector ,offsetv
        DB 09AH
        DW offsetv
        DW 0
        DW selector
       ENDM
;-----------------------------
CALL16 MACRO selector ,offsetv
        DB 09AH
        DW offsetv
        DW selector
       ENDM

;----------------------
JUMP32 MACRO selector ,offsetv
        DB 0EAH
        DW offsetv
        DW 0
        DW selector
       ENDM
;----------------------
JUMP16 MACRO selector,offsetv
        DB 0EAH
        DW offsetv
        DW selector
       ENDM
;----------------------       
Descriptor STRUC
	limitl     dw 0
	basel	   dw 0
	basem 	   db 0
	attributes dw 0
	baseh      db 0
Descriptor ENDS
;---------------------- 
Gate STRUC
	offsetl  dw 0
	selector dw 0
	dcount   db 0
	gtype    db 0
	offseth  dw 0
Gate ENDS
       
;===============================
Data Segment use16
	gdt0 Descriptor <>                       ;GDT表开始

	DataSel = $-gdt0
	DataDes Descriptor <0ffffh,,,92H,>
	
	CodeSel = $-gdt0
	CodeDes Descriptor <0ffffh,,,98H,>
	
    Ring0Sel = $-gdt0
    Ring0Des Descriptor <0ffffh,,,4099H,>
	
	ShowPSel = $-gdt0                      ;DPL=3的调用门
    ShowPGat Gate <,Ring0Sel,0,0ECh,>

	VideoSel = $-gdt0
	VideoDes Descriptor <0ffffh,8000H,0BH,92H,>
                                               
	LdtSel = $-gdt0                         ;LDT描述符
	LdtDes Descriptor <LdtLen-1,,,82H,>

	TssSel = $-gdt0                         ;TSS描述符
	TssDes Descriptor <TssLen-1,,,89H,>

	GdtLen = $-gdt0
	
	GdtPtr	dw GdtLen-1
			dd 0

    Tss dd 0
        dd 1024         ;Ring 0 堆栈指针
		dw Stack0Sel,0
		dd 1024         ;Ring 1 堆栈指针
		dw Stack1Sel,0
		dd 1024         ;Ring 2 堆栈指针
		dw Stack2Sel,0
		dd 0            ;cr3
		dd ?            ;eip  
		dw ?,?          ;eflags
		dd ?            ;eax
		dd ?            ;ecx
		dd ?            ;edx
		dd ?            ;ebx
		dd ?            ;esp      ????
		dd ?            ;ebp
		dd ?            ;esi
		dd ?            ;edi
		dw ?,0          ;es
		dw ?,0          ;cs
		dw ?,0          ;ss
		dw ?,0          ;ds
		dw ?,0          ;fs
		dw ?,0          ;gs
		dw LdtSel,0     ;ldt
		dw 0            ;tss attrib
		dw $+2          ;IO map pointer
		db 0ffh         ;IO map end sign
	TssLen = $-Tss

	LdtTable label byte                     ;LDT表
        Stack0Sel = $-LdtTable+4+0
        Stack0Des Descriptor <0,,,97H,>

        Stack1Sel = $-LdtTable+4+1
        Stack1Des Descriptor <0,,,0B7H,> 
	
        Stack2Sel = $-LdtTable+4+2
        Stack2Des Descriptor <0,,,0D7H,>
	
        Stack3Sel = $-LdtTable+4+3
        Stack3Des Descriptor <0,,,0F7H,>

        Ring3Sel = $-LdtTable+4+3
        Ring3Des Descriptor<0ffffh,,,40F9H,>

        ToEndSel = $-LdtTable+4+3
        ToEndGat Gate <,CodeSel,0,0ECH,>

        LdtLen = $-LdtTable

        OldStack label dword
                dw ?
                dw ?
        Mess    db 'Now, Privilege is '
          M1    db 0,0
Data ends
;================================
Stack0 Segment para use32
        db 1024 dup (0)
Stack0 ends
Stack1 Segment para use32
	db 1024 dup (1)
Stack1 ends
Stack2 Segment para use32
	db 1024 dup (2)
Stack2 ends
Stack3 Segment para use32
	db 1024 dup (3)
Stack3 ends	
;================================
Ring0 Segment use32
    assume cs:Ring0,ds:Data
Ring0Begin:
    mov ax,TssSel
    ltr ax
    mov ax,LdtSel
    lldt ax
    mov ax,Stack0Sel
    mov ss,ax
    mov esp,1024
    mov edi,80*2*10
    Call32 ShowPSel,0
    push Dword ptr Stack3Sel    ;转到Ring 3
    push Dword ptr 1024
    push Dword ptr Ring3Sel
    push offset Ring3Begin
    retf
    
ShowPrivilege:					;显示特权级
    push ebp
    mov ebp,esp
    mov ax,DataSel
    mov ds,ax
    mov ax,VideoSel
    mov es,ax

    mov eax,[ebp+8]
    and al,3
    add al,'0'
    mov ebx,offset M1
    mov [ebx],al
    mov esi,offset Mess
    cld
    mov ah,1eh
Load1:  lodsb
    cmp al,0
    jz Return
    stosw
    jmp Load1
Return:
    pop ebp
    retf
Ring0 ends
;==============================
Ring3 Segment use32
    assume cs:Ring3,ds:Data
Ring3Begin:
    mov edi,80*2*12
    Call32 ShowPSel,0
    Call32 ToEndSel,0
Ring3 ends
;==============================
Code Segment use16
	assume cs:Code,ds:Data
Start:
	xor eax,eax
	mov ax,Data
	mov ds,ax
	shl eax,4
	mov dword ptr [GdtPtr+2],eax	
    mov DataDes.basel,ax    ;初始化数据段描述符
	shr eax,16
	mov DataDes.basem,al
	mov DataDes.baseh,ah
	xor eax,eax				;初始化代码段描述符
	mov ax,Code
	shl eax,4
	mov CodeDes.basel,ax
	shr eax,16
	mov CodeDes.basem,al
	mov CodeDes.baseh,ah
    xor eax,eax             ;初始化Ring0描述符
    mov ax,Ring0
	shl eax,4
    mov Ring0Des.basel,ax
	shr eax,16
    mov Ring0Des.basem,al
    mov Ring0Des.baseh,ah
	xor eax,eax              ;调用门
	mov eax,offset ShowPrivilege
	mov ShowPGat.offsetl,ax
	shr eax,16
	mov ShowPGat.offseth,ax
	xor eax,eax
	mov ax,offset ReadyToReal
	mov ToEndGat.offsetl,ax
	shr ax,16
    mov ToEndGat.offseth,ax
        xor eax,eax            ;初始化TSS描述符
    mov ax,Data
    shl eax,4
    add eax,offset Tss
    mov TssDes.basel,ax
    shr eax,16
    mov TssDes.basem,al
    mov TssDes.baseh,ah
    xor eax,eax                 ;初始化LDT描述符
    mov ax,Data
    shl eax,4
    add eax,offset LdtTable
    mov LdtDes.basel,ax
    shr eax,16
    mov LdtDes.basem,al
    mov LdtDes.baseh,ah
    xor eax,eax                  ;初始化所有堆栈描述符
	mov ax,Stack0
	shl eax,4
	mov Stack0Des.basel,ax
	shr eax,16
	mov Stack0Des.basem,al
	mov Stack0Des.baseh,ah
	xor eax,eax
	mov ax,Stack1
	shl eax,4
	mov Stack1Des.basel,ax
	shr eax,16
	mov Stack1Des.basem,al
	mov Stack1Des.baseh,ah
	xor eax,eax
	mov ax,Stack2
	shl eax,4
	mov Stack2Des.basel,ax
	shr eax,16
	mov Stack2Des.basem,al
	mov Stack2Des.baseh,ah
	xor eax,eax
	mov ax,Stack3
	shl eax,4
	mov Stack3Des.basel,ax
	shr eax,16
	mov Stack3Des.basem,al
	mov Stack3Des.baseh,ah
    xor eax,eax                  ;初始化Ring3描述符
    mov ax,Ring3
    shl eax,4
    mov Ring3Des.basel,ax
    shr eax,16
    mov Ring3Des.basem,al
    mov Ring3Des.baseh,ah
	
	lgdt qword ptr GdtPtr		  ;Load GDT
	cli
	mov word ptr [OldStack],sp
	mov word ptr [OldStack+2],ss

	mov eax,cr0				      ;转到保护模式模式
	or eax,1
	mov cr0,eax
    JUMP16 Ring0Sel,0
	
ReadyToReal:
    mov ax,DataSel
    mov ds,ax
    mov es,ax
	mov eax,cr0
	and eax,0fffffffeh
	mov cr0,eax
    JUMP16 Code,<offset Real> 
Real:
	mov ax,Data
	mov ds,ax
	lss sp,OldStack

	sti
	mov ax,4c00h
	int 21h
Code ends
    end Start

⌨️ 快捷键说明

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