私は現在、アセンブリコードがある内部のCコードをリファクタリングしています:アセンブリコードはCコードで何を参照していますか?
asm("movl $8, %esi\n\t"
movl $.LC0, %edi\n\t"
"movl $0, %eax");
レジスタのそれぞれが何を意味するのDOE? Cコードでは、$ 8または$ .LC0を代入する他のasmコードはありません。$ 0はちょうどゼロ値であると仮定しています
私は現在、アセンブリコードがある内部のCコードをリファクタリングしています:アセンブリコードはCコードで何を参照していますか?
asm("movl $8, %esi\n\t"
movl $.LC0, %edi\n\t"
"movl $0, %eax");
レジスタのそれぞれが何を意味するのDOE? Cコードでは、$ 8または$ .LC0を代入する他のasmコードはありません。$ 0はちょうどゼロ値であると仮定しています
アセンブリレベルでは、.LC0
はラベルであり、手書きのアセンブリではなく、コンパイラの出力で見つけることができます。
.LC
で始まるラベルはgccによって生成され、文字列リテラルの場所をマークします。 movl $.LC0, %edi
のもっともらしい意味は、%edi
は、ソースファイルでコンパイラが遭遇した最初の文字列リテラルを指すことです。しかし、それは明らかにクリーンなことではありません。
悪意のあるコードをリバースエンジニアリングしようとしている場合、おそらくそれを意味するためにすべてを表示する必要があります。 Cとアセンブリの間のグローバルな相互作用は、難読化を試みることを指し示しています。
悪意のあるコードをリバースエンジニアリングしようとしていない場合は、このコードを悪意のあるものとして検討してください。
これは何も意味しません。このインラインasmフラグメントはガベージであり、まさに正しい周辺のコードが適切な最適化オプションを備えた適切なコンパイラのコンパイルと正確にコンパイルされていれば便利です。コンパイラによって生成されたコードが、期待しています。
inline-assemblyタグwikiを参照すると、吸い込まないGNU Cインラインasmコードを書く方法を説明するチュートリアルやドキュメントへのリンクがあります。
このコードは技術的に「安全でない」だけではなく、周囲のコードや最適化オプションを少し変更しても実際には変更されません。コードフラグメントの任意の既知の意味を持つ
唯一のものは、AT & T構文では即値定数0および8であり、即値は$
が付いています。 (mov .LC0, %edi
($なし)はアドレスをレジスタに入れるのではなく、そのアドレスからのロードとなりますが、コンパイラが.LC0
でラベル付けすることを決めた定数や、コンパイラが何をするかはわかりません%edi
これは役に立ちません)。x86ドキュメントへのリンクやアセンブラマニュアルについては、x86タグwikiを参照してください。
コンパイラ生成コードの例については、the Godbolt compiler explorerのCでのHello Worldのasmを参照してください。
これは、このCコードが特定のCPUをターゲットにしていることを意味し、これらのレジスタのそれぞれは、その特定のCPUレジスタを意味します。 –
@SamVarshavchikは、レジスタ値が正確に何であるかを知るために存在します。コードがこれらの値を移動しているかどうかわからない – user3543440
レジスタに特定の値をロードします。また、彼らが何をしているのか分からない人が書いたひどく壊れたコードです。 –