栈空间的开辟刚好的空间不行吗?

StillMiss 2011-03-24 11:03:32
下面代码这是网上找网友‘莫取网名 ’整理的答案。
题目是实现依次用内存0:0 - 0:15的单元中的内容改写程序中的数据,数据的传送用栈来进行
我对这段程序执行过程理解是,
push一次是放在开辟的第13个字单元里,
然后马上POP到 要被替换的dw定义的开头的空间。
sp是从1Ah变到18H 然后执行覆盖后,sp变会1AH
其实用到的就第第三个字空间做中转。那么有必要定义那么多吗?
dw 0,0,0,0,0不是浪费
直接定义一个不就行了吗?
不对之处请各位指出。
我不知道是不是因为说debug运行也会占用栈的空间。。上次好像看到类似的帖,


assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw 0,0,0,0,0

start:

mov ax,cs ;cs为所填第一空

mov ss,ax

mov sp,1ah ;此条指令为所填第二空

mov ax,0

mov ds,ax

mov bx,0

mov cx,8

s:

push [bx]

pop cs:[bx] ;此条指令为所填第三空

add bx,2

loop s



mov ax,4c00h

int 21h

codesg ends

end start



...全文
111 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzhfu 2011-03-25
  • 打赏
  • 举报
回复
段是指用segment定义的。

datassg segment ;这是一个独立的段。
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dataseg ends

stackseg segment ;这是另一个独立的段。
dw 0,0,0,0,0 ;定义了10个字节,但后面的6个字节也空着,
stackseg ends

codesg segment ;这是因为,codeseg又从下一个xxxx0H的地址开始
start:
...



StillMiss 2011-03-25
  • 打赏
  • 举报
回复
offset 那个还没学呢。

‘上面说的“它们实际上都是占用16个字节”是错的,那句话是对独立定义的段说的。’

独立定义的段是只用stack定义的吗? 这种dw定义出来的,上面这句话不适用于dw是把?那我暂时无视了啊。

谢谢!!!
shzhfu 2011-03-25
  • 打赏
  • 举报
回复
流程没错,不过 mov sp,1ah 可换成 mov sp,offset start(实际上1ah就是最后那个0的下一个单元,也就是start:这一句的地址,这样当前面有很多数据时,不用自己去数sp的位置了。)

前面没注意你用的是一个段,所以对这个程序来说,上面说的“它们实际上都是占用16个字节”是错的,那句话是对独立定义的段说的。
StillMiss 2011-03-25
  • 打赏
  • 举报
回复
谢谢 shzhfu 的帮助。
上面我对程序的流程理解没错吧?
shzhfu 2011-03-25
  • 打赏
  • 举报
回复
以前DOS下没留意过,但在windows下,操作系统总要占用4个字节的栈空间,所以栈的大小不能刚好,要多预留至少2个字。

另外,默认情况下,一个段总是占用16的倍数个字节,所以你定义3个单元、5个单元和8个单元,它们实际上都是占用16个字节。只不过是sp的初始位置不同。
StillMiss 2011-03-25
  • 打赏
  • 举报
回复
现在还不太懂 多个代码段的写不会。 等学到了在研究。谢谢LSD热心帮助

21,497

社区成员

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

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