第6章 6.2 在代码段中使用栈

在看原书代码之前,我试图自己完成书中提出的问题:使用代码段中的栈空间,于是我写出了如下代码段:

assume cs:code
	code segment
		dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
		dw 0,0,0,0,0,0,0,0
		start:
		mov ax, 0
		mov bx, 0
		mov dx, cs
		add dx, 1
		mov ss, dx
		mov sp,10h
		mov cx, 8h
		s:
		push cs:[bx]
		add bx,2
		loop s 
		xor bx, bx
		;mov cx, 8
		l:
		pop cs:[bx]
		add bx,2
		loop l
		
		mov ax, 4c00h
		int 21h
		code ends
	end start
结果在debug调试的时候报错:

我发现这是在压栈的时候出现的错误,到栈顶指针小于0xa时,就弹出了这条错误。我感到很奇怪,因为我构造的栈空间刚好和需要压栈的空间一样大,并且栈并没有溢出呀,怎么莫名奇妙弹出这样的错误?我看来原书的代码,原书开辟的栈空间时需要压栈的空间的两倍大小。于是我修改了原来的栈空间,变成两倍的大小。

再次编译,没有报错,并且在调试的时候调试到原来的位置并没有报错。看来栈空间应该大一些才好。但是我继续调试,发现程序陷入了死循环,我看了一下寄存器cx的值,已经变成了0xfffe了,原来在第二个loop语句执行之前我忘记修改新的cx的值了,记住,每次loop循环都需要指定cx的值!!!

修改后正确的代码:

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, 0
		mov bx, 0
		mov dx, cs
		add dx, 1
		mov ss, dx
		mov sp,20h
		mov cx, 8h
		s:
		push cs:[bx]
		add bx,2
		loop s 
		xor bx, bx
		mov cx, 8 ;每次循环之前不要忘记赋值
		l:
		pop cs:[bx]
		add bx,2
		loop l
		
		mov ax, 4c00h
		int 21h
		code ends
	end start


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值