第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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章