实模式下的寻址举例:
先找到CS代码段的地址
mov ax,cs
然后把段地址乘以16,即将16位变成20位。这时因为8086的数据总线是16位的,但是地址总线是20位的。实现方法很简单,左移4位即可。
shl eax, 4
然后根据你要寻址到的子代码,加上其对应的偏移地址:
add eax, LABEL_SEG_CODE32
这样便得到了所寻位置的物理地址。
因为地址总线只有20位,所以最大寻址空间只有1M。
如果是32位的操作系统中,需要填充GDT的段描述符,就可以根据上面得到的物理地址来填充:
mov word [label_desc_code32 +2] , ax
shr eax, 16
mov byte [label_desc_code32 +4], al
mov byte [label_desc_code32+7], ah
这就完成了32位代码段描述符的初始化。。。