+ -
当前位置:首页 → 问答吧 → 求助高手杨季文版80x86保护方式切换实例的问题

求助高手杨季文版80x86保护方式切换实例的问题

时间:2010-11-13

来源:互联网

杨季文版80x86实方式和保护方式切换实例1在DOS虚拟机上造成重启 无法正常运行代码如下,跪求求高手指点迷津啊~。
;T10-1.ASM
;功能:演示实方式和保护方式

;16位偏移的段间直接转移的宏定义
JUMP MACRO selector,offsetv
DB 0EAH ;操作码
DW offsetv ;16位偏移
DW selector ;段值或选择子
ENDM

ECHOCH MACRO ascii
MOV AH,2
MOV DL,ascii
INT 21H
ENDM

;存储段描述符结构定义
DESCRIPTOR STRUC
LIMITL DW 0 ;段界限0-15
BASEL DW 0 ;基地址0-15
BASEM DB 0 ; 16-23
ATTRIBUTES DW 0 ;段属性
BASEH DB 0 ;基地址 24-31
DESCRIPTOR ENDS

;伪描述符定义
PDESC STRUC
LIMITL DW 0 ;16位界限
BASE DD 0 ;32位基地址
PDESC ENDS

;常量定义
ATDW = 92H ;存在的可读写的数据段
ATCE = 98H ;存在的只执行的代码段

;
.386p 
;--------------------------------------------------
;数据段

DSEG SEGMENT USE16 ;16位段
GDT LABEL BYTE
DUMMY DESCRIPTOR <> ;空描述符
CODE DESCRIPTOR<0FFFFH,,,ATCE,>
CODE_SEL = CODE - GDT ;代码段的选择子
DATAS DESCRIPTOR<0FFFFH,0H,11H,ATDW,>
DATAS_SEL = DATAS-GDT ;源数据选择子
DATAD DESCRIPTOR<0FFFFH,,,ATDW,>
DATAD_SEL = DATAD-GDT ;目的段的选择子
GDTLEN = $-GDT
VGDTR PDESC<GDTLEN-1,>
;
BUFFERLEN =256 ;缓冲区长度
BUFFER DB BUFFERLEN DUP (0) ;缓冲区
DSEG ENDS
;--------------------------------------------------
;代码段
CSEG SEGMENT USE16
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX

;准备要加载到GDTR的伪描述符
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

;加载GDTR
LGDT QWORD PTR VGDTR
;
CLI ;关中断
CALL EA20 ;打开地址线A20
;切换到保护模式

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 DA20 ;关闭地址线20
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
ECHOCH AL
ECHOCH ''
LOOP NEXTCH
ECHOCH 0DH
ECHOCH 0AH
DEC BP
JNZ NEXTLINE

MOV AX,4C00H
INT 21H


TOASCII PROC

AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET

TOASCII ENDP

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
ADD AL,0FDH ;0FDH =N0T 20H
OUT 92H,AL
POP AX
DA20 ENDP

CSEG ENDS
END START

作者: zzwzzw0660   发布时间: 2010-11-13

LGDT FWORD PTR VGDTR

作者: leetow2003   发布时间: 2010-11-14

http://blog.sina.com.cn/s/blog_5f18ff880100min9.html

作者: leetow2003   发布时间: 2010-11-14

引用 1 楼 leetow2003 的回复:
LGDT FWORD PTR VGDTR

书里给印成 LGDT QWORD PTR VGDTR

作者: masmaster   发布时间: 2010-11-14