离丶dong子 发表于 2012-7-26 02:00:56

汇编15章int9中断一个小疑问..求解释

assume cs:code
stack 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
          
          
          
          
          

离丶dong子 发表于 2012-7-26 02:03:20

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但是程序运行起来,得不到预期的效果,求解释。

离丶dong子 发表于 2012-7-26 02:06:21

{:5_109:}好像懂点了,自己捉摸着有点意思,坐等大侠指点。求验证,
我理解的思路是call dword ptr ds: 在真实int9中断返回时,iret把我第一次压栈的标志寄存器的内容给popf出来了。

离丶dong子 发表于 2012-7-26 02:06:52

{:5_90:}坑爹的我,深更半夜自问自答。
页: [1]
查看完整版本: 汇编15章int9中断一个小疑问..求解释