16c32.asm

来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 159 行

ASM
159
字号
;************************************
;文件:16C32.asm                    *
;功能:演示Code16跟Code32之间的切换 *
;************************************

.386p
;----------------------
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
       
;===============================
Data Segment use16
	gdt0 Descriptor <>

	DataSel = $-gdt0
	DataDes Descriptor <0ffffh,,,92H,>
	
	CodeSel = $-gdt0
	CodeDes Descriptor <0ffffh,,,98H,>
	
	ProtSel = $-gdt0
	ProtDes Descriptor <0ffffh,,,4098H,>
		
	VideoSel = $-gdt0
	VideoDes Descriptor <0ffffh,8000H,0BH,92H,>
	
	GdtLen  = $-gdt0
	
	GdtPtr	dw GdtLen
			dd 0
			
	Mess16 db 'Now Is In Protect Mode Code 16',0
	Mess32 db 'Now Is In Protect Mode Code 32',0
Data ends
;================================
Protect32 segment use32		;32位保护模式代码段
	assume cs:Protect32
Begin:
    mov ax,DataSel
    mov ds,ax
    mov ax,VideoSel
    mov es,ax
    mov esi,offset Mess32	;显示Mess32
    mov edi,80*2
    cld
    mov ah,1eh
Load1:  lodsb
    cmp al,0
    jz OK
    stosw
    jmp Load1
OK:
    JUMP32 CodeSel,<offset ReadyToReal>
protect32 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				;初始化32位保护模式代码段描述符
	mov ax,Protect32
	shl eax,4
	mov ProtDes.basel,ax
	shr eax,16
	mov ProtDes.basem,al
	mov ProtDes.baseh,ah
	lgdt qword ptr GdtPtr	;Load GDT
	cli
	call EA20
	mov eax,cr0				;转到保护模式模式
	or eax,1
	mov cr0,eax
    JUMP16 CodeSEL,<offset Code16>
Code16:
	mov ax,DataSel
	mov ds,ax
	mov ax,VideoSel
	mov es,ax
	mov si,offset Mess16	;显示Mess16
	xor di,di
	cld
	mov ah,1eh
Load:
	lodsb
	cmp al,0
	jz ToCode32
	stosw
	jmp Load
ToCode32:
	JUMP16 ProtSel,0		;转到32位代码段
ReadyToReal:
	mov eax,cr0
	and eax,0fffffffeh
	mov cr0,eax
	JUMP16 <seg Real>,<offset Real>	;返回实模式
Real:
	call DA20
	sti
	mov ax,Data
	mov ds,ax
	mov es,ax
	mov ax,4c00h
	int 21h
;-----------------------------
EA20 PROC
	push ax
	in al,92h
	or al,2
	out 92h,al
	pop ax
	ret
EA20 ENDP
DA20 PROC
	push ax
	in al,92h
	and al,0fdh
	out 92h,al
	pop ax
	ret
DA20 ENDP
;----------------------
Code ends
	end Start

	

⌨️ 快捷键说明

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