汇编15章int9中断一个小疑问..求解释
assume cs:codestack segment
db 128 dup(0)
stack ends
data segment
dw 0,0
data ends
code segment
dong:mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
push es:
pop ds:
push es:
pop ds:
mov word ptr es:,offset int9
mov es:,cs
mov ax,0b800h
mov es,ax
mov ah,'a'
s:
mov es:,ah
call delay
inc ah
cmp ah,'z'
jna s
mov ax,0
mov es,ax
push ds:
pop es:
push ds:
pop es:
mov ax,4c00h
int 21h
delay:
push ax
push dx
mov dx,1000h
mov ax,0
s1:
sub ax,1
sbb dx,0
cmp dx,0
jne s1
pop dx
pop ax
ret
int9:
push ax
push bx
push es
in al,60h
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:
int9ret:
pop es
pop bx
pop ax
iret
code ends
end dong
69. int9:
70. push ax
71. push bx
72. push es
73.
74. in al,60h
75.
76. pushf
77. pushf
78. pop bx
79. and bh,11111100b
80. push bx
81. popf
82. call dword ptr ds:
83.
84. cmp al,1
85. jne int9ret
86.
87. mov ax,0b800h
88. mov es,ax
89. inc byte ptr es:
90.
91. int9ret:
92.
93. pop es
94. pop bx
95. pop ax
96. iret
主要是这里pushf标志寄存器进栈2次,却只出栈一次,那第一个压栈的标志寄存器,数据按思路屡下去就给了es,我尝试,只用一个pushf但是程序运行起来,得不到预期的效果,求解释。 {:5_109:}好像懂点了,自己捉摸着有点意思,坐等大侠指点。求验证,
我理解的思路是call dword ptr ds: 在真实int9中断返回时,iret把我第一次压栈的标志寄存器的内容给popf出来了。
{:5_90:}坑爹的我,深更半夜自问自答。
页:
[1]