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

时间:2008-09-14 13:55:31

标签: c inline-assembly assembly

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

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

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

5 个答案:

答案 0 :(得分:61)

使用GCC

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

使用VC++

__asm {
  mov eax, edx
  add eax, 2
}

答案 1 :(得分:12)

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

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

在C中编写一些示例代码是个好主意,然后让GCC生成一个汇编列表,然后修改该代码。

答案 2 :(得分:5)

一个好的开始是阅读本文,讨论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 ;
}

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

asm__asm__ 函数的使用(在编译器中有所不同)

您也可以使用 fortran 函数编写 Fortran 代码

asm("syscall");
fortran("Print *,"J");