Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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程序时为11_C_Segmentation Fault_Int_Inline Assembly - Fatal编程技术网

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

分段故障:运行C程序时为11,c,segmentation-fault,int,inline-assembly,C,Segmentation Fault,Int,Inline Assembly,为了尝试使用C显示图形,我尝试利用C的“内联汇编”特性。我在编译期间没有收到任何错误,但当我尝试运行程序时,我收到以下错误: 分段错误:11 这是我的密码: int main(){ asm("movb 0xc,%ah"); asm("movb $1,%al"); asm("movw $5,%cx"); asm("movw $5,%dx"); asm("int $0xc"); return 0; } 赞赏建设性的批评,而不是侮辱。 谢谢 首先,看起来您试图使用BIOS中断来进行图形处理,但图形中

为了尝试使用C显示图形,我尝试利用C的“内联汇编”特性。我在编译期间没有收到任何错误,但当我尝试运行程序时,我收到以下错误:

分段错误:11

这是我的密码:

int main(){
asm("movb 0xc,%ah");
asm("movb $1,%al");
asm("movw $5,%cx");
asm("movw $5,%dx");
asm("int $0xc");
return 0;
}
赞赏建设性的批评,而不是侮辱。
谢谢

首先,看起来您试图使用BIOS中断来进行图形处理,但图形中断是,而不是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位保护模式二进制文件一起工作,但希望我已经击中了要害,您可以自己处理其余的代码。祝你好运

那么,是哪一行导致seg故障呢?1)您应该将这些语句组合成一个asm(“…\n\t…”)2)更重要的是:我知道没有任何操作系统可以工作(甚至假设您的意思是
int$0x10
)。@OilCharlesworth我不知道。我希望您使用的是DOS,因为其他一切都不支持软件中断来访问图形硬件…
movb
<代码>movw?这是。。。DEC Vax assembler?嗨,詹姆斯,你绘制像素的代码现在对我非常有用,你知道获取像素颜色的代码是什么吗?在这样低的级别上,像素格式和偏移计算将由使用的视频模式定义。VGA模式13h(在我的示例中)是一种索引颜色模式,因此您必须从视频内存中实际复制像素数据,并将这些值与调色板条目进行比较,以获得实际的颜色数据。您可以在此处阅读有关VGA图形编程的更多信息: