私は、3つの変数を乗算して加算して結果を返す単純なcプログラムを持っています。私はコードを32ビットマシンでアセンブリ言語(ATT形式)にコンパイルしました。私はアセンブリコードを習得しようとしていますが、私はいくつかの行を理解することができますが、結果がどうなるか、なぜ実現するのかなど、leal (%edx, %edx, 2), %edx
のような理由を理解する助けが必要です。Cアセンブリ言語ATTウォークスルー?
アセンブリコード
.file "calc.c"
.text
.globl calc
.type calc, @function
calc:
pushl %ebp #prolog
movl %esp, %ebp #prolog
movl 8(%ebp), %edx #move %ebp +8 into %edx
movl 16(%ebp), %ecx #move %ebp +16 into %ecx
leal (%edx,%edx,2), %edx
movl 12(%ebp), %eax
leal (%edx,%eax,2), %eax
movl %ecx, %edx
sall $4, %edx
subl %ecx, %edx
addl %edx, %eax
popl %ebp
ret
.size calc, .-calc
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
Cプログラム
#include <stdio.h>
int calc(int x, int y, int z){
return 3*x + 2*y + 15*z;
}
int main(void) {
int x = 2;
int y = 6;
int z = 11;
int result = calc(x,y,z);
printf("x=%d, y=%d, z=%d, result=%d\n", x,y,z,result);
return 0;
}
誰かが私はプロローグから始まる問題を追跡に役立つ可能性があります。
あなたはマニュアルを読んでみましたか?マニュアルが 'lea'命令について何を言っていますか? '(a、b、c)'オペランド表記については何と言いますか? – fuz
コンパイラに最適化を指示します。最適化されていないコンパイラで生成されたアセンブリを読み込むのは苦痛です。 – EOF
[LEA命令の目的は何?]も参照してください(https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction) – Jester