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

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

Is there a way to insert assembly code into C?

我记得当初使用旧的borland DOS编译器时,您可以执行以下操作:

1
2
3
4
asm {
 mov ax,ex
 etc etc...
}

现在是否有一种半平台独立的方式来执行此操作?我需要进行BIOS调用,因此,如果有一种方法可以在没有asm代码的情况下进行此操作,那对我同样有用。


使用GCC

1
2
3
4
__asm__("movl %edx, %eax\
\\t"

       "addl $2, %eax\
\\t"
);

使用VC

1
2
3
4
__asm {
  mov eax, edx
  add eax, 2
}

在海湾合作委员会,还有更多的东西。在指令中,您必须告诉编译器进行了哪些更改,以便其优化程序不会出错。我不是专家,但有时看起来像这样:

1
    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

文章示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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 ;
}

对于Microsoft编译器,仅x86支持内联汇编。对于其他目标,您必须在单独的汇编源文件中定义整个函数,然后将其传递给汇编器并链接生成的对象模块。

您极不可能在保护模式操作系统下调用BIOS,并且应使用该系统上可用的任何功能。即使您处于内核模式,也可能不安全-如果这样做,BIOS可能无法正确地相对于操作系统状态进行同步。


推荐阅读