-
-
关于杨季问的实时模式转化为保护模式的
-
发表于:
2010-7-18 19:30
3732
-
参照8086,杨季问的实时模式转化为保护模式的代码
执行到LGDT FWORD PTR vgdtr(书上是qword,但编译通过不了,fword就行了),会自动退出..这是什么问题..不懂..问下大大们?
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
echoch macro ascii
mov ah,2
mov dl,ascii
int 21h
endm
descriptor struc
limitl dw 0
basel dw 0
basem db 0
attributes dw 0
baseh db 0
descriptor ends
pdesc struc
limit dw 0
base dd 0
pdesc ends
atdw = 92h
atce =98h
.386P
dseg segment use16
gdt label byte
dummy descriptor <>
code descriptor <0ffffh,,,atce,>
code_sel = code -gdt
datas descriptor <0ffffh,0h,11h,atdw,0>
datas_sel = datas-gdt
datad descriptor <0ffffh,,,atdw,>
datad_sel = datad-gdt
getlen =$-gdt
vgdtr pdesc <getlen-1,0>
bufferlen = 256
buffer db bufferlen dup(0)
dseg ends
cseg segment use16
assume cs:cseg,ds:dseg
start:
mov ax,dseg
mov ds,ax
mov bx,16
mul bx
add ax,offset gdt
adc dx,0
mov word ptr vgdtr.base,ax
mov word ptr vgdtr.base+2,dx
mov ax,cs
mul bx
mov code.basel,ax
mov code.basem,dl
mov code.baseh,dh
mov ax,ds
mul bx
add ax,offset buffer
adc dx,0
mov datad.basel,ax
mov datad.basem,dl
mov datad.baseh,dh
LGDT FWORD PTR vgdtr
cli
call enablea20
mov eax,cr0
or eax,1
mov cr0,eax
jump <code_sel>,<offset virtual>
virtual:
mov ax,datas_sel
mov ds,ax
mov ax,datad_sel
mov es,ax
cld
xor si,si
xor di,di
mov cx,bufferlen/4
repz movsd
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
jump <seg real>,<offset real>
real:
call disablea20
sti
mov ax,dseg
mov ds,ax
mov si,offset buffer
cld
mov bp,bufferlen/16
nextline:
mov cx,16
nextch:
lodsb
push ax
shr al,4
call toascii
echoch al
pop ax
call toascii
echoch al
echoch ' '
echoch 0dh
echoch 0ah
dec bp
jnz nextline
mov ax,4c00h
int 21h
toascii proc
and al,0fh
add al,90h
daa
add al,40h
daa
ret
toascii endp
enablea20 proc
push ax
in al,92h
or al,2
out 92h,al
pop ax
ret
enablea20 endp
disablea20 proc
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
ret
disablea20 endp
cseg ends
end start
执行到
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法