は、C言語で簡単なプログラムです:
int main() {
int a = 5;
int b = 7;
int c = a + b;
return 0;
}
あなたがLinuxでgcc -m32 -S -O0 -o main.s main.c
でコンパイルした場合は、この場合には、見ることができるように、あなたはこの
.file "main.c"
.text
.globl main
.type main, @function
main:
.LFB0:
/* %ebp is a Base Pointer Register */
pushl %ebp
movl %esp, %ebp
/* Here we reserve space for our variables */
subl $16, %esp
/* a's address is %ebp - 4 */
movl $5, -4(%ebp)
/* b's address is %ebp - 8 */
movl $7, -8(%ebp)
/* a + b */
movl -8(%ebp), %eax
movl -4(%ebp), %edx
addl %edx, %eax
/* c's address is %ebp - 12 */
movl %eax, -12(%ebp)
/* return 0 */
movl $0, %eax
leave
ret
ような何かを得るでしょう変数のアドレスは、関数の基本ポインタのオフセットとして計算されます。最適化を有効にすると、変数の値がレジスタに格納されます。
ありがとうございます。あなたは私の内部asmコードを説明する手間を経た。あなたは私の質問に答えるだけでなく、私の好奇心を満たし、私が組立を学びたいと思った。あなたに誇りを持ってください。 –
あまりにも多くのことを求めていないのであれば、ちょっとだけ。これらのオフセットは、例えば以下のような意味を持っています:%ebp -12 =基本アドレスから数えて12アドレス少なくなりますか? –
@JoãoSilva%ebpが0xffffcfe8の場合、cのアドレスは0xffffcfe8-4 = 0xffffcfdcとなります。 – kharvd