2008-09-14 93 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可能無法正確地與操作系統狀態同步。

相關問題