4

いくつかのアセンブリコードを実行していますが、コード行が何をするのか理解できません。コードは次のとおりです。

 leaq   0(,%rax,4), %rdx

基本lea的には一種のmov命令ですが、アドレスを移動するだけです。したがって、何かのアドレスをに移動します%rdx%rdxスタック上の何かに「ポイント」を作成します)。スタック上で何%raxを指しているのかはわかっています-28(%rbp)が(たとえば)、答えを得るためにそれを4で乗算する方法に混乱しています。%rdx指しますか4*(-28) = -112(%rbp)

ありがとう!

編集:文脈上、次のコードがこの命令の前にあります:

pushq   %rbp 
movq    %rsp, %rbp 
movl    %esi, -28(%rbp)
movl    -28(%rbp), %eax 
cltq 
leaq    0(,%rax,4), %rdx
4

2 に答える 2

4

同等の C コードは次のようなものです。

extern int32 arr[];
int my_func(int32 n, ...) {
   int32 a=n;
   ...
   arr[a];
   ...
}

n は単一の 32 ビット レジスタ esi として渡され、ローカル スタック フレームに格納されます。パラメータは、64 ビット式 4*a の評価に使用されます。「0」は、リンカーによってアドレス「arr」に再配置されることになっている場合に説明できます。

それから私の推測では、アセンブリ コードは によって生成された gcc -S foo.cのではなく、gcc -c foo.c; objdump -d foo.o

   // Similar code from a 32-bit machine
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   8b 45 08                mov    0x8(%ebp),%eax
   6:   8b 04 85 00 00 00 00    mov    0x0(,%eax,4),%eax
   d:   5d                      pop    %ebp
   e:   c3                      ret
   f:   90                      nop
于 2012-11-13T05:24:45.917 に答える
1

コードはアドレスにあるものを に移動していると思い%rbp-28ます%eax。これはおそらく整数になります。次に、それを移動するだけですvalue*4(方法と同様%rdxの64ビットバージョンは、の上位バイトです)。この質問は、同様の問題について議論しているようです。%eax%ah%eax

于 2012-11-13T02:50:16.663 に答える