📄 5.txt
字号:
> ^^^^^^^ ^^^^^^^^^^^ ^^^ ^^^ ^^^
> ↑ ↑ ↑ ↑ ↑
> │ │ └──────93=可读写区段
> │ │ │ │
> └───────────┴────0fffff+1=1MB (Limits)
> │ │
> └─────────┴──12345678 (Base)
>
>
> 它所代表的意思是如下图所示∶(每组 8 byte)
>
> ┌──────────────────────┐
> 1│ Limit bit 0-15 │ 0 byte
> ├──────────────────────┤
> 3│ Base bit 0-15 │ 2
> ├──────────┬───────────┤
> 5│ 存取权 │ Base bit 16-23 │ 4
> ├──────────┼────────w──┤
> 7│ Base bit 24-31 │G│..│limit bit 16-19│ 6
> └──────────┴───────────┘
> "G"代表 Limit 的单位是 Byte 或 PAGE(4K)
>
> 所以....
>
> #0000 Segment not present.
> #0008 Base=000B8000 Limit=0000FFFF Flags=93 USE32 Byte granularity
> #0010 Base=12345678 Limit=000FFFFF Flags=93 USE32 Byte granularity
> ^^^^^Selector ^^存取权
>
>
>
> 设定完後 ,就是切入保护模式 ,只要将 CR0 暂存器的 Bit0 设为 '1' ,再用一个
> 跳越指令 ,就进入保护模式了。
>
>
> ---------------------------------------------------------------------------
> 讲不懂没关系 ,现在来看看实例 ,这样比较容易懂..
>
> C:\>386MICE SAMPLE.EXE
> -G 1AE
> EAX=00044A1C EBX=00000003 ECX=00000000 EDX=00000100
> ESI=00000000 EDI=00000000 EBP=00000000 ESP=0000FFFE
> DS=4A1C SS=4A1C ES=4A1C FS=4A0C GS=4A0C
> -U 1AE
> 4A1C:000001AE CLI
> 4A1C:000001AF LGDT CS:[BX] ──→ DUMP CS:[BX] ──→
> 4A1C:00000003 18 00 C9 A1 04 00 <--- GDT 表放在 0004A1C9 长度 18h
> 4A1C:000001B3 MOV
> EAX,CR0 │
> 4A1C:000001B6 OR
> EAX,1 ↓
> 4A1C:000001BA MOV CR0,EAX
> 4A1C:00000009 00 00 00 00 00 00 00 00-FF FF C0 A1 04 9B 00-00
> 4A1C:000001BD JMP 01C0
> 4A1C:00000010 FF FF 00 80 0B 93 00 00 (GDT表)
> 4A1C:000001BF NOP
> 4A1C:000001C0 MOV AX,0008H
> 4A1C:000001C3 MOV DS,AX
> 4A1C:000001C5 MOV WORD PTR DS:[0000H],7041h
>
>
> 由上面的 GDT 表知道 此程式共规划了三个区段 ,其中 0000 区段是不使用
> 故区段的表示方式如下∶
>
> #0000 Segment not present.
> #0008 Base=0004A1C0 Limit=0000FFFF Flags=9B USE32 Byte granularity
> #0010 Base=000B8000 Limit=0000FFFF Flags=93 USE32 Byte granularity
>
>
>
> -G 1BD
> EAX=00000001 EBX=00000003 ECX=00000000 EDX=00000100
> ESI=00000000 EDI=00000000 EBP=00000000 ESP=0000FFFE
> DS=4A1C SS=4A1C ES=4A1C FS=4A0C GS=4A0C
> 4A1C:000001BD JMP 01C0
>
> -T (这儿就算是进入保护模式了)
> EAX=00000001 EBX=00000003 ECX=00000000 EDX=00000100
> ESI=00000000 EDI=00000000 EBP=00000000 ESP=0000FFFE
> DS=0000 SS=0000 ES=0000 FS=0000 GS=0000
> 0000:000001C0 MOV AX,0008H
> 0000:000001C3 MOV DS,AX
> 0000:000001C5 MOV WORD PTR DS:[0000H],7041h
>
>
>
> 因为进入保护模式 ,所以 Selector 的区段应该要去查 GDT 表格 ,这个例
> 子的 Selector 0010 的 Base = B8000 ,所以...
> 保护模式下的 0010:00000000 = 真实模式下的 B800:0000 ,这样您懂了吗?
>
> 在行号 1C5 的位址有一行写入 7041 的动作 ,就是在萤幕秀 'A' 反白字元.
>
> 最後要进入真实模式时 ,只要将 CR0 的 Bit0 设为 '0' ,再用一个跳越指
> 令就回到真实模式了..
>
> --------------------------------------------------------------------------
> 後记:
> 若有问题 ,烦在本站『站内信箱』留信给我....尽量避免使用网路信 ,
> 且尽快提出 ,否则竣U来的课程将会更难懂 ,如果你是完全不懂 ,麻烦也留
> 信给我 ,我会再把这一章节再细细重新说明。至於对组合语言不懂 ,或是对
> 保护模式没兴趣的人 ,本人就帮不上忙了。
>
> A∶下一次笔者将继续解说 V86 模式下的工作切换
> B∶等级权限 / 拦 I/O
>
> ┌───────────────────────────────────┐
> │ Soft Bugger 软体蛀虫 90:90/2 软体新技术的实行者 │
> │ BBS:02-5955461 24HR ID:Werong Ho -- 软蛀 -- │
> └──────────w────────────────────────┘
>
>
> ┌┐┌┐∞
> 【 80386 保护模式简介三 】 ┘└┘└┘
> ==========================================================================
> 前言∶
>
> 前面两集主要是要告诉各位有关 IDT.GDT 的用法 ,虽M这样已经可以简单的进
> 入保护模式 ,但是它还不足以让你撰写程式 ,因此笔者还必需往下继续叙说 ,不过再
> 往下讲之前 ,又有一票烦且杂的观念要说 ,本篇还是继续在"观念"上打转 ,读者千万
> 不要以为本篇又是「干古」 ,如果本篇不懂的话 ,後面的精彩文章您大概也看不懂 ,
> 笔者会尽量把文章写到容易懂的范围。
>
> --------------------------------------------------------------------------
> ┌────────┐
> │80386 暂存器介绍│
> └────────┘
>
> 80386 的暂存器除了扩充成 32 位元以外 ,亦增加了许多新獐 s器 ,除了一般
> 使用者暂存器(AX.BX....SI.DI)各位已经了解以外 ,也增加了系统暂存器、以及扩充
> 的旗标 暂存器....等等。
>
>
> A.使用者暂存器 → EAX.EBX.E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -