℡风雨烟尘 发表于 2012-10-23 22:37:40

汇编中关于pushf iret push pop的问题

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 int9end
   
         mov ax,0b800h
         mov es,ax
         inc byte ptr es:
   
int9end: pop es            ;这里按照栈的规则应该是第一个pushf的值,为什么是es
            pop bx
            pop ax
            iret                   ;这里才恢复标志寄存器的值,最先推入栈的不是ax吗

这两处不懂,求助各位高手,谢谢

无星之夜 发表于 2012-10-24 17:08:24

少年。。两次pushf是何意?写重了吧。再好好想想仔细看看,没错的

cjl 发表于 2013-5-21 09:08:56

我也在思考这个问题,两个pushf,其中一个在iret前已经popf了(用于if、tf值置0),另一个值按顺序应该是给了pop es,应该不是程序的意思,所以请高人点拨……

姗姗莱咫 发表于 2013-5-21 21:41:25

强烈支持楼主ing……

℡风雨烟尘 发表于 2013-5-21 22:39:03

这么久了,自己明白了,做个参考吧,iret 是中断返回指令,用于结束中断服务子程序的运行,返回中断前的主程序断点现场。执行 iret 时,它将依次出栈3个字送往IP,CS和标志寄存器。这是与中断指令(或硬件中断)的入栈过程(先标志寄存器入栈,然后CS,最后IP)相对应的逆操作。
造成进入这段中断程序的中断指令(或硬件中断IRQ请求响应过程)不在列出的这段中断服务子程序中。

虫虫 发表于 2013-5-22 22:50:05

路过打酱油的强烈支持楼主ing……

姗姗莱咫 发表于 2013-5-24 18:57:21

强烈支持楼主ing……
页: [1]
查看完整版本: 汇编中关于pushf iret push pop的问题