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