在开发虚拟机时,我需要编写 BIOS 中断处理程序。
简而言之:
void bios_call(uint8_t code) {
switch(code) {
...
case 2:
goto NMI_CALL;
break;
...
}
int main()
{
...
NMI_CALL:
printf("Called interput NMI(int 2)\n");
system("pause");
return 1;
}
因为goto我不知道哪个函数return 1;会返回 1(bios_call或main)。
可能需要采取类似措施asm("pop")才能重新获得控制权。main()
是的,代码不起作用,中断应该在 IVT(内存中)中,而不是在外部函数中,所以这个问题毫无意义,但由于 StackOverflow 规则我无法删除(问题已经得到解答)。对不起。
尝试退出函数
<stdlib.h>,例如exit如果我们谈论的是 C++,那么显然异常是一种“中断”或过程间 goto 的类似物:
如果对于 C,那么过程间 goto 的类似物是
setjmp()/longjmp()(在 C++ 中使用时,它们不会调用堆栈上的对象的析构函数,即严格来说在 C++ 中它们仅适用于使用后续硬性_Exit()、没有自由主义和没有returnC++ 的 POSIX 函数,实际上它们可能保留在 C++ 标准中):信号也可以作为中断的类似物,但这更多的是关于具有处理、返回和延续的中断。
有两种方法可以解决您的问题:
第一个选项
这是@HelloWorld在他的回答中提出的。我将稍微概括一下。
解决方案的本质:避免使用
goto(为什么不应该在高级语言中使用它们,您可以在这里阅读或者通过搜索引擎中查询“为什么不应该使用 goto”的第一个链接)。例如,您可以按照@HelloWorld
case建议的那样直接在里面编写操作代码,或者编写单独的函数来处理每个指令:第二种选择
解决方案的本质:使用指令列表
(enum)和处理循环。根据您的回答,您的程序结构有些不典型
C++,请尝试按如下方式更改您的程序结构: