Assembly 从IRQ处理程序获取返回地址?

Assembly 从IRQ处理程序获取返回地址?,assembly,x86,Assembly,X86,如何在32位保护模式(x86)下查看PIT IRQ处理程序的返回值?我想我可以这样做,我不完全确定 pop eax ; pop last thing from stack mov dword return_address,eax push eax iret 这将从堆栈中读取正确的项,但如果这样做,将损坏eax 正确的ISR在执行结束时,必须将所有已使用的寄存器恢复到ISR启动时的状态 还有一件事需要注意返回\u地址将通过段寄存器(此处为ds)被(隐式)引用。如果在ISR和ISR中断的代码中,

如何在32位保护模式(x86)下查看PIT IRQ处理程序的返回值?我想我可以这样做,我不完全确定

pop eax ; pop last thing from stack
mov dword return_address,eax
push eax
iret 

这将从堆栈中读取正确的项,但如果这样做,将损坏
eax

正确的ISR在执行结束时,必须将所有已使用的寄存器恢复到ISR启动时的状态

还有一件事需要注意<代码>返回\u地址将通过段寄存器(此处为
ds
)被(隐式)引用。如果在ISR和ISR中断的代码中,
ds
始终相同,则这是正常的。但是,如果中断的代码更改了
ds
,ISR必须在开始时保存
ds
,将其设置为正确的选择器值,使用它,然后恢复它。如果不这样做,该
mov
指令可能会损坏内存或导致异常。

类似于

push eax
push ds
mov eax,cs:saved_ds
mov ds,eax
mov eax,[esp+8]
mov return_address,eax
pop ds
pop eax
iret
将保留eax,并可处理任意段值。它要求您在上述ISR运行之前,将“ds”段寄存器保存在
saved_ds
中。它使用
cs
寄存器访问它-大多数(所有?)平台的cs基等于ds基,并且cs可读

通常,ISR必须确认IRQ(您的代码是软件中断挂钩吗?)。你的代码没有显示出来,所以我认为你在问题中的代码片段只是真实代码的精简版本