鱼C论坛

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

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

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

  33. lgdt [gdt_addr] ; 载入 GDT 的描述符
  34. ;关中断
  35. cli
  36. ;打开地址A20
  37. in al,92h
  38. or al,00000010b
  39. out 92h,al

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


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

最佳答案

查看完整内容

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

使用道具 举报

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

使用道具 举报

发表于 2013-8-29 23:59:06 | 显示全部楼层
实在是太高深了,我还没有学到这一步,正在实验七中徘徊,帮你顶了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-30 17:00:59 | 显示全部楼层
还没能开明白
小甲鱼最新课程 -> https://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^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

还是不明白  能不能告诉我放在哪个位置
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-31 23:45:48 | 显示全部楼层
放在第一个描述符和第二个描述符之间
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-31 23:47:46 | 显示全部楼层
我劝你还是学会怎么调试吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-1 11:39:19 | 显示全部楼层
觉得好就采纳一下啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

能不能把代码修改后 给我  
小甲鱼最新课程 -> https://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;结束标志
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 14:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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