分段故障:运行C程序时为11
为了尝试使用C显示图形,我尝试利用C的“内联汇编”特性。我在编译期间没有收到任何错误,但当我尝试运行程序时,我收到以下错误:分段故障:运行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中断来进行图形处理,但图形中
分段错误: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图形编程的更多信息: