|
发表于 2020-7-27 10:00:01
|
显示全部楼层
首先,SS*16D表示堆栈段的基地址,毋庸置疑。如果这个基地址是堆栈段的高地址,这个高地址也就是堆栈的栈底(高地址)。如此以来,SS*16D就表示了栈底,SP指向栈顶。当堆栈为空时,栈底=栈顶,SP->栈顶,此时只能为0,才能保证“栈顶=栈底”,即SS*16D=SS*16D+SP。若向堆栈中压入元素,SP该如何呢?增大还是减小?都不合适。增大,就成了堆栈向高地址发展;若SP减小,就有问题了,SP已经为0了,难道减到复数不成?如果SP初始化为堆栈大小,SS:SP定位到栈底,因为初始化时SP等于堆栈的大小,即非0,显然SS:SP要大于SS:0000,那么SS就只有指向堆栈段的低地址栈底了。
****************************************************************************
初始化一个栈的时候,sp 怎么可能是0 呢,想想看下面的代码,在看看图
mov ax, stack
mov ss, ax
mov sp, 10h
执行完上面的代码结果是这样的
0x0000| |
0x0001| |
0x0002| |
0x0003| |
0x0004| |
0x0005| |
0x0006| |
0x0007| |
0x0008| |
0x0009| |
0x000A| |
0x000B| |
0x000C| |
0x000D| |
0x000E| |
0x000F|______|<-------- ss
0x0010 <-------- sp
|
|