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

2025-04-04 22:48:17
推荐回答(3个)
回答1:

由于你的程序给出的只是片段,具体功能看不出来,前面有两条连续重复出现的pushf指令似乎还是个错误,所以只能针对指令说一下。

关于你的第一处问题“这里按照栈……为什么是es”,程序没有错,是你理解上的问题。
栈,是一种先进后出的数据结构,按ax,bx,es顺序先后入栈的数据,ax内容被压在最底下,es的内容在最上面靠近栈顶。要恢复原样,出栈时上面的先弹出,所以必须按先es,后bx,再ax这样的顺序出栈。

关于你的第二个问题“这里才恢复标志……不是ax吗”,iret 是中断返回指令,用于结束中断服务子程序的运行,返回中断前的主程序断点现场。执行 iret 时,它将依次出栈3个字送往IP,CS和标志寄存器。这是与中断指令(或硬件中断)的入栈过程(先标志寄存器入栈,然后CS,最后IP)相对应的逆操作。
造成进入你这段中断程序的中断指令(或硬件中断IRQ请求响应过程)不在你列出的这段中断服务子程序中。

回答2:

可能的原因
1.书写错误
pushf
pushf
多了一个
2.
pushf
pushf
中第一个为dword ptr ds:[0]入口参数,由dword ptr ds:[0]负责堆栈平衡。

回答3:

call dword ptr ds:[0]
关键在于这一句,这一句是模拟中断调用,调用结束返回时,flags,cs,ip都出栈了
开始执行下面的语句
cmp al,1
jne int9end

mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+80+1]

此时栈顶的值是es.
之前我也以前错了,仔细看一下没错。