ttt.asm
来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 227 行
ASM
227 行
;**************************
;文件:Ttt.asm *
;功能:任务转换实例 *
;**************************
.386p
JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
;----------------------
CALL16 MACRO selector ,offsetv
DB 09AH
DW offsetv
DW selector
ENDM
;----------------------
Descriptor STRUC
limitl dw 0
basel dw 0
basem db 0
attributes dw 0
baseh db 0
Descriptor ENDS
;===============================
Data Segment use16
gdt0 Descriptor <>
DataSel = $-gdt0
DataDes Descriptor <0ffffh,,,92H,>
CodeSel = $-gdt0
CodeDes Descriptor <0ffffh,,,98H,>
Tss1Sel = $-gdt0 ;Tss1 Descriptor
Tss1Des Descriptor <Tss1Len-1,,,89H,>
Tss2Sel = $-gdt0 ;Tss1 Descriptor
Tss2Des Descriptor <Tss2Len-1,,,89H,>
Stack1Sel = $-gdt0
Stack1Des Descriptor <0,,,97H,>
Stack2Sel = $-gdt0+3
Stack2Des Descriptor <0,,,0F7H,>
Tss2CodeSel = $-gdt0+3
Tss2CodeDes Descriptor <0ffffh,,,0F8H,>
GdtLen = $-gdt0
GdtPtr dw GdtLen-1
dd 0
;+++++++++++++++++
Tss1 label byte
dd 0
dd 0 ;Stack Pointer for Ring 0
dw 0,0
dd 0 ;Stack Pointer for Ring 1
dw 0,0
dd 0 ;Stack Pointer for Ring 2
dw 0,0
dd 0 ;cr3
dd 0 ;eip
dd 0 ;eflags
dd ? ;eax
dd ? ;ecx
dd ? ;edx
dd ? ;ebx
dd ? ;esp
dd ? ;ebp
dd ? ;esi
dd ? ;edi
dw 0,0 ;es
dw 0,0 ;cs
dw 0,0 ;ss
dw 0,0 ;ds
dw 0,0 ;fs
dw 0,0 ;gs
dw 0,0 ;ldt
dw 0
dw $+2
db 0ffh
Tss1Len = $-Tss1
Tss2 label byte
dd 0 ;Link
dd 0 ;Stack Pointer for Ring 0
dw 0,0
dd 0 ;Stack Pointer for Ring 1
dw 0,0
dd 0 ;Stack Pointer for Ring 2
dw 0,0
dd 0 ;cr3
dw offset Tss2Begin,0 ;eip
dd 0 ;eflags
dd ? ;eax
dd ? ;ecx
dd ? ;edx
dd ? ;ebx
dd 1024 ;esp
dd ? ;ebp
dd ? ;esi
dd ? ;edi
dw 0,0 ;es
dw Tss2CodeSel,0 ;cs
dw Stack2Sel,0 ;ss
dw 0,0 ;ds
dw 0,0 ;fs
dw 0,0 ;gs
dw 0,0 ;ldt
dw 0
dw $+2
db 0ffh
Tss2Len = $-Tss2
;++++++++++++++++++++++++++++++
OldSPSS dw 0,0
Data ends
;==============================
Stack1 Segment use16
db 1024 dup (0)
Stack1 Ends
Stack2 Segment use16
db 1024 dup (0)
Stack2 Ends
;==============================
Tss2Code Segment use16
assume cs:Tss2Code
Tss2Begin:
iretd
Tss2Code Ends
;=============================
Code Segment use16
assume cs:Code,ds:Data
Start:
mov ax,Data
mov ds,ax
xor eax,eax
mov ax,Data
shl eax,4
mov dword ptr [GdtPtr+2],eax ;GDT地址
xor eax,eax ;初始化数据段描述符
mov ax,Code
shl eax,4
mov CodeDes.basel,ax
shr eax,16
mov CodeDes.basem,al
mov CodeDes.baseh,ah
mov ax,Data ;Tss1
movzx eax,ax
shl eax,4
xor ebx,ebx
mov bx,offset Tss1
add eax,ebx
mov Tss1Des.basel,ax
shr eax,16
mov Tss1Des.basem,al
mov Tss1Des.baseh,ah
mov ax,Data ;Tss2
movzx eax,ax
shl eax,4
xor ebx,ebx
mov bx,offset Tss2
add eax,ebx
mov Tss2Des.basel,ax
shr eax,16
mov Tss2Des.basem,al
mov Tss2Des.baseh,ah
mov ax,Stack1
movzx eax,ax ;Stack
shl eax,4
mov Stack1Des.basel,ax
shr eax,16
mov Stack1Des.basem,al
mov Stack1Des.baseh,ah
mov ax,Stack2
movzx eax,ax
shl eax,4
mov Stack2Des.basel,ax
shr eax,16
mov Stack2Des.basem,al
mov Stack2Des.baseh,ah
mov ax,Tss2Code ;Tss2Code
movzx eax,ax
shl eax,4
mov Tss2CodeDes.basel,ax
shr eax,16
mov Tss2CodeDes.basem,al
mov Tss2CodeDes.baseh,ah
lgdt fword ptr GdtPtr ;Load GDT
cli
mov OldSPSS,sp
mov [OldSPSS+2],ss
mov eax,cr0 ;转到保护模式模式
or eax,1
mov cr0,eax
JUMP16 CodeSEL,<offset Protect>
Protect:
mov ax,DataSel
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ax,Stack1Sel
mov ss,ax
mov sp,1024
mov ax,Tss1Sel
ltr ax
CALL16 Tss2Sel,0 ;任务切换
mov eax,cr0
and eax,0fffffffeH
mov cr0,eax
JUMP16 Code,<offset Real>
Real:
mov ax,data
mov ds,ax
lss sp,dword ptr OldSPSS
sti
mov ax,4C00H
int 21H
Code ends
end Start
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?