Есть два варианта решения вашей проблемы:
Первый вариант
Его предложил @HelloWorld в своём ответе. Я его несколько обобщу.
Суть решения: Уход от использования goto
(почему не стоит их использовать в высокоуровневых языках можете прочитать здесь или по первой ссылке в поисковике по запросу "почему не стоит использовать goto").
Например, можете либо писать код для действия прямо внутри case
, как предложил @HelloWorld, либо писать отдельные функции обработчики каждой инструкции:
// обработчик инструкции NMI_CALL
void NMI_CALL_handler() {
printf("Called interput NMI(int 2)\n");
system("pause");
exit(1);
}
void bios_call(uint8_t code) {
switch(code) {
...
case 2:
NMI_CALL_handler();
break; // если в обработчике будет exit, break не нужен
...
}
int main()
{
...
}
Второй вариант
Суть решения: использование списка (enum)
инструкций и обрабатывающего цикла.
Судя по приведенному вами ответу, структура вашей программы несколько нетипичная для C++
, попробуйте изменить структура вашей программы следующим образом:
enum Instructions {
INSTR_1 = 1,
NMI_CALL = 2,
...
};
...
// обработчик NMI_CALL
void NMI_CALL_handler() {
printf("Called interput NMI(int 2)\n");
system("pause");
exit(1);
}
...
// обработка итерации цикла
void execution_iter(uint8_t code) {
switch(code) {
...
case Instructions.NMI_CALL:
NMI_CALL_handler();
break;
}
}
// главный цикл обработки инструкций
void execution_loop(/* список инструкций */) {
for (/* цикл по списку */) {
uint8_t code = /* получить след. инструкцию из списка */
execution_iter(code);
}
}
int main()
{
...
execution_loop(/* список инструкций */);
...
}