能力值:
( LV4,RANK:50 )
|
-
-
2 楼
我了个去,DS SS ES CS这个是段寄存器,不是数据寄存器。因为实模式下CPU只能寻址1MB内存,因此使用分段内存管理机制,每个段是64KB。
实模式下访问Segment:Offset方式的地址时,实际访问到的物理地址是:(Segment SHL 4)+Offset
你的数据实际被存放在了(SS SHL 4)+SP的位置
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我知道ss+sp,但sp初始值为什么不是f,而是0?
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
因为你每PUSH一个16位数据入栈以后,SP都会-2。如果是0的话,0-2=0xFFFE 相当于省出一个2字节的内存空间
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
重点是ss:sp和cs:ip之间的距离,一开始的正好10h,不就是程序开头16dup的空间吗?
可push后却没放入这段空间。
如果sp一开始为f,也就是说ss:sp==cs:ip-1 不就正好用到这段栈空间了吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
启动起来SP默认就是0,如果你想要让他是你想要的,你尽管赋值就行了。
段寄存器相当于是给你分了个64K的内存让你用,SP算是指针,指向这个段里的什么地方存放什么数据。
你可以这样
mov ax,stack
mov ss,ax
xor ax,ax
mov sp,ax
然后再调试一下看看
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
哦!我明白一些了。
在定义栈段时,只是给程序分配了那么多空间,隔开psp和代码段,毕竟stack segment写在code之前。而ss:sp并不一定要用那个空间,用不用取决于代码有没有明确赋值sp。
谢谢你一直帮我。
|
能力值:
( LV10,RANK:173 )
|
-
-
8 楼
1.首先我认为你的这个问题是有问题的,你主观上将stack和ss段寄存器联系在了一起,但事实上stack只是个名称,编译器不会因为你名称叫stack,就认定它的寄存器是ss,你程序中又没有赋值,它们两个凭什么联系在一起。
2.其次你就算把stack换成别的名称如data,定义的字节数也变下,ss和cs之间的距离仍然是16的整数倍。
所以我认为这是系统的原因,当时就是这么设计的。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
你的栈段地址默认是ss:sp而你声明的stack段cpu只把它当数据,如果你要把stack声明为栈段,要使用如下指令mov si,stack
mov ss,si
|
|
|