在看原書代碼之前,我試圖自己完成書中提出的問題:使用代碼段中的棧空間,於是我寫出瞭如下代碼段:
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