76

古い borland DOS コンパイラを使用していた頃、次のようなことができたのを覚えています。

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

現在、これを行うためのセミプラットフォームに依存しない方法はありますか? BIOS 呼び出しを行う必要があるため、asm コードを使用せずにこれを行う方法があれば、それも同様に役立ちます。

4

5 に答える 5

81

GCCの使用

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

VC++の使用

__asm {
  mov eax, edx
  add eax, 2
}
于 2008-09-14T14:05:30.787 に答える
18

GCC には、それだけではありません。命令では、オプティマイザが失敗しないように、何が変更されたかをコンパイラに伝える必要があります。私は専門家ではありませんが、時々次のようになります。

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

サンプル コードを C で記述し、GCC にアセンブリ リストの作成を依頼して、そのコードを変更することをお勧めします。

于 2008-09-15T00:10:07.743 に答える
7

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 ;
}
于 2008-09-14T13:57:55.780 に答える
2

Microsoftコンパイラの場合、インラインアセンブリはx86でのみサポートされます。他のターゲットの場合は、関数全体を別のアセンブリソースファイルで定義し、それをアセンブラに渡して、結果のオブジェクトモジュールをリンクする必要があります。

プロテクトモードのオペレーティングシステムでBIOSを呼び出すことができる可能性は非常に低いため、そのシステムで利用可能な機能を使用する必要があります。カーネルモードであっても、おそらく安全ではありません。そうすると、BIOSがOSの状態に関して正しく同期されない可能性があります。

于 2008-09-15T14:55:38.240 に答える