1
Dump of assembler code for function main:
0x0000000100000de6 <main+0>:    push   %rbp
0x0000000100000de7 <main+1>:    mov    %rsp,%rbp
0x0000000100000dea <main+4>:    sub    $0x30,%rsp
0x0000000100000dee <main+8>:    mov    %edi,-0x14(%rbp)
0x0000000100000df1 <main+11>:   mov    %rsi,-0x20(%rbp)
0x0000000100000df5 <main+15>:   movq   $0x0,-0x8(%rbp)
0x0000000100000dfd <main+23>:   cmpl   $0x2,-0x14(%rbp)

3行目を理解したい。

$0x30 ?(定数 0x30? またはアドレス 0x30 の値? の場合、その値にアクセスするにはどうすればよいですか? 'p *0x30' と入力すると、エラーが発生します (これにより、スタック ポインターの値を変更できますか?? <- - ターゲットは rsp ですか? '$0x30' ではありませんか?)

-0x14(%rbp) とは??

(私はOSXを使用しています)
よろしくお願いします。

4

2 に答える 2

3

最初の 2 つの命令は、スタック フレームのセットアップです。続いて登場順です。

<main+0>:    push   %rbp
<main+1>:    mov    %rsp,%rbp
<main+4>:    sub    $0x30,%rsp       ;reserves 48 bytes on the stack for local variables
<main+8>:    mov    %edi,-0x14(%rbp) ;stores %edi at the address that is less than %rbp by 20 bytes 
<main+11>:   mov    %rsi,-0x20(%rbp) ; stores %rdi at the address that is less than %rbp by 32 bytes
<main+15>:   movq   $0x0,-0x8(%rbp) ; clears the qword at -0x8(%rbp)
于 2012-09-22T14:33:27.797 に答える
0

$0x30は定数の16進値30(10進数で48)です。その行は、スタックポインタから48を減算し%esp、効果的に48バイトをスタックにプッシュします(スタックは下に向かって大きくなることを忘れないでください)。

-0x14(%rbp)はアドレスの値です%rbp - 0x14-Cの用語では、大まかに

unisigned char *rbp; // this is the rbp register
unsidned long edi;
edi = *(unsigned long *)(rbp - 0x14) // this is the actual value.

ワードサイズへのキャストに注意してください。CPUレジスタは通常、ワード相当のデータを保持します。

于 2012-09-22T14:27:07.797 に答える