1

次の組立ラインがあるとしましょう

movl   $-1, %edi
movl   $1, %edx

%edi/%edx レジスタに格納しているのは正確には何ですか。

基本的に、このコードを C プログラムに変換するとしたら、いくつかの変数を -1 と 1 に初期化することになります。

即時=「一定の定数」は理解していますが、それはどういう意味ですか?

4

1 に答える 1

3

レジスタに何かをロードするには、次の 4 つの方法があります。

  1. 即値 - AT&T アセンブラーでは、 を使用し$number、その特定の値 (数値) をレジスターにロードします。number数値である必要はありません。たとえば、次のようになる可能性があることに注意してください。これにより、関数のアドレスがregistermovl $printf, %eaxにロードされます。printfeax

  2. 別のレジスタからmovl %eax, %edx-eax値が にコピーされましedxた。

  3. 固定メモリ位置から movl myvar, %eax- の内容myvareax.

  4. 別のレジスタのメモリ位置から、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;

于 2013-02-15T18:21:32.130 に答える