吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1809|回复: 8
收起左侧

[求助] 《汇编》关于SS和SP的疑问

  [复制链接]
丨一灬一丨 发表于 2021-11-2 09:29
本帖最后由 丨一灬一丨 于 2021-11-2 10:33 编辑

最近在学汇编,看王爽的书。(为此在鱼C论坛办了至尊会员,可惜十一假期的求助到现在还没人回复我。所以本着广撒网多捕鱼的原则,把我的求助搬到吾爱来。)
学到栈段了,在看例题的时候,比如10010H~1001FH 作为栈段,
经常给 SS 赋值 1000H。
为了测试多出的push 会被送到哪,用 debug 做了测试,结果是入栈到了 0000 之后 会在 相同 SS 的 FFFE 开始继续入栈,得出结论是因为不能改 SS,所以8086的栈在 sp 的范围 0~FFFFH之间是个大循环。
这时突然想到,如果给 SS 赋值 1001H 会发生什么?
// 测试的代码

测试代码

测试代码
// ss=1001H // sp=10H // 按照我的想法,现在的SS:SP 会指向 10020 应该从这开始入栈

结果1

结果1
// 结果没问题,确实从1000:001E 开始入栈 // 接下来有疑问

结果2

结果2
// 多出的 PUSH 往 2000:0 那里入栈一行(16字节)后才去 1000:FFF0 入栈的 // 这是什么原理呢 刚才结论不是不能修改SS么,为什么指向1001H 会跑到2000H入栈? // 这里让我十分不解 // 后面补上 调试过程

调试过程

调试过程
// 可以看到调试过程中 SP 没有指向 2000E 2000C 之类的 而是按照之前的结论到 0000 (1000:0000) 之后,又到 FFFE (1000:FFFE) 去了 // 那为什么我的数据会出现 在2000:0~ 2000F 这一行呢?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

飘零星夜 发表于 2021-11-2 09:46
个人理解:
SS 实际值= 1001*10 = 10010
SP 取值范围= 0000-FFFE
SS:SP = 10010 ~ 2000E //就是SS + SP
longs75 发表于 2021-11-2 09:56
既然SS=1001H,堆栈空间就是 1001:0000 — 1001:FFFF,也就是:10010 — 2000F,数据出现在 2000:0~ 2000:F 这一行不是很正常嘛。

你是不是忘记改SS这回事了?既然改了段寄存器,就记得用改过之后的段寄存器 1001:XXXX这种形式来记录堆栈。
 楼主| 丨一灬一丨 发表于 2021-11-2 10:03
飘零星夜 发表于 2021-11-2 09:46
个人理解:
SS 实际值= 1001*10 = 10010
SP 取值范围= 0000-FFFE

有几个问题

  1. 我代码里 SS:SP 指向的是 10020 (ss= 1001H sp= 10H)而不是 10010  10020 + FFFE = 2001E 会比现在多一行
  2. 教材里和我实际测试中SS的值是不能修改的
  3. 实际调试过程中,SP 到0000后 指向了 FFE(1000:FFFE) 并没指向 0E(2000:000E)
 楼主| 丨一灬一丨 发表于 2021-11-2 10:11
本帖最后由 丨一灬一丨 于 2021-11-2 10:36 编辑
longs75 发表于 2021-11-2 09:56
既然SS=1001H,堆栈空间就是 1001:0000 — 1001:FFFF,也就是:10010 — 2000F,数据出现在 2000:0~ 2000 ...



1000:0020 和 1001:0010 换算之后是一个东西
就像王爽检测点3.2的其中一个例题一样。


还有 在调试过程的图里 SP 到 0000(1000:0000) 后 指向的是 FFFE(1000:FFFE) 并不是 000E(2000:000E)

估计调试过程的缩略图太小,你没仔细看把 可以用滚轮放大的,我这边是可以看清的。


longs75 发表于 2021-11-2 10:35
丨一灬一丨 发表于 2021-11-2 10:11
之所以还用D 1000:0 ~ FFFF查看内存
是因为我用D 1001:0 ~ FFFF 并没有内存变化

堆栈是这样变化的:10020,1001E……10010,10010就是1001:0,堆栈到这儿就开始回绕了:1001:FFFE,即:2000E,2000C,2000A,20008……

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
丨一灬一丨 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 丨一灬一丨 发表于 2021-11-2 10:43
本帖最后由 丨一灬一丨 于 2021-11-2 10:56 编辑
longs75 发表于 2021-11-2 10:35
堆栈是这样变化的:10020,1001E……10010,10010就是1001:0,堆栈到这儿就开始回绕了:1001:FFFE,即 ...

奥 ,明白了。 书上说的不能修改SS,只能修改SP。 指的是操作栈的时候直接对SS修改。

而我的例子里。SS确实没变。 只是和偏移地址合成的时候(加在一起) 物理地址变了。
确实是我想的片面了。只是一个加法的事,就没绕过来,汇编还真有意思。
看来我还是没学会用机器的思维思考


画个图更方便理解
01.png
minibeetuaman 发表于 2021-11-2 11:12
ss不是段寄存器吗,在16bit的时候使用这个来寻址的,段地址+偏移地址
longs75 发表于 2021-11-2 12:12
丨一灬一丨 发表于 2021-11-2 10:43
奥 ,明白了。 书上说的不能修改SS,只能修改SP。 指的是操作栈的时候直接对SS修改。

而我的例子里。S ...

聪明,一点就透,好好学汇编这门很有前途的语言吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表