0
gcc(Linuxの場合)でインラインアセンブラを使用しています。私はRCXレジスタ内の文字列のアドレスを書き込むために、この奇妙な構文を使用していますインラインgccアセンブラ(linux)で可変アドレスを渡す方法
char *str="hello world";
int main(int argc, char *argv[]
{
...
asm("mov %0, %%rcx"
:
: "g" (str));
...
}
: 私はこの簡単なプログラムを書いてきました。 しかし、バイナリを逆アセンブルすると、データが最初にraxで転送され、次にrcxで転送されることがわかります。 ...なぜ
asm("mov _str, rcx")
が、それは、Linuxのgccの上では動作しません:あなたが想像できるように、これは私のプログラムでは、いくつかのBORD効果を導入することができます...私は若い頃 は、私はそのような何かを書くために使用しました?
GCCのインラインアセンブラを使用すると、新しいもので経験豊富なユーザーに問題が発生する可能性があります。まずMSVCのインラインアセンブラとは違って - GCCのインラインでは、実際にはテンプレート内の命令については何も知らないが、テキストの置換を行うことを除いては、入力が何であるか、出力は何か、リストにない他のレジスタ出力オペランドではclobberリスト内にある必要があります。これを行うには、_RCX_の値を出力制約のある変数に代入する必要があります。 –
なぜあなたはstringのアドレスをRCXに入れようとしているのでしょうか?これはXYの問題かもしれません。インラインアセンブラで実際に何を達成しようとしていますか?もしそれが_C_で行えるのであれば、それはそこで行われるべきです。 –
GCCの出力を '-O0'のような最適化なしで見ると、不必要なオーバーヘッド(余計な負荷とデータを不必要に前後に移動させる)が多く発生します。 –