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

时间:2012-09-16 07:18:37

标签: assembly x86

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

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

2 个答案:

答案 0 :(得分:5)

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

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

需要注意的另一件事...... return_address将通过段寄存器(此处为ds)进行引用(隐式)。如果ds在ISR和ISR中断的代码中始终相同,则可以。但是,如果中断的代码更改ds,则ISR必须在其开头保存ds,将其设置为正确的选择器值,使用它然后将其还原。如果不这样做,mov指令可能会破坏内存或导致异常。

答案 1 :(得分:0)

更像是

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(您的代码是软件中断挂钩?)。你的代码没有显示,所以我认为问题中的代码片段只是真实代码的精简版。