assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 128
push cs
pop ds
mov ax, 0
mov es, ax
mov si, offset int9
mov di, 204h
mov cx, offset int9end-offset int9
cld
rep movsb
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]
cli
mov word ptr es:[9*4], 204h
mov word ptr es:[9*4+2], 0
sti
mov ax, 4c00h
int 21h
int9:
push ax ;------------------------ sp
push bx ;------------------------ sp - 2
push cx ;------------------------ sp - 2
push es ;------------------------ sp - 2
in al, 60h
pushf ;------------------------ sp - 2 ??? 这里入的是和上面是同一段栈吗? 我的问题是在下面出栈的顺序,请看int9ret标识处
call dword ptr cs:[200h] ;--------------- cs 入栈,ip入栈
cmp al, 3bh
jne int9ret
mov ax, 0b800h
mov es, ax
mov bx, 1
mov cx, 2000
s:
inc byte ptr es:[bx]
add bx, 2
loop s
int9ret:
pop es ;如果是同一段栈那么这里es应该是ip的值
pop cx ;这里是cx是CS的值
pop bx ;这里是标志寄存器的值才对,可程序正常返回,就是请教这里栈的问题?
pop ax
iret
int9end:
nop
code ends
end start |