鱼C论坛

 找回密码
 立即注册
查看: 2508|回复: 11

从实模式到保护模式出现错误

[复制链接]
发表于 2013-8-29 23:22:25 | 显示全部楼层 |阅读模式
15鱼币
org 07c00h
jmp main
gdt_null: 
dd 0
dd 0 
gdt_code_addr equ $ - gdt_null ; 求得代码段在GDT表中的位置
gdt_code:
dw 0ffffh ; 段大小为4GB
dw 0 ; 基地址(24位)
db 0
db 10011010b ; 属性描述位,指明此是代码段,可读可执行
db 11001111b ; 具体的每一位是代表什么可查Intel CPU编程手册
db 0 
gdt_data_addr equ $ - gdt_null ; 求得数据段在GDT表中的位置
gdt_data:
dw 0ffffh
dw 0
db 0
db 10010010b ; 指明此是数据段,可读可写
db 11001111b
db 0
gdt_addr:
dw gdt_addr - gdt_null - 1 ; GDT 表的大小
dd gdt_null ; GDT 表的位置
; ---------------------------------------------------------------------------
[BITS 16]
main: ; 引导程序从此处开始执行
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h

lgdt [gdt_addr] ; 载入 GDT 的描述符
;关中断
cli
;打开地址A20
in al,92h
or al,00000010b
out 92h,al

mov eax , cr0 ; 下面三句设置 cr0 的第 0 位(PE位)为1,
; 表示进入保护模式
or eax , 1
mov cr0 , eax
jmp gdt_code_addr:code_32 ; 跳入32位的代码段中
[BITS 32]
code_32:
mov ax , gdt_data_addr ; 以下三句设置 DS,ES,SS,FS,GS
; 为数据段描述表的位置


times 510-($-$$) db 0
dw 0xaa55;结束标志
QQ图片20130829232013.jpg
哪里错了

最佳答案

查看完整内容

上面是我在你的基础上改的,说实话,不建议把段的描述符直接定义在数据中,应该自己写个子过程,在里面计算描述符,这样代码可读性强点。不好意思,上次看错代码了。你的代码段选择子放的位置是对的,不过还是不建议你这样写,应该在代码中计算出来,因为是ring0级的所以没问题,如果是用户层ring3的就有问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-29 23:22:26 | 显示全部楼层
上面是我在你的基础上改的,说实话,不建议把段的描述符直接定义在数据中,应该自己写个子过程,在里面计算描述符,这样代码可读性强点。不好意思,上次看错代码了。你的代码段选择子放的位置是对的,不过还是不建议你这样写,应该在代码中计算出来,因为是ring0级的所以没问题,如果是用户层ring3的就有问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-29 23:59:06 | 显示全部楼层
实在是太高深了,我还没有学到这一步,正在实验七中徘徊,帮你顶了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-30 17:00:59 | 显示全部楼层
还没能开明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-30 23:59:33 | 显示全部楼层
本帖最后由 小名明SIU 于 2013-9-3 13:12 编辑

对你的代码只有一个评价:乱。
这些问题调试一下就知道了。
dw gdt_addr - gdt_null - 1 ; GDT 表的大小  
错了,应该是dw gdt_addr - gdt_null,不要减一,不信找个特殊的减减试试。

点评

欢迎常来汇编做客。  发表于 2013-9-2 21:21

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
福禄娃娃 + 2 + 2 + 2 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-31 17:16:52 | 显示全部楼层

还是不明白  能不能告诉我放在哪个位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-31 23:45:48 | 显示全部楼层
放在第一个描述符和第二个描述符之间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-31 23:47:46 | 显示全部楼层
我劝你还是学会怎么调试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-1 11:39:19 | 显示全部楼层
觉得好就采纳一下啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-2 21:18:37 | 显示全部楼层
小名明SIU 发表于 2013-9-1 11:39
觉得好就采纳一下啊

能不能把代码修改后 给我  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-3 13:11:25 | 显示全部楼层
org 07c00h
jmp main
gdt_null:
dd 0
dd 0
gdt_code_addr equ $ - gdt_null ; 求得代码段在GDT表中的位置
gdt_code:
dw 0ffffh ; 段大小为4GB
dw 0 ; 基地址(24位)
db 0
db 10011010b ; 属性描述位,指明此是代码段,可读可执行
db 11001111b ; 具体的每一位是代表什么可查Intel CPU编程手册
db 0
gdt_data_addr equ $ - gdt_null ; 求得数据段在GDT表中的位置
gdt_data:
dw 0ffffh
dw 0
db 0
db 10010010b ; 指明此是数据段,可读可写
db 11001111b
db 0
gdt_addr:
dw gdt_addr - gdt_null  ; GDT 表的大小
dd gdt_null ; GDT 表的位置
; ---------------------------------------------------------------------------
[BITS 16]
main: ; 引导程序从此处开始执行
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h

lgdt [gdt_addr] ; 载入 GDT 的描述符
;关中断
cli
;打开地址A20
in al,92h
or al,00000010b
out 92h,al

mov eax , cr0 ; 下面三句设置 cr0 的第 0 位(PE位)为1,
; 表示进入保护模式
or eax , 1
mov cr0 , eax
jmp gdt_code_addr:code_32 ; 跳入32位的代码段中
[BITS 32]
code_32:
mov ax , gdt_data_addr ; 以下三句设置 DS,ES,SS,FS,GS
; 为数据段描述表的位置


times 510-($-$$) db 0
dw 0xaa55;结束标志
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-3 13:22:59 | 显示全部楼层
本帖最后由 小名明SIU 于 2021-3-22 18:48 编辑

如果不知道怎么调试,或者想学习一些保护模式的知识,虽然我知道的也不多,但是我会尽量帮你解答,还是推荐使用《X86从实模式到保护模式》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 07:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表