このコードを考えると:
#include <stdio.h>
int main(int argc, char **argv)
{
int x = 1;
printf("Hello x = %d\n", x);
}
インライン アセンブリで変数 x にアクセスして操作したいと思います。理想的には、インライン アセンブリを使用してその値を変更したいと考えています。GNU アセンブラ、および AT&T 構文の使用。
このコードを考えると:
#include <stdio.h>
int main(int argc, char **argv)
{
int x = 1;
printf("Hello x = %d\n", x);
}
インライン アセンブリで変数 x にアクセスして操作したいと思います。理想的には、インライン アセンブリを使用してその値を変更したいと考えています。GNU アセンブラ、および AT&T 構文の使用。
x86 AT&T 構文を使用した GNU C インライン asm:
(ただし、回避できる場合はhttps://gcc.gnu.org/wiki/DontUseInlineAsm )。
// this example doesn't really need volatile: the result is the same every time
asm volatile("movl $0, %[some]"
: [some] "=r" (x)
);
この後、x には 0 が含まれます。
mov
通常、asm ステートメントの最初または最後の命令としては避ける必要があることに注意してください。%[some]
のようなハードコードされたレジスタにコピーしないでください%%eax
。単にレジスタとして使用%[some]
し、コンパイラにレジスタ割り当てを行わせます。
その他のドキュメントとガイドについては、 https ://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.htmlおよびhttps://stackoverflow.com/tags/inline-assembly/infoを参照してください。
すべてのコンパイラが GNU 構文をサポートしているわけではありません。たとえば、MSVC の場合は次のようにします。
__asm mov x, 0
となり、このステートメントx
の後に の値になります。0
使用するコンパイラを指定してください。
また、これを行うと、プログラムが特定のコンパイラとアセンブラの組み合わせのみでコンパイルされるように制限され、特定のアーキテクチャのみを対象とすることに注意してください。
ほとんどの場合、インライン asm ではなく、純粋な C と組み込み関数を使用しても、同等またはそれ以上の結果が得られます。
asm("mov $0, %1":"=r" (x):"r" (x):"cc");
-これはあなたを正しい軌道に乗せるかもしれません。パフォーマンスと効率のために、可能な限りレジスタの使用を指定してください。ただし、Aniketが指摘しているように、アーキテクチャに大きく依存し、gccが必要です。