Ошибка сегментации: 11 при запуске программы на C - PullRequest
0 голосов
/ 15 августа 2011

Чтобы попытаться отобразить графику с помощью C, я пытаюсь воспользоваться функцией C «встроенной сборки».Я не получаю ошибок во время компиляции, но когда я пытаюсь запустить программу, я получаю эту ошибку:

Segmentation Fault: 11

Вот мой код:

int main(){
asm("movb 0xc,%ah");
asm("movb $1,%al");
asm("movw $5,%cx");
asm("movw $5,%dx");
asm("int $0xc");
return 0;
}

Конструктивная критика приветствуется, оскорблений нет.Спасибо!

1 Ответ

2 голосов
/ 15 августа 2011

Во-первых, похоже, что вы пытаетесь использовать прерывания BIOS для создания графики, но графическое прерывание составляет int 10h (0x10) , а не 0xc, поэтому вы хотите вызвать int $ 0x10.

Во-вторых, вы не можете вызывать большинство прерываний BIOS из 32-битных или 64-битных программ Linux или Windows, поэтому убедитесь, что вы компилируете это для DOS.В противном случае вызов кода операции прерывания по BIOS для прерывания BIOS приведет к сбою вашей программы.И если вы используете более новую версию Windows, вам, вероятно, все равно придется запускать скомпилированную программу внутри эмулятора, такого как DOSBox, чтобы она работала правильно.

Наконец, встроенная сборка GCC имеет определенный формат:

   __asm__ __volatile__ ( 
         assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );

Так, например:

int main()
{
  /* Set video mode: */
  __asm__ __volatile__ (
    "movb $0x0, %%ah \n\
     movb $0x13, %%al \n\
     int $0x10"
    :
    :
    :"ax"
  );

  /* Draw pixel of color 1 at 5,5: */
  __asm__ __volatile__ (
    "movb $0xC,%%ah \n\
     movb $1, %%al \n\
     movw $5, %%cx \n\
     movw $5, %%dx \n\
     int $0x10"
   :
   :
   :"ax","cx","dx"
  );

  /* Reset video mode: */
  __asm__ __volatile__ (
    "movb $0x0, %%ah \n\
     movb $0x03, %%al \n\
     int $0x10"
    :
    :
    :"ax"
  );

  return 0;
}

Но необязательные поля действительно полезны, только если вы пишете функции на языке ассемблера и хотите передать аргументы из кода C,

Кроме того, у меня нет удобной установки DJGPP и DOS, поэтому я не могу протестировать этот код, чтобы убедиться, что он работает с исполняемыми двоичными файлами 32-битного защищенного режима, но, надеюсь, я 'Прикоснитесь гвоздем достаточно близко к голове, чтобы вы могли справиться с остальными самостоятельно.Удачи!

...