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 + -
显示快捷键?