私はgdbを実行し、メインとget_inputで逆アセンブルを使用するように、Cプログラムがアセンブリレベルでどのように見えるかを理解しようとしています。プログラムは短く、私はそれに追随することができます。 私は理解していない2行があります。まず、上のメインでは()である:アセンブリ内のトレースプログラム。
0x00000000004005a3 <+4>: mov $0x0,%eax
私たちは、RBPの古い値を保存し、RBPへのRSPの現在の値を保存します。その指示の目的は何ですか?ここで
000000000400581 <+4>: sub $0x10,%rsp
をあまりにも我々は、スタックにそれを押して、RBPの古い値を保存することで起動します。
(get_inputの他)があります。次に、rspに現在のrspの値を与えます。次に、rspから16バイトが減算されます。私はスペースが割り当てられていることを理解していますが、なぜそれは16バイトで8バイトではないのですか?私はバッファを8バイトだけ作成しました、他の8バイトの目的は何ですか?
#include <stdio.h>
void get_input()
{
char buffer[8];
gets(buffer);
puts(buffer);
}
int main()
{
get_input();
return 0;
}
主な機能のためのアセンブラコードのダンプ:
0x000000000040059f <+0>: push %rbp
0x00000000004005a0 <+1>: mov %rsp,%rbp
0x00000000004005a3 <+4>: mov $0x0,%eax
0x00000000004005a8 <+9>: callq 0x40057d <get_input>
0x00000000004005ad <+14>: mov $0x0,%eax
0x00000000004005b2 <+19>: pop %rbp
0x00000000004005b3 <+20>: retq
End of assembler dump.
機能get_inputのためのアセンブラコードのダンプ:main()
については
0x000000000040057d <+0>: push %rbp
0x000000000040057e <+1>: mov %rsp,%rbp
0x0000000000400581 <+4>: sub $0x10,%rsp
0x0000000000400585 <+8>: lea -0x10(%rbp),%rax
0x0000000000400589 <+12>: mov %rax,%rdi
0x000000000040058c <+15>: callq 0x400480 <[email protected]>
0x0000000000400591 <+20>: lea -0x10(%rbp),%rax
0x0000000000400595 <+24>: mov %rax,%rdi
0x0000000000400598 <+27>: callq 0x400450 <[email protected]>
0x000000000040059d <+32>: leaveq
0x000000000040059e <+33>: retq
'mov $ 0x0、%eax'は呼び出し規約に従って' eax'に返される戻り値0です。 16バイトについてはスタックアライメントであり、呼び出し規約によっても規定されています。 – Jester
@Jester、あなたはあまりにも速く私のために急いでいる。私が何かを投稿しようとするたびに、私はそれを書き終えるまでに何かをここに持ってきました! –