未使用显式段定义指令时,SS与ES段是重叠还是独立?
实模式下段寄存器SS与ES的段重叠问题
首先看这段常见的实模式汇编代码:
cli xor ax,ax mov ss,ax mov sp,7c00h push ss pop es
执行第3行mov ss,ax后,栈段寄存器SS被赋值为0000。针对你的问题,明确如下:
1. SS与ES对应的段是完全重叠的
push ss是将SS寄存器中的值(0000)压入栈中,pop es则把栈顶的0000弹出到ES寄存器。在实模式下,段寄存器的本质是段基址的高16位,物理地址的计算公式为:段寄存器值 << 4 + 偏移地址。当SS和ES的值都是0000时,它们对应的段起始物理地址都是0000 << 4 = 00000h,且实模式下段的默认大小为64KB,所以这两个段是完全重叠的,不存在“两个独立段”的说法。
2. 不存在“自动创建段”的概念
实模式的段机制和你用汇编器写的segment/assume指令是两回事:
- 汇编器的
segment和assume指令是用来做编译阶段的语法检查、符号地址映射的,属于汇编工具层面的规则,和CPU实际执行时的段机制无关。 - CPU在实模式下,只要给段寄存器赋值,就会直接用该值作为段基址来计算物理地址,根本不需要“创建段”的操作——段寄存器只是一个地址计算的“基数寄存器”,不是需要提前定义的独立内存区域。所以你不需要显式写段定义指令,只要给SS、ES赋值,它们就会按规则指向对应的内存范围。
内容的提问来源于stack exchange,提问作者Shankar Tiwari ji
相关产品推荐
相关产品推荐

