有没有办法将汇编代码插入到C?

我记得在旧的borland DOS编译器的一天,你可以做这样的事情:

asm { mov ax,ex etc etc... } 

现在有没有半平台独立的方式来做到这一点? 我有一个需要进行BIOS调用,所以如果有一种方法来做到这一点没有ASM代码,这对我来说同样有用。

使用GCC

 __asm__("movl %edx, %eax\n\t" "addl $2, %eax\n\t"); 

使用VC ++

 __asm { mov eax, edx add eax, 2 } 

在海湾合作委员会,除此之外还有更多。 在这个指令中,你必须告诉编译器什么改变了,所以它的优化器不会搞砸。 我不是专家,但有时看起来像这样:

  asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory"); 

用C编写一些示例代码是一个好主意,然后要求GCC产生一个汇编列表,然后修改这个代码。

一个好的开始将阅读这篇文章,谈论在C / C + +内联汇编:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

文章示例:

 #include <stdio.h> int main() { /* Add 10 and 20 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "addl %ebx, %eax;" ); /* Subtract 20 from 10 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "subl %ebx, %eax;" ); /* Multiply 10 and 20 and store result into register %eax */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "imull %ebx, %eax;" ); return 0 ; } 

非x86 Microsoft编译器不支持内联汇编。 您必须在一个单独的汇编源文件中定义整个函数,并将其传递给汇编程序。

您很可能无法在保护模式操作系统下调用BIOS,并且应该使用该系统上可用的任何设施。 即使您处于内核模式,也可能是不安全的 – 如果您这样做,BIOS可能无法正确地与操作系统状态同步。