📄 convert.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 + -