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的倍數。
但是為什么會崩潰我還是不明白??