这段代码中如何知道栈底的,请大家帮忙指点

etracer 2009-08-08 12:27:39
书上原话:“我们要将cs:10~cs:2F的内存空间当作栈来用,所以ss:sp要指向栈底,则设置ss:sp指向cs:30”
我不明白他是如何得到这个30h的呢?怎么计算出来的呢?迷茫中......请您指点
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,30h

mov bx,0
mov cx,8
s: push cs: [bx]
add bx,2
loop s

mov bx,0
mov cx,8
s0:pop cs:[bx]
add bx,2
loop s0

mov ax 4c00h
int 21h

code ends
end start
...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
etracer 2009-08-09
  • 打赏
  • 举报
回复
谢谢各位
大熊猫侯佩 2009-08-08
  • 打赏
  • 举报
回复
这个要根据代码对堆栈的使用情况而定,对于windows下的编程这个一般不用你操心了。
nanlingcg 2009-08-08
  • 打赏
  • 举报
回复
one:CS,SS合用一个段。-- 代码段就是堆栈段。
two:在CS段一开始以定义变量的方式(dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 )占用了18H(24D)个字空间(32个字节空间)--你自己用DEBUG D命令看 CS:0000后面32个字节及32个字节后的内容了,我就不一一列出了。
three:你这个简短程序的目的是熟悉出入栈操作。
首先将实现把0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h以此压入以CS(SS):0030H(就是首个指令mov ax,cs的地址)为起始栈低的内存区域。也就是把01H压进cs:002f,02H压进cs:002e,以此类推。为什么压进CS:002F和CS:002E,自己看栈操作解释。。。
后面的POP操作也类似。。。就不啰唆了。。。

那么他是如何得到这个30h的呢?怎么计算出来的呢?
因为CS:002f-CS:0000共30H个字节空间已被你用两个DW分别分配走了。而CS:002F-CS:0010共20个字节空间被DW 0,。。。全部是0了。这样用CS:0030为栈底,在第一次PUSH时SP将指向CS:000E就把0123H以高高低低的规则将12H压进了CS:002f,23H压进了CS:002e其余循环操作类似。。。就将那一大堆0123H等的数字压进了CS;0020-CS:002F(这段里原都是0,压进去在这个程序中不会影响程序。)
简短地说:这个30H以上的字节空间已被你定义过了,而且,30H以上20H个字节空间被你定义为全0了,对他进行PUSH在本程序里没关系。他的计算是因为你的两个DW 定义了30H个字节。也就是CS:0000-CS:002F,把SP设为30H后,第一个PUSH操作正好可以最大利用第二个DW出来的20H个字节空间。

附加说明:这个程序理论上把SP设为0020-0030都是可以的,当在实际中设的过小会有一点小问题。。。这是外话,就不多说。设为2aH-30H应该都没问题...

多看下栈操作的解释多DEBUG应该可以搞明白!
gzgzlxg 2009-08-08
  • 打赏
  • 举报
回复
assume cs:code 
code segment

MyData dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
MyStack dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
StackPointer equ $ - MyData
start:
mov ax,cs
mov ss,ax
mov sp,StackPointer ; 如果你的那些 0 的个数没有敲错,那这个值即为 30h

mov bx,0
mov cx,8
s:
push cs: [bx]
add bx,2
loop s

mov bx,0
mov cx,8
s0:
pop cs:[bx]
add bx,2
loop s0

mov ax 4c00h
int 21h
code ends
end start
BAYNPU 2009-08-08
  • 打赏
  • 举报
回复
它是将8字变量依次压入堆栈,然后又依次弹出堆栈,30H是根据8字变量算出来,你随便给ss:sp赋上一个值程序运行时压栈\出栈不是我们想要的正常数据.
百事烟 2009-08-08
  • 打赏
  • 举报
回复
我也在看这段啊,那个不是算出来的,是假设的,8086的栈范围 0-ffff//第三章最后一节
也可以这么说:
我们要将cs:10~cs:FF3F的内存空间当作栈来用,所以ss:sp要指向栈底,
则设置ss:sp指向cs:FF40” //FF3F+1 = FF40


21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧