使用寄存器调用中断 我试图通过C++返回到真正的模式,调用中断并返回到保护模式,调用保护模式中的一些中断。我得到一个错误:
C2400:操作数类型不正确 我正试图解决这个问题,但我不知道从哪里开始。以下是我的代码摘录:使用寄存器调用中断 我试图通过C++返回到真正的模式,调用中断并返回到保护模式,调用保护模式中的一些中断。我得到一个错误:,c++,assembly,osdev,C++,Assembly,Osdev,C2400:操作数类型不正确 我正试图解决这个问题,但我不知道从哪里开始。以下是我的代码摘录: void intupt(char intr) //Call interrupt function. INTR is number of interrupt. { pm2rm(); //Protected Mode To Real Mode __asm { mov al, [intr] //Put intr to AL register int a
void intupt(char intr) //Call interrupt function. INTR is number of interrupt.
{
pm2rm(); //Protected Mode To Real Mode
__asm
{
mov al, [intr] //Put intr to AL register
int al // call interrupt using AL
}
rm2pm(); //Real Mode to Protected Mode
}
为什么我会犯这样的错误?关于发生这种情况的原因有什么建议吗?
int
从不将寄存器作为操作数,而只将其作为字节文字。如果您希望能够在寄存器中指定要调用的中断,则需要使用调度表。什么是调度表?@ASD听起来是一个非常好的问题,在注释中可能有点大。如果你不能通过网络搜索找到一个好的答案,我建议你提出一个新问题。很有可能这里有人能给出一个与你的程序相关的好答案。@ASD:就像一个C开关
语句,对于int 0x1
,有一个case
,另一个用于int 0x2
,等等,如果你甚至费心先问计算机的话。在这种情况下,调度表已经作为中断向量表本身存在。我倾向于pushf,通过一个包含中断向量地址的寄存器进行far调用,而不是直接使用int
指令。pushf/far调用将模拟int
。要调用实模式中断,只需按下标志并通过中断向量表进行far调用。您使用的是什么编译器?pm2rm()
中的代码有什么作用?它是否使用适当的实模式段值重新加载CS寄存器?还是只清除CR0中的PE位?