質問

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

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

現在、これを行うための半プラットフォームに依存しない方法はありますか?BIOS 呼び出しを行う必要があるので、ASM コードを使用せずにこれを行う方法があれば、それは私にとっても同様に便利です。

役に立ちましたか?

解決

使用する GCC

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

使用する VC++

__asm {
  mov eax, edx
  add eax, 2
}

他のヒント

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

    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

記事の例:

#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 ;
}

x86 以外の Microsoft コンパイラはインライン アセンブリをサポートしていません。関数全体を別のアセンブリ ソース ファイルで定義し、それをアセンブラに渡す必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top