找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3584|回复: 4

【汇编】最简单的切保护模式的源码

[复制链接]

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24239 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
发表于 2017-6-15 08:51:49 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
  1. bits 16
  2. org 0x7c00

  3. Start:
  4. xor ax,ax
  5. mov ds,ax

  6. cli

  7. lgdt [GDTR]

  8. mov eax,cr0
  9. or al,1
  10. mov cr0,eax
  11. jmp dword 0x08:PEStart

  12. GDTR:
  13. .limit:
  14. dw GDT.End-GDT-1
  15. .base:
  16. dd GDT

  17. GDT:
  18. dw 0,0,0,0

  19. dw 0xffff
  20. dw 0
  21. dw 0x9a00
  22. dw 0x00cf

  23. dw 0xffff
  24. dw 0
  25. dw 0x9200
  26. dw 0x00cf
  27. .End:

  28. PEStart:
  29. bits 32

  30. mov ax,0x10
  31. mov es,ax
  32. mov ss,ax
  33. mov ds,ax
  34. mov fs,ax
  35. mov gs,ax
  36. mov esp, 0xffff

  37. .text:
  38. mov dword[0xb8000],'P'|('r'<<16)|0x07000700
  39. mov dword[0xb8004],'o'|('t'<<16)|0x07000700
  40. mov dword[0xb8008],'e'|('c'<<16)|0x07000700
  41. mov dword[0xb800c],'t'|('e'<<16)|0x07000700
  42. mov dword[0xb8010],'d'|(' '<<16)|0x07000700
  43. mov dword[0xb8014],'m'|('o'<<16)|0x07000700
  44. mov dword[0xb8018],'d'|('e'<<16)|0x07000700
  45. jmp .text

  46. times 510-($-$$) db 0
  47. dw 0xAA55
复制代码
编译为平坦格式flp后缀,让vmware把它当作一个启动软盘加载即可运行。
没有出问题的话,它应该会显示一句“Protected mode”。
20170615094224.png
细节上要注意的点:
1、切模式前务必关中断。用cli即可。如果只是想进保护模式玩玩的话,无需设置IDT和TS。
2、nasm编译器,我用的版本是2.13.01。经过我的测试2.11版有BUG,会导致它无视你的bits 32语句。
3、修改cr0的数值后必须立即跳转。
4、可以不用在跳转前修改段选择子。
5、开头的那几句:
    xor ax,ax
    mov ds,ax
经测试,必须要有。因为引导进来的时候ds并没有指向你的代码所在的段上。不设置这两句的话,lgdt指令并不能正确找到你的gdt表。

回复

使用道具 举报

30

主题

211

回帖

2786

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2166 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2017-6-15 19:56:21 | 显示全部楼层
用masm写起来就恶心了 dos bin
  1. DESC STRUC
  2.         lim_00_15 DW ?
  3.         bas_00_15 DW ?
  4.         bas_16_23 DB ?
  5.         access    DB ?
  6.         gran      DB ?
  7.         bas_24_31 DB ?
  8. DESC ENDS

  9. data segment
  10.         GDT_REG label DESC
  11.         ;cs 0
  12.                                 dw 0
  13.                                
  14.                                 dw 0
  15.                                
  16.                                 db 0
  17.                                 db 0
  18.                                
  19.                                 db 0
  20.                                 db 0
  21.         ;cs 08h
  22.                                 dw 0FFFFh
  23.                                 dw 0
  24.                                
  25.                                 db 0
  26.                                 db 9ah
  27.                                
  28.                                 db 0cfh
  29.                                 db 0
  30.         ;es 10h
  31.                                 dw 0FFFFh
  32.                                 dw 0
  33.                                
  34.                                 db 0
  35.                                 db 92h
  36.                                
  37.                                 db 0cfh
  38.                                 db 0
  39.         ;ss 18h
  40.                                 dw 0FFFFh
  41.                                 dw 0
  42.                                
  43.                                 db 0
  44.                                 db 92h
  45.                                
  46.                                 db 0cfh
  47.                                 db 0
  48.         GDT_LENGTH  EQU $ - offset GDT_REG
  49.        
  50.        
  51.         GDTR_org         dw 0
  52.                                 dd 0
  53.         GDTR_new        dw GDT_LENGTH - 1
  54.                                 dd offset GDT_REG
  55. data ends


  56. u16 segment
  57.         assume cs:u16,ds:data
  58. REAL_MODE:

  59. start:
  60.         mov ax,data
  61.         mov ds,ax

  62.         mov ax,u32
  63. .386
  64.         shl eax,4
  65. .8086
  66.         mov GDT_REG[8].bas_00_15,ax
  67. .386       
  68.         shr eax,16
  69. .8086
  70.         mov GDT_REG[8].bas_16_23,al
  71.         mov GDT_REG[8].bas_24_31,ah
  72.        
  73.         mov ax,data
  74. .386
  75.         shl eax,4
  76.         add eax,dword ptr ds:GDTR_new[2]
  77.         mov dword ptr ds:GDTR_new[2],eax
  78.        
  79. .386p
  80.         cli
  81.         db 66h       
  82.         sgdt fword ptr ds:[GDTR_org]
  83.        
  84.         db 66h
  85.         lgdt fword ptr ds:[GDTR_new]

  86.         mov eax,cr0
  87.         or  eax,1
  88.         mov cr0,eax
  89.        
  90.         db 66h
  91.         db 0eah
  92.         dd 0
  93.         dw 8

  94. u16 ends

  95. .386

  96. u32 segment use32
  97. PROTECT_MODE:

  98.         mov ax,10h
  99.         mov es,ax

  100.         mov edi,0b8000h
  101.         mov ecx,80*25
  102.         mov al,"*"
  103.         mov ah,11001010b
  104.         rep stosw
  105.        
  106.         jmp $
  107.        
  108. u32 ends

  109. end start
复制代码
回复 赞! 靠!

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24239 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
 楼主| 发表于 2017-6-15 21:06:07 | 显示全部楼层
Ayala 发表于 2017-6-15 19:56
用masm写起来就恶心了 dos bin
[code]DESC STRUC
        lim_00_15 DW ?

这db 66h让我回忆起了曾经的辛酸
回复 赞! 靠!

使用道具 举报

30

主题

211

回帖

2786

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2166 个
贡献
206 次
宅之契约
0 份
在线时间
481 小时
注册时间
2016-7-12
发表于 2017-6-15 21:26:05 | 显示全部楼层
0xAA55 发表于 2017-6-15 21:06
这db 66h让我回忆起了曾经的辛酸

这种写法 最早出自intel自己呢!
回复 赞! 靠!

使用道具 举报

1

主题

83

回帖

89

积分

用户组: 小·技术宅

UID
3026
精华
0
威望
1 点
宅币
3 个
贡献
0 次
宅之契约
0 份
在线时间
6 小时
注册时间
2017-10-31
发表于 2017-10-31 09:44:37 | 显示全部楼层
这也可以。
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-24 08:17 , Processed in 0.048834 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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