学习笔记
《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f
32位保护模式用的是段选择子
- 在[024][x86汇编语言]第十三章 学习加载程序C13_mbr.asm
的加载程序进入32位保护模式后,想要用ds寄存器指向0~4GB内存空间的的做法是:
[bits 32]
flush:
mov eax,0x0008 ;加载(0...4GB)选择子
mov ds,eax
[024][x86汇编语言]第十三章 学习加载程序C13_mbr.asm
- 在[026][x86汇编语言]第十三章 学习内核程序 c13_core.asm的内核程序中,想要用ds寄存器指向0~4GB内存空间的做法是:
mem_0_4_gb_seg_sel equ 0x08 ;整个0-4GB内存的段的选择子
mov eax,mem_0_4_gb_seg_sel ;切换DS到0-4GB的段
mov ds,eax
[026][x86汇编语言]第十三章 学习内核程序 c13_core.asm
-
索引号0x08
指向的GDT描述符
是一个指向0~4GB全部内存空间的数据段,这个数据段的段基址是0x0000 0000
,因此,我认为使用常量mem_0_4_gb_seg_sel
的写法要比直接写上0x08
好得好得多! -
这是至关重要的一个概念,那就是在明确提示自己,现在已经进入保护模式了,不要再写
段地址:偏移地址
了,而是要写选择子:偏移地址
; -
极有可能编程的时候,保护模式也写着写着就写了
ds =0x0000 0000
,然后debug的时候还死活找不到错误在哪里,即便在调试的时候看到了ds是这个值,也会糊里糊涂的觉得,是啊,我就是要0x0000 0000,殊不知,现在要写的是选择子,仅仅是声明并使用一个常量就可以十分清楚地提醒自己了; -
概念懂了,但是实际操作的时候,脑子未必有学习概念的时候那么清晰,不是自己变笨了,而是这个东西就是容易弄错的,所能做的就是采取另外的保障,比如写一个常量提醒自己。
网友评论