鱼C论坛

 找回密码
 立即注册
查看: 2103|回复: 1

实模式到保护模式疑问

[复制链接]
发表于 2013-9-3 20:05:26 | 显示全部楼层 |阅读模式
10鱼币
  1. jmp c16
  2. gdt_size dw 0
  3. gdt_base dd 0x00007e00 ;GDT的物理地址
  4. c16:
  5. ;设置堆栈段和栈指针
  6. mov ax,cs
  7. mov ss,ax
  8. mov sp,0x7c00
  9. ;计算GDT所在的逻辑段地址
  10. mov ax,[cs:gdt_base+0x7c00] ;低16位
  11. mov dx,[cs:gdt_base+0x7c00+0x02] ;高16位
  12. mov bx,16
  13. div bx
  14. mov ds,ax ;令DS指向该段以进行操作
  15. mov bx,dx ;段内起始偏移地址
  16. ;创建0#描述符,它是空描述符,这是处理器的要求
  17. mov dword [bx+0x00],0x00
  18. mov dword [bx+0x04],0x00
  19. ;创建#1描述符,保护模式下的代码段描述符
  20. mov dword [bx+0x08],0x7c0001ff
  21. mov dword [bx+0x0c],0x00409800
  22. ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
  23. mov dword [bx+0x10],0x8000ffff
  24. mov dword [bx+0x14],0x0040920b
  25. ;创建#3描述符,保护模式下的堆栈段描述符
  26. mov dword [bx+0x18],0x00007a00
  27. mov dword [bx+0x1c],0x00409600
  28. ;初始化描述符表寄存器GDTR
  29. mov word [cs: gdt_size+0x7c00],31 ;描述符表的界限(总字节数减一)

  30. lgdt [cs: gdt_size+0x7c00]
  31. in al,0x92 ;南桥芯片内的端口
  32. or al,0000_0010B
  33. out 0x92,al ;打开A20
  34. cli ;关中断
  35. mov eax,cr0
  36. or eax,1
  37. mov cr0,eax ;设置PE位
  38. ;以下进入保护模式... ...
  39. jmp dword 0x0008:flush ;16位的描述符选择子:32位偏移
  40. [bits 32]

  41. flush:
  42. mov cx,10h ;加载数据段选择子(0x10)
  43. mov ds,cx
  44. mov byte [0x00],'A'

  45. jmp $ ;已经禁止中断,将不会被唤醒
  46. times 510-($-$$) db 0
  47. db 0x55,0xaa
复制代码
QQ图片20130903200035.jpg
bochs调试
jmp dword 0x0008:flush  段地址:偏移地址0000:0008
0000h是中断向量表的地址
为什么32位代码会在 中断向量表的地址里


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

使用道具 举报

发表于 2013-9-3 23:03:28 | 显示全部楼层
jmp dword 0x0008:flush    很明显cs应该是0008吧,他是选择子不是段地址。具体的看书吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 20:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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