在cpu地址编码中,我以前接触过arm,avr的寻址方式,一般都是直接编码,地址映射就是地址总线的物理地址编码。而最近接触到IA32的汇编语言,感觉比arm复杂得多。所以做个学习笔记标记。
在arm中,一般寻址都是在总线编码范围内寻址。而在x86中,分为实模式和保护模式,实模式是指在16为段地址编码下的寻址模式。因为intel cpu在最初的时候使用20位的地址总线,而寄存器只有16位,所以为了能够使16位的寄存器寻址到2#20次方,即1m的地址范围。不得不使用了一个叫做段的概念。即加了一个16位的段寄存器来和16位的通用寄存器进行对20位地址总线的寻址。寻址方式为:物理地址=16位 段寄存器左移4位+16位的段内偏移地址(一般使用16位寄存器来保存)。由这个公式可以看出,一共1m的地址,我们可以使用一个16位段寄存器加上一个16位的其他寄存器寻址到1m地址空间中的任意地址,这里还有一个注意的地方,在寻址时,可能存在两个寄存器的地址值不同,而计算出的地址相同的情况。如0012:0004 = 0010:0024 = 00124。intel的cpu由于为了向上兼容,所以以后的cpu都支持实模式。而且在cpu启动的时候,是以实模式方式启动的。
保护模式,在IA32以后,由于地址总线和数据总线都是扩充到了32位,直接能寻址到4g的地址,所以不用担心寻址问题,但是,为能够保持cpu的向上兼容,依然使用了段的概念但是呢,和实模式下的寻址已经有了很大的不同。
保护模式下:依然使用 实际地址(物理地址) = 段地址:段偏移地址这个方式进行寻址。但是寻址方式