80x86(杨季文)一书,实例1。

sum_1 2002-11-06 12:17:36

.386P
INCLUDE 386SCD.ASM

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


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

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
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 VGDTR
CLI
CALL ENABLEA20
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 <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
MOV EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP16<SEG REAL>,<OFFSET REAL>
REAL:
CALL DISABLEA20
STI
;MOV AX,DSEG
;MOV DS,AX

MOV AH,4C
INT 21H


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




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

CSEG ENDS
END START


功能是从实模式进入保护模式,什么也不做再回到实模式,可是每次执行到MOV CR0,EAX时机器总是
重启(CR0:PG=0,PE=1,ET=1)GDT的装载经调试是正确的,不知是哪里不对。




;文件名:386SCD.ASM
;内 容:符号常量等的定义(用于保护模式)
;详细注释见80x86汇编(杨季文)一书,p403页

;..........................
;存储段和系统段描述符
DESCRIPTOR STRUC
LIMITL DW 0
BASEL DW 0
BASEM DB 0
ATTRIBUTES DW 0
BASEH DB 0

DESCRIPTOR ENDS
;.........................
;门描述符
GATE STRUC
OFFSETL DW 0
SELECTOR DW 0
DCOUNT DB 0
GTYPE DB 0
OFFSETH DW 0
GATE ENDS
;.........................
;伪描述符
PDESC STRUC
LIMIT DW 0
BASE DD 0
PDESC ENDS
;.........................

;TSS任务状态段内容
TASKSS STRUC
TRLINK DW ?,0
TRESP0 DD ?
TRSS0 DW ?,0
TRESP1 DD ?
TRSS1 DW ?,0
TRESP2 DD ?
TRSS2 DW ?,0
TRCR3 DD ?
TREIP DD ?
TREFLAG DW ?,?
TREAX DD ?
TRECX DD ?
TREDX DD ?
TREBX DD ?
TRESP DD ?
TREBP DD ?
TRESI DD ?
TREDI DD ?
TRES DW ?,0
TRCS DW ?,0
TRSS DW ?,0
TRDS DW ?,0
TRFS DW ?,0
TRGS DW ?,0
TRLDT DW ?,0
TRFLAG DW 0
TRIOMAP DW $+2
TASKSS ENDS
;..........................
;存储段描述符类型值说明
ATDR =90H
ATDW =92H
ATDWA =93H
ATCE =98H
ATCER =9AH
ATCCO =9CH
ATCCOR =9EH
;系统段描述符和门描述符类型值说明
ATLDT =82H
ATTASKGAT =85H
AT386TSS =89H
AT386CGAT =8CH
AT386IGAT =8EH
AT386TGAT =8FH
;DPL和RPL值说明
;..........................

DPL1 =20H
DPL2 =40H
DPL3 =60H
RPL1 =01H
RPL2 =02H
RPL3 =03H
IOPL1 =1000H
IOPL2 =2000H
IOPL3 =3000H
;.............................



;其它常量说明
D32 =4000H
TIL =04H
VMFL =0002H
IFL =0200H
;.............................

;段间转移及段间调用宏
JUMP32 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW 0
DW selector
ENDM
CALL32 MACRO selector,offsetv
DB 09AH
DW offsetv
DW 0
DW selector
ENDM

JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
CALL16 MACRO selector,offsetv
DB 9AH
DW offsetv
DW selector
ENDM

;................................



...全文
32 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
RichardStevens 2002-12-26
  • 打赏
  • 举报
回复
关注!
sum_1 2002-12-26
  • 打赏
  • 举报
回复
我在WIN98,用SoftIce对VXD的服务调用进行跟踪时也发生同样的情况?
970361 2002-12-18
  • 打赏
  • 举报
回复
关注
xxxxy 2002-12-17
  • 打赏
  • 举报
回复
就是说,进入保护模式之后,不能用调试软件来调试,你让程序直接运行试试,如果正常退出说明没问题,否则就检查程序,可能输入错了.
sum_1 2002-12-17
  • 打赏
  • 举报
回复
还没说清是怎么回事哪,
giantzz 2002-12-16
  • 打赏
  • 举报
回复
结贴吧
giantzz 2002-12-15
  • 打赏
  • 举报
回复
to sum_1(正在喝水):
怎么又扯到流水线技术,你要知道流水线技术中一个时钟内执行两条指令是有条件的,即两条指令的执行必须无依赖性.
atm2001 2002-12-15
  • 打赏
  • 举报
回复
MOV CR0,EAX执行后就已经到保护模式啦,寻址方式已改变,
????
mov cr0,eax只是设置了实模式到保护模式的寻址开始,此时还在实模式下

需要jump16只不过是跳到保护模式代码而已。jump16本身也是一个宏,它其实是0eah(jump),selector,offset。显然他是一个保护模式的跳转。
这个说法比较好理解。
djygrdzh 2002-11-24
  • 打赏
  • 举报
回复
我从书上知道 MOV CR0,EAX执行后还是在实模式下,只有执行了JUMP16后(清指令预取队列,置CS),才进入了保护模式.
MOV CR0,EAX执行后就已经到保护模式啦,寻址方式已改变,需要jump16只不过是跳到保护模式代码而已。jump16本身也是一个宏,它其实是0eah(jump),selector,offset。显然他是一个保护模式的跳转。
sum_1 2002-11-24
  • 打赏
  • 举报
回复
我从书上知道 MOV CR0,EAX执行后还是在实模式下,只有执行了JUMP16后(清指令预取队列,置CS),才进入了保护模式.
你的意思是不是CV是单步调试,而实际情况是在一个时钟周期内同时完成以上二条指令(流水线技术).
如我说的不对请在详细解释一下.

giantzz 2002-11-23
  • 打赏
  • 举报
回复
to Asimov(阿西莫夫):
这个例子没问题,是你理解的有问题
to sum_1(正在喝水):
这个程序本身当然符合规定(如果你在运行时出现问题,请核对代码),我是指你想把CV也带到保护模式时不符合规定,因为MOV CR0,EAX后的指令还在实模式下(指令队列中),不要以为该指令后就是JUMP16 <CODE_SEL>,<OFFSET VIRTUAL>,这是运行时的情况;调试时CV等调试工具还要用单步中断来显示一条指令执行后的各寄存器的情况.而这单步中断... 你明白了吗
Asimov 2002-11-22
  • 打赏
  • 举报
回复
我觉得他给出的例子是不是有问题?比如adc dx,0 之前的dx根本没有清零,而且后面再次adc dx,0还是没有清零。
btw他书上的例子有下载的吗?总不至于要手工输入吧
sum_1 2002-11-22
  • 打赏
  • 举报
回复
那怎样才符合规定哪?


MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
giantzz 2002-11-21
  • 打赏
  • 举报
回复
异常是指不符合保护模式的规定,重启正常
sum_1 2002-11-21
  • 打赏
  • 举报
回复
masm 6.11 的CV.EXE
giantzz 2002-11-19
  • 打赏
  • 举报
回复
用什么调试的
sum_1 2002-11-19
  • 打赏
  • 举报
回复
up
sum_1 2002-11-16
  • 打赏
  • 举报
回复
真是出奇了,我按照书上的做了。(开机,F8,进入DOS,DOS未安装任何驱动。编译用MASM LINK 和TASM,TLINK 都试过了,我想本例中没有32位段 TLINK /3就用不着了)就是在MOV CR0 EAX(EAX以置好)这步时系统重启(冷启动)


giantzz 2002-11-13
  • 打赏
  • 举报
回复
你把书翻到第361页,第二段,按上面说的做.
sum_1 2002-11-13
  • 打赏
  • 举报
回复
up
加载更多回复(7)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧