汇编新手,关于申请栈空间

hakufly 2011-10-26 04:13:26
在学习王爽汇编语言第二版自己动手做实验七的时候遇到的问题。
在程序中我使用两层循环,先将cx压栈。因为仅保存一次cx,所以我栈空间申请的很小(2个字节)。发现这样运行得不到想要的结果,debug的时候,运行到 MOV SI,0出错,提示为 program terminated normally。程序如下

DATAS SEGMENT
;此处输入数据段代码
DB '1975','1976','1977','1978','1979','1980','1981','1982','1983'
DB '1984','1985','1986','1987','1988','1989','1990','1991','1992'
DB '1993','1994','1995'
; 以上是表示21年的21个字符串,每一个占4个字节,共4*21=84(54H)个字节

DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
DD 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是21间公司的总收入,双字,占4*21=84(54H)字节

DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
DW 11542,14430,15257,17800
;以上是21年间的雇员人数,字,占2*21=42(2A)字节
DATAS ENDS

TABLE SEGMENT
DB 21 DUP ('YEAR SUMN NE ?? ') ;申请的表空间,对应表的项
TABLE ENDS

STACKS SEGMENT
;此处输入堆栈段代码
DW 0 ;栈空间,用于保存CX
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,TABLE
MOV ES,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,2

MOV BX,0
MOV SI,0
MOV BP,0
MOV DI,0

MOV CX,21
;此处输入代码段代码
S0:
PUSH CX
MOV CX,4
S1: ;完成年份和收入的复制
MOV AL,DS:[BX].0[SI]
MOV ES:[BP].0[DI],AL
MOV AL,DS:[BX].54H[SI]
MOV ES:[BP].5[DI],AL
INC SI
INC DI
LOOP S1

ADD BX,10H
ADD BP,10H
POP CX
LOOP S0


MOV AH,4CH
INT 21H
CODES ENDS
END START

然后我将栈空间改为DB 16 DUP (0) 就正常了。
是新手,有C++基础,不能理解这个现象和原因,栈空间申请必须为16或者16的整数倍么(书上的例子貌似都是的),求解???
分不多~~
...全文
417 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hakufly 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 korekara88730 的回复:]

你试试不debug 直接运行有错么?

如果debug有错,直接运行没有错,就是debug的时候也需要占用栈空间,而空间不够了
如果运行也有错,估计是别的什么地方占用了栈空间吧.

这本书我也看过一遍,所有上机都自己做过,从来没敢把栈空间调到那么小过.
[/Quote]
确实是你说的这种情况,非常感谢,人穷分少~将就下吧
hakufly 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 solozi 的回复:]

没细看你代码,按你描述应该是栈溢出,因为DEBUG发生中断时,会利用你指定的栈保存一些寄存器数据的,为了还原用,所以就不够用了。你程序要是直接执行应该是没问题的
[/Quote]

谢谢啊~人穷分少,将就下吧
aiyaya730 2011-10-27
  • 打赏
  • 举报
回复
俄..
突然想起来一件事情,
CS IP 这东西,也是要压栈的阿!

debug 的时候,至少还要压栈CS和IP,一个word 的栈空间当然不够用.
aiyaya730 2011-10-27
  • 打赏
  • 举报
回复
你试试不debug 直接运行有错么?

如果debug有错,直接运行没有错,就是debug的时候也需要占用栈空间,而空间不够了
如果运行也有错,估计是别的什么地方占用了栈空间吧.

这本书我也看过一遍,所有上机都自己做过,从来没敢把栈空间调到那么小过.
Solozi 2011-10-27
  • 打赏
  • 举报
回复
没细看你代码,按你描述应该是栈溢出,因为DEBUG发生中断时,会利用你指定的栈保存一些寄存器数据的,为了还原用,所以就不够用了。你程序要是直接执行应该是没问题的

21,459

社区成员

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

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