📄 pm2.asm
字号:
include debug.mac
.386P
descr struc
limit dw 0
base_l dw 0
base_m db 0
attr_l db 0
attr_2 db 0
base_h db 0
descr ends
trap struc
offs_1 dw 0
sel dw 16
rsrv db 0
attr db 8Fh
offs_h dw 0
trap ends
data segment
gdt_null descr <0,0,0,0,0,0>
gdt_data descr <data_size-1,0,0,92h>
gdt_code descr <code_size-1,,,98h>
gdt_stack descr <255,0,0,92h>
gdt_screen descr <4095,8000h,0Bh,92,0,0>
gdt_size=$-gdt_null
idt label word
exc0 trap <exc_0>
exc1 trap <exc_1>
exc2 trap <exc_2>
exc3 trap <exc_3>
exc4 trap <exc_4>
exc5 trap <exc_5>
exc6 trap <exc_6>
exc7 trap <exc_7>
exc8 trap <exc_8>
exc9 trap <exc_9>
exc0Ah trap <exc_0Ah>
exc0Bh trap <exc_0Bh>
exc0Ch trap <exc_0Ch>
exc0Dh trap <exc_0Dh>
exc0Eh trap <exc_0Eh>
exc0Fh trap <exc_0Fh>
exc10h trap <exc_10h>
exc11h trap <exc_11h>
idt_size=$-idt
pdescr dq 0
mes db 27,'[31;42m Back To Real Mode! ',27,'[0m$';(21)
tblhex db '0123456789ABCDEF'
string db '**** ****_**** ****_**** ****'
len=$-string
home_sel dw home
dw 10h
data_size=$-gdt_null
data ends
text segment 'code' use16
assume cs:text,ds:data
begin label word
exc_0 proc
mov ax,0
jmp dword ptr home_sel
exc_0 endp
exc_1 proc
mov ax,0
jmp dword ptr home_sel
exc_1 endp
exc_2 proc
mov ax,0
jmp dword ptr home_sel
exc_2 endp
exc_3 proc
mov ax,0
jmp dword ptr home_sel
exc_3 endp
exc_4 proc
mov ax,0
jmp dword ptr home_sel
exc_4 endp
exc_5 proc
mov ax,0
jmp dword ptr home_sel
exc_5 endp
exc_6 proc
mov ax,0
jmp dword ptr home_sel
exc_6 endp
exc_7 proc
mov ax,0
jmp dword ptr home_sel
exc_7 endp
exc_8 proc
mov ax,0
jmp dword ptr home_sel
exc_8 endp
exc_9 proc
mov ax,0
jmp dword ptr home_sel
exc_9 endp
exc_0Ah proc
mov ax,0
jmp dword ptr home_sel
exc_0Ah endp
exc_0Bh proc
mov ax,0
jmp dword ptr home_sel
exc_0Bh endp
exc_0Ch proc
mov ax,0
jmp dword ptr home_sel
exc_0Ch endp
exc_0Dh proc
mov ax,0
jmp dword ptr home_sel
exc_0Dh endp
exc_0Eh proc
mov ax,0
jmp dword ptr home_sel
exc_0Eh endp
exc_0Fh proc
mov ax,0
jmp dword ptr home_sel
exc_0Fh endp
exc_10h proc
mov ax,0
jmp dword ptr home_sel
exc_10h endp
exc_11h proc
mov ax,0
jmp dword ptr home_sel
exc_11h endp
main proc
xor eax,eax
mov ax,data
mov ds,ax
shl eax,4
mov ebp,eax
lea bx,gdt_data ;mov bx,offset gdt_data
mov [bx].base_l,ax
rol eax,16
mov [bx].base_m,al
xor eax,eax
mov ax,cs
shl eax,4
lea bx,gdt_code ;mov bx,offset gdt_code
mov [bx].base_l,ax
rol eax,16
mov [bx].base_m,al
xor eax,eax
mov ax,ss
shl eax,4
lea bx,gdt_stack ;mov bx,offset gdt_stack
mov [bx].base_l,ax
rol eax,16
mov [bx].base_m,al
mov dword ptr pdescr+2,ebp
mov word ptr pdescr,gdt_size-1
lgdt pdescr
cli
mov al,80h
out 70h,al
mov word ptr pdescr,idt_size-1
xor eax,eax
lea ax,idt ;mov ax,offset idt
add eax,ebp
mov dword ptr pdescr+2,eax
lidt pdescr
mov eax,cr0
or eax,1
mov cr0,eax
db 0EAh
dw offset continue
dw 16
continue: mov ax,8
mov ds,ax
mov ax,24
mov ss,ax
mov ax,32
mov es,ax
mov cx,300
mov bx,2720
mov dx,3001h
xxxx: push cx
mov cx,0
zzzz: loop zzzz
mov es:[bx],dx
inc dl
add bx,2
pop cx
loop xxxx
mov ax,0FFFFh
home: lea si,string ; mov si,offset string
debug
lea si,string ; mov si,offset string
mov cx,len
mov ah,74h
mov di,1600
scr: lodsb
stosw
loop scr
mov gdt_data.limit,0FFFFh
mov gdt_code.limit,0FFFFh
mov gdt_stack.limit,0FFFFh
mov gdt_screen.limit,0FFFFh
mov ax,8
mov ds,ax
mov ax,24
mov ss,ax
mov ax,32
mov es,ax
db 0EAh
dw offset go
dw 16
go: mov eax,cr0
and eax,0FFFFFFFEh
mov cr0,eax
db 0EAh
dw offset return
dw text
return: mov ax,data
mov ds,ax
mov ax,stk
mov ss,ax
mov ax,3FFh
mov word ptr pdescr,ax
mov eax,0
mov dword ptr pdescr+2,eax
lidt pdescr
sti
mov al,0
out 70h,al
mov ah,09h
lea dx,mes ;mov dx,offset mes
int 21h
mov ax,4c00h
int 21h
main endp
code_size=$-main
text ends
stk segment stack 'stack'
db 256 dup ('^')
stk ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -