关于SS 和 SP
本帖最后由 selfLearn 于 2021-11-2 10:32 编辑最近学到栈段了,在看例题的时候,比如10010H~1001FH 作为栈段,
经常给 SS 赋值 1000H。
为了测试多出的push 会被送到哪,用 debug 做了测试,结果是入栈到了 0000 之后 会在 相同 SS 的 FFFE 开始继续入栈,得出结论是因为不能改 SS,所以8086的栈在 sp 的范围 0~FFFFH之间是个大循环。
这时突然想到,如果给 SS 赋值 1001H 会发生什么?
// 测试代码
// ss=1001H
// sp=10H
// 按照我的想法,现在的SS:SP 会指向 10020 应该从这开始入栈
// 没问题,确实从1000:001E 开始入栈
// 接下来有疑问
// 多出的 PUSH 往 2000:0 那里入栈一行(16字节)后才去 1000:FFF0 入栈的
// 这是什么原理呢 刚才结论不是不能修改SS么,为什么指向1001H 会跑到2000H入栈?
// 这点让我十分不解
// 后面补上 调试过程
// 可以看到调试过程中 SP 没有指向 2000E 2000C 之类的 而是按照之前的结论到 0000 之后,又到 FFFE 去了
// 那为什么我的数据会出现 在2000:0~ 2000F 这一行呢?
本帖最后由 selfLearn 于 2021-11-2 10:57 编辑
奥 ,明白了。 书上说的不能修改SS,只能修改SP。 指的是操作栈的时候直接对SS修改。
而我的例子里。SS确实没变。 只是和偏移地址合成的时候(加在一起) 物理地址变了。
确实是我想的片面了。只是一个加法的事,就没绕过来,汇编还真有意思。
看来我还是没学会用机器的思维思考
本帖最后由 jackz007 于 2021-11-2 09:46 编辑
内存地址
10010H~1001FH
长度是 10H
如果用段:偏移的方式表达,可以是
1000:0010~1000:001F
相应的代码为:
mov eax,1000h
mov ss,ax
mov ax,20h
mov sp,ax
也可以是
1001:0000~1001:000F
相应的代码为:
mov eax,1001h
mov ss,ax
mov ax,10h
mov sp,ax
当堆栈越界时,对于前一种情形而言,首先会侵占本段地址剩余的底部空间,也就是 1000:0000~1000:0010 对应的二十位地址为 10000H~1000FH;如果继续越界,SP 寄存器到 0 值后,会回卷到 FFFE,SP 回卷以后,堆栈侵占的就是本段(SS)的顶部空间;对于后一种情形而言, 堆栈越界会直接导致 SP 回卷到 FFFE,开始侵占本段(SS)的顶部空间。
本帖最后由 selfLearn 于 2021-11-2 09:40 编辑
jackz007 发表于 2021-11-2 09:30
内存地址
长度是 10H
嗯 编辑帖子的时候 想起来了 没问题的。忘记debug 一行16字节的事了 调试确实是从1000:001E 开始入栈的 ss:sp 指向的是 10020 没毛病
已经改正了。
页:
[1]