次の組立ラインがあるとしましょう
movl $-1, %edi
movl $1, %edx
%edi/%edx レジスタに格納しているのは正確には何ですか。
基本的に、このコードを C プログラムに変換するとしたら、いくつかの変数を -1 と 1 に初期化することになります。
即時=「一定の定数」は理解していますが、それはどういう意味ですか?
次の組立ラインがあるとしましょう
movl $-1, %edi
movl $1, %edx
%edi/%edx レジスタに格納しているのは正確には何ですか。
基本的に、このコードを C プログラムに変換するとしたら、いくつかの変数を -1 と 1 に初期化することになります。
即時=「一定の定数」は理解していますが、それはどういう意味ですか?
レジスタに何かをロードするには、次の 4 つの方法があります。
即値 - AT&T アセンブラーでは、 を使用し$number
、その特定の値 (数値) をレジスターにロードします。number
数値である必要はありません。たとえば、次のようになる可能性があることに注意してください。これにより、関数のアドレスがregistermovl $printf, %eax
にロードされます。printf
eax
別のレジスタからmovl %eax, %edx
-eax
値が にコピーされましedx
た。
固定メモリ位置から movl myvar, %eax
- の内容myvar
はeax
.
別のレジスタのメモリ位置から、movl (%eax), %edx
-edx
は のアドレスにある 32 ビット値を持ちますeax
。もちろん、実際には「適切な」メモリ ロケーションであると仮定します。そうでない場合は、segfault が発生します。
これが C コードの場合、コードは次のようになります。
1)
int x = 42;
int (*printfunc)(const char *fmt, ...) = printf;
2)
int x = 1;
int y = 2;
...,
x = y; // movl %eax, %edx
3)
int x = myvar;
4)
int x = *myptr;
編集: move 命令の「ソース」であるほとんどすべてのものは、算術演算のソースにもなる可能性がありadd $3, %eax
ますx += 3;
。