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