Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用寄存器调用中断 我试图通过C++返回到真正的模式,调用中断并返回到保护模式,调用保护模式中的一些中断。我得到一个错误:_C++_Assembly_Osdev - Fatal编程技术网

使用寄存器调用中断 我试图通过C++返回到真正的模式,调用中断并返回到保护模式,调用保护模式中的一些中断。我得到一个错误:

使用寄存器调用中断 我试图通过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

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 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位?