帮我看看这段演示实模式和保护模式之间的转换的代码,我晕了

rularys 2007-01-03 12:37:05
这段演示实模式和保护模式之间的转换的代码,我改来改去就是不能让它乖乖地运行,每次运行后只有一个结果:机器冷重起~~郁闷,不知道问题在哪里,请帮我看看我错在哪里啦

.386p

Descriptor struc
limitl dw 0
baselw dw 0
basehwlb db 0
attri db 0
limith db 0
basehwhb db 0
Descriptor ends
;***************************************************
JUMP16 MACRO Selector,Offset
db 0eah
dw Offset
dw Selector
ENDM
;-------------------------------
EnableA20 MACRO
IN AL,92H
OR AL,2
OUT 92H,AL
ENDM
;--------------------------------
DisableA20 MACRO
IN AL,92H
AND AL,0FDH
OUT 92H,AL
ENDM
;***************************************************

Data Segment use16

gdt0 LABEL BYTE
DUMMY Descriptor<>
CodeSel equ $-gdt0
CodeDes Descriptor<0ffffh,0,0,9ah,0,0>
DataSel equ $-gdt0
DataDes Descriptor<0ffffh,0,0,92h,0cf,0>
VideoSel equ $-gdt0
VideoDes Descriptor<0ffffh,8000h,0Bh,92h,0,0>
StkSel equ $-gdt0
StkDes Descriptor<0ffffh,0,0,96h,0,0>
;----------------------------------------------
GdtLen equ $-gdt0

GdtPtr dw GdtLen-1
dd 0
Buff db 256 dup (?)
Mesg db 'Now Is In Protect Mode.',0

Data ends

;*************************************************
stk Segment STACK use16
db 1024 dup (0)
stk ends
;*************************************************

Code Segment use16
assume cs:Code,ds:Data,ss:stk

start:
xor ax,ax
mov ax,Data
mov ds,ax

mov bx,16
mul bx
add ax,offset gdt0 ;设置全局描述符表的基地址
adc dx,0
mov word ptr [GdtPtr+2],ax
mov word ptr [GdtPtr+4],dx

mov ax,Code ;设置代码段
mul bx
mov CodeDes.baselw,ax
mov CodeDes.basehwlb,dl
mov CodeDes.basehwhb,dh

mov ax,ss ;设置堆栈段
mul bx
mov StkDes.baselw,ax
mov StkDes.basehwlb,dl
mov StkDes.basehwhb,dh

mov ax,ds ;设置数据段
mul bx
add ax,offset Buff
adc dx,0
mov DataDes.baselw,ax
mov DataDes.basehwlb,dl
mov DataDes.basehwhb,dh
lgdt fword ptr GdtPtr
cli
EnableA20
;进入保护模式:
mov eax,cr0
or al,01h
nop
nop
nop
nop
nop ;for Debug
mov cr0,eax
JUMP16 CodeSel,<OFFSET ProtectCode> ; 刷新缓存
ProtectCode:
mov ax,StkSel
mov ss,ax
mov ax,DataSel
mov ds,ax
mov ax,VideoSel
mov es,ax

;直接写视频缓冲来显示提示消息:
mov esi,offset Mesg
mov edi,80*10
cld
mov ah,1eh
Load:
lodsb
cmp al,0
jz ReadyToReal
stosw
jmp Load

ReadyToReal: ;退回实模式:
mov eax,cr0
and al,0feh
mov cr0,eax
JUMP16 <SEG Real>,<OFFSET Real> ;刷新缓存
Real:
DisableA20
sti
mov ax,Data
mov ds,ax
mov es,ax
mov ax,stk
mov ss,ax
WAITKEY:
mov ah, 08h
int 21h
mov ax,4c00h
int 21h

Code ends

end start
...全文
202 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoologist 2007-01-04
  • 打赏
  • 举报
回复
t10-1那个程序,你自己对比一下
rularys 2007-01-04
  • 打赏
  • 举报
回复
恩,好,我下之参详。谢谢楼上
zoologist 2007-01-03
  • 打赏
  • 举报
回复

http://www.begin.org.cn/

上面有我改好的
rularys 2007-01-03
  • 打赏
  • 举报
回复
我不知道是哪一个,找不到啊

能在这里解释一下我在哪里错了么?

21,497

社区成员

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

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