求助高手杨季文版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
;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 FWORD PTR VGDTR
书里给印成 LGDT QWORD PTR VGDTR
作者: masmaster 发布时间: 2010-11-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28