|
主题 : : 关于 栈的求助!? [已解决] |
回复[ 3次 ]
点击[ 569次 ] | |
荣誉值: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呢??) 还有一些数据上的疑惑点,但那个问题太难于表述了.... | | |