分段故障:运行C程序时为11

时间:2011-08-15 17:11:43

标签: c segmentation-fault int inline-assembly

为了尝试使用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 个答案:

答案 0 :(得分:2)

首先,看起来您正在尝试使用BIOS中断来执行图形处理,但图形中断是int 10h (0x10),而不是0xc,因此您要调用int $ 0x10。

其次,您无法从32位或64位Linux或Windows程序中调用大多数BIOS中断,因此请确保您正在为DOS编译此项。否则,在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位保护模式二进制文件一起工作,但希望我已经点击了钉子足够接近头部,你可以自己处理其余部分。祝你好运!