古い borland DOS コンパイラを使用していた頃、次のようなことができたのを覚えています。
asm {
mov ax,ex
etc etc...
}
現在、これを行うためのセミプラットフォームに依存しない方法はありますか? BIOS 呼び出しを行う必要があるため、asm コードを使用せずにこれを行う方法があれば、それも同様に役立ちます。
古い borland DOS コンパイラを使用していた頃、次のようなことができたのを覚えています。
asm {
mov ax,ex
etc etc...
}
現在、これを行うためのセミプラットフォームに依存しない方法はありますか? BIOS 呼び出しを行う必要があるため、asm コードを使用せずにこれを行う方法があれば、それも同様に役立ちます。
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 ;
}
Microsoftコンパイラの場合、インラインアセンブリはx86でのみサポートされます。他のターゲットの場合は、関数全体を別のアセンブリソースファイルで定義し、それをアセンブラに渡して、結果のオブジェクトモジュールをリンクする必要があります。
プロテクトモードのオペレーティングシステムでBIOSを呼び出すことができる可能性は非常に低いため、そのシステムで利用可能な機能を使用する必要があります。カーネルモードであっても、おそらく安全ではありません。そうすると、BIOSがOSの状態に関して正しく同期されない可能性があります。