. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于 栈的求助!?  [已解决] 回复[ 3次 ]   点击[ 569次 ]  
xy26333
[帖 主]   [ 发表时间:2010-07-06 23:32 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
assume cs:a
b segment
db 61h,62h,63h,64h,65h,66h,67h,68h,69h,6ah,6bh,6ch,6dh,6eh,6fh,70h
db 71h,72h,73h,74h
b ends
c segment
db 16 dup (00)
c ends
a segment
start:mov ax,b
mov ds,ax
mov ax,c
mov ss,ax
mov sp,????H
mov bx,001aH
mov ax,0000H
mov cx,0009H
s:push [bx]
sub bx,0002
loop s
mov ax,4c00H
int 21H
a ends
end start

事实上,我以前提过这个问题,不过至今没人可以完整解答...今天发帖出来是想大家一起探讨
事先声明:我家系统windows Vista(tm) Home Premium 32位

我所讨论的问题是:关于sp的赋值问题,针对sp的值不同,会有不同的情况....

针对以上程序 当sp为奇数时,第一种情况:依次赋值sp=1,3,5,7,9,时查看栈段0000:000F,fff0:ffff数据都为0  当要执行mov ss,ax(没有执行) 系统给出 APPCRASH 然后弹出对话框,让你选择后程序直接退出
第二种情况:继续赋值 奇数 sp=11,13,15,.....
当sp=11时,一直可以执行到 mov cx,0009H ,当要执行s:push [bx](没执行)时,同样APPCRASH
但是此时查看 栈段中的数据,发现一条规律:当sp=11时,就从10开始存放了10个字节的数据,这10个字节的数据比较特殊,-d ss:0000 000A:00( E2 17 00 00 0D 00 E3-17 23 12)(-u查看:我忘了,自己试试吧)
23 12 我不知道是什么意思
但这个17e3 000D 刚好为我的cs:ip(这不是巧合,我试验了多次 并且 ip一变化,000D这个数据也就跟着变化 注意以上的这点 下文要用),中间空了一个00 00   并且(ss)=17e2(很整齐的对应关系)
当sp=13时,从12开始存储这10字节的数据,并且可以执行一次入栈操作 然后APPCRASH
sp=15时,依次类推,并证实,可以执行2次入栈操作  然后APPCRASH
.......
第三种情况:当(sp)=偶数时

1:sp=0000,10字节的数据将在ss:fff6 ffff种储存 执行时 栈顶将环绕,可以正常执行完成 程序并退出
2:sp=0002,执行完mov ss,ax,要执行mov bx,001aH(没执行),显示Program terminated normally
并退出
   sp=0004,要执行mov bx,001aH(没执行),然后按照正常的顺序cs:ip应指向 mov ax,0000H 这条指令
  但是cs..ip都突变了,-d ss:fff0 ffff
17E2:FFF0  6F 00 00 00 B4 04 F1 00-53 00 (E2 17 00 00 0F 00)
    注意括号内的10字节的数据.....
-d ss:0000
17E2:0000  (38 00 23 12) 可以看出cs:ip应=0038:000F 而事实也正如此.. (关于cs.ip突变这个问题我以前提过  题目叫“实验5(6)”) 但是并没有满意的答案....
  sp=0006,与sp=0004不同的是,可以执行一次入栈操作...后cs:ip=0038:001a并不是000f了
  sp=0008,与sp=0006不同的是,可以执行两次入栈操作...后cs:ip=0038:001a(按照000f要变化成001a类推   为什么此时还是001a呢??) 还有一些数据上的疑惑点,但那个问题太难于表述了....
xy26333
[第1楼]   [ 回复时间:2010-07-06 23:52 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
这个 栈真的很奇怪 ,第一我赋值sp=9 按道理来说,应能执行4次入栈操作,而程序加载后,mov ss,ax 都没执行就直接退出了...
第二:为什么刚好sp=11时 可以刚好完成栈顶指向??如果说是因为要存放那10字节的数据的话,使sp大于等于0009H,sp=0009说不通,sp=偶数也说不通...
第三:当sp=0004时,10个字节的数据为什么会突变,导致了cs:ip突变
第四:当sp=0004时,cs:ip突变为0038:000f,而sp=0006时,突变后cs:ip=0038:001a
 可见由sp=4 到sp=6 突变值并不一样,那为什么又sp=6 到sp=8 突变值一样呢??
第五:对于栈中的数据,我明明定义的都是0,那10字节的数据为什么会存在,其意义? 有从何而来??
xy26333
[第2楼]   [ 回复时间:2010-07-10 20:35 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
额...仔细看了下书,猜想了下:cs:ip只能指向一处,我们在debug下,-d -r 应该也是若干指令集,要让他们执行必须也让cs:ip指向,所以就应该把原来cs,ip中的内容 暂存起来(-d -r最后,应该有出栈指令恢复cs,ip等原来的内容)结合实验结果来看,定是用栈来暂存数据了...也就是那10个字节 如果猜想正确的话,算是回答了第5问
xy26333
[第3楼]   [ 回复时间:2010-10-10 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
此贴由 贴主 于 [ 2010-10-10 13:48 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved