栈段的问题

StillMiss 2011-03-23 09:22:14
问下各位,这代码是王爽汇编6.2节的 在代码段里使用栈。

利用栈,将程序中定义的数据逆向存放。

我在debug了几次。

程序指向的SP是从20H 一直往上 1E ,1C ,1A,18,16,14,12,10

在第二循环s0的时候 然后sp往上加10-12-14了

书上说是dw开辟了32个字的内存空间。为什么程序不往上继续?


assume cs:code
code segment
dw 123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0

start: mov ax,cs
mov ss,ax
mov sp,32
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




...全文
154 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小骆驼_8 2011-04-04
  • 打赏
  • 举报
回复
8086CPU堆栈是向下生长型,所以压栈操作时SP-2,出栈时sp+2
feizigegeyeye 2011-04-04
  • 打赏
  • 举报
回复
呵呵 学习了
masmaster 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 stillmiss 的回复:]
噢 谢谢masmaster啊

如果要把前面的dw 0123H 一起的8个字空间数据给覆盖掉,而不放在后面dw 0那8个字空间

要怎么改啊?
[/Quote]


利用交换法逆序数组。
assume cs:code
code segment
dw 123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
mov ax,cs
mov ds,ax

mov cx,4 ;字操作,交换4次就可以了
mov si,0 ;第一个数组元素地址
mov di,0eh ;最后一个数组元素地址
s:
mov ax,[si] ;暂存
mov bx,[di] ;
mov [si],bx ;交换
mov [di],ax ;
add si,2 ;指针指向下一个字
sub di,2 ;指针指向上一个字
loop s ;

mov ax,4c00h
int 21h

code ends
end start


d:\masm>
StillMiss 2011-03-23
  • 打赏
  • 举报
回复
噢 谢谢masmaster啊

如果要把前面的dw 0123H 一起的8个字空间数据给覆盖掉,而不放在后面dw 0那8个字空间

要怎么改啊?
masmaster 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 stillmiss 的回复:]
debug下 后面8个字空间为

-D ss:0
00 00 00 00 00 00 E6 29 -00 00 27 00 E6 29 D8 23

29E6为ss里面的值 为什么是上面这种情况大虾帮忙解释下啊
[/Quote]
debug在单步的时候也需要使用栈。也就是说, 后面的一些数据, 是debug将程序载入以后生产的。这也就是说, 在定义栈的时候, 大一点总比小了好的原因。
StillMiss 2011-03-23
  • 打赏
  • 举报
回复
debug下 后面8个字空间为

-D ss:0
00 00 00 00 00 00 E6 29 -00 00 27 00 E6 29 D8 23

29E6为ss里面的值 为什么是上面这种情况大虾帮忙解释下啊
masmaster 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stillmiss 的回复:]
-d ss:0 查看内存里的内容 前面定义的8个字型数据全部没变
但是后面的8个字型值改变了。 为什么这个时候变了啊。这里就做了个sp=32的动作啊、
[/Quote]
嗯, 那当然啦,你不是把CS里的两段dw的空间都给SS了嘛
StillMiss 2011-03-23
  • 打赏
  • 举报
回复
-d ss:0 查看内存里的内容 前面定义的8个字型数据全部没变
但是后面的8个字型值改变了。 为什么这个时候变了啊。这里就做了个sp=32的动作啊、
va_zaixuexi 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 masmaster 的回复:]
debug到
mov ss,ax
mov sp,32
的时候, 你查看一下栈段里是什么?
-dss:0
然后到
s: push cs:[bx]
的时候 , 你观察ss段以及sp的变化

。。。

s0: pop cs:[bx]
的时候, 你再观察ss段和sp的变化,

这是debug一个简单程序必备的步骤, 通过观察各个寄存器以及内存地址的变化,才能感性的理解汇编……
[/Quote]

说到点子上了!!!!!
masmaster 2011-03-23
  • 打赏
  • 举报
回复
debug到
mov ss,ax
mov sp,32
的时候, 你查看一下栈段里是什么?
-dss:0
然后到
s: push cs:[bx]
的时候 , 你观察ss段以及sp的变化

。。。

s0: pop cs:[bx]
的时候, 你再观察ss段和sp的变化,

这是debug一个简单程序必备的步骤, 通过观察各个寄存器以及内存地址的变化,才能感性的理解汇编。
StillMiss 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 masmaster 的回复:]
push操作一次,sp-=2;
pop操作一次,sp+=2;
[/Quote]

所以程序一直在dw定义的8个字空间做交换?

它是先把前面的dwdw 123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

push进后面的8个字空间,然后在把数据倒过来?但是操作的还是后面8个字空间?

这么理解对吗。
masmaster 2011-03-23
  • 打赏
  • 举报
回复
push操作一次,sp-=2;
pop操作一次,sp+=2;
程序开辟了32个字空间给栈,栈指针只能在这空间里push/pop,如果空间过小, 则会产生越界(上溢/下溢)
StillMiss 2011-03-23
  • 打赏
  • 举报
回复
栈段真不熟,那个只看得懂那个push 寄存器,pop 寄存器

发现栈跟其他内存段之间的交互看的迷糊。大侠们帮我解惑下吧!

21,459

社区成员

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

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