在基于x86的Windows系统中,在x86保护模式下,地址总线是32位的,所有通用寄存器都是32位的,间接寻址时不用分段就可以寻址4GB的地址空间。保护模式下,所有段的基地址都是0,段限长是0xFFFFFFFF。段寄存器存放段选择子,在汇编程序中,链接器会对程序进行地址重定位。下面用伪代码讲述:
code segment
mov ax,[data_label];//将ds:data_label中的数据送至ax,这里data_label在数据段中虽然是0,但是经过链接器处理后,data_label将成为0~4GB的线性地址中的一个线性地址。这里的data_label在程序员眼中是逻辑地址,实际上经过链接器处理后,整个程序位于4GB的线性地址空间中。代码段,数据段,栈段在程序被操作系统加载后,当应用程序执行时,操作系统会将CS,DS,ES等指向对应的段,这些段的基地址都是0,由于通用寄存器都是32位的,地址总线也是32位的,所以进行间接寻址时不用分段就可以寻址4GB的地址空间。
end
data segment
data_label: 0x1 0x2 0x3
end
stack segment
end