assume cs:codeseg
codeseg segment
mov ax,2000H
mov ss,ax
mov sp,0
add sp,4
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21h
codeseg ends
end
按理来说是DOS中没有栈保护的啊?怎么会就溢出了呢?
经过大量的调试测试:
我试过了,只有ADD SP,N
N <= 10H
并且 N = 奇数 的时候就会崩溃
偶数不崩溃?
N >= 10H 的时候,奇偶都可以
N=7,9,B就直接崩溃
偶数在<=4就触发 DEBUG 的断点中断 INT 3中断
可能关乎 16位机的取数原则:16位机取每次取2个字节,并且最好取偶数地址,取奇数地址则要读取内存2次。意思是栈中的内存SP地址(包括DI,SI等)最好是2的倍数(16位机),这样访存时间最快。32则是4的倍数。
但是为什么会崩溃我还是不明白??