2008-09-14 139 views
46

我记得在与老的Borland DOS编译器的一天,你可以做这样的事情:有没有办法将汇编代码插入到C?

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

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

+0

另请参阅[inline-assembly标记wiki](https://stackoverflow.com/tags/inline-assembly/info)中的链接了解如何正确使用。这很难,最好的建议是https://gcc.gnu.org/wiki/DontUseInlineAsm。为了提高性能,请尽可能调整源代码以帮助编译器创建更好的代码,而不是使用内联asm。 (例如,通过查看编译器的asm输出来查看它未能优化或错误的地方)。 – 2017-10-27 08:49:57

回答

54

使用GCC

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

使用VC++

__asm { 
    mov eax, edx 
    add eax, 2 
} 
+0

来自CodeGear的C++ Builder也支持__asm关键字。 – stukelly 2008-09-14 14:20:01

+0

VS编译器不支持内联汇编!几年前,我烧伤了我的手指! – 2012-05-02 07:04:15

4

一个良好的开端将阅读本文其中谈论联汇编在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 ; 
} 
9

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

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

这是用C来写一些示例代码是个好主意,然后问GCC生成汇编清单,然后修改代码。

2

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

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

相关问题