2016-11-30 9 views
1

アセンブリコードを理解しようとしています。私は、これは私のCコードですx86-64でのポインタ割り当ての理解アセンブリコード

leaqコマンドの後にポインタが割り当てられている部分と、コード内で立ち往生しています:

#include <stdio.h> 
#include<stdlib.h> 

int main(){ 
    int x=50; 
    int *y=&x; 
    return 0; 
} 

これが私の、対応するアセンブリコードです:

.file "AssemlyCode.c" 
    .def __main; .scl 2; .type 32; .endef 
    .text 
    .globl main 
    .def main; .scl 2; .type 32; .endef 
    .seh_proc main 
main: 
    pushq %rbp 
    .seh_pushreg %rbp 
    movq %rsp, %rbp 
    .seh_setframe %rbp, 0 
    subq $48, %rsp 
    .seh_stackalloc 48 
    .seh_endprologue 
    call __main 
    movl $50, -12(%rbp) 
    leaq -12(%rbp), %rax 
    movq %rax, -8(%rbp) 
    movl $0, %eax 
    addq $48, %rsp 
    popq %rbp 
    ret 
    .seh_endproc 
    .ident "GCC: (GNU) 5.4.0" 
+0

'int y =&x;'は無効です。 'y'はポインタではありません –

+0

コードを書いている間にルーキーミスをしてしまいました。私は今すぐ修正しました – BrainsOfSteel

+0

簡単に読める例:ローカル関数へのポインタを渡してください。その後、すべてを最適化することなく最適化を有効にすることができます。 [Godboltコンパイラエクスプローラのsource + asmを参照](https://godbolt.org/g/N6ESby)。オブジェクトファイルのメタデータを設定するすべての '.seh_'とその他のディレクティブを取り除きます。 –

答えて

6
leaq -8(%rbp), %rax 
    movl %eax, -4(%rbp) 
    movl $0, %eax 
    addq $48, %rsp 
    popq %rbp 
    ret 
  1. leaq変数xのアドレスをスタックに保存します。登録するにはraxです。変数xはスタック上の自動変数であるため、アドレスはスタックフレームポインタ(rbp)を保持するレジスタからのオフセットとして計算されます。

  2. movl eaxスタックにargc引数をスタックに保存します。あなたが使用するスタックをクリーンアップしていると、前のフレームポインタレジスタを復元 -

  3. 次のステップは、main機能(リターン0)

  4. 2次のオペコードは関数エピローグですからeaxレジスタに戻り値を置くことです。

  5. 最後の命令はシンプルリターンです。

+0

rbp-8が '&x'である理由を指摘してもいいでしょう。スタック上にあるからです。私は[LEAは](http://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction)のものであるかどうか、OPが理解していない部分がわからない、またはなぜそれが*そのように使われているのか。 –

+0

@PeterCordes、ありがとうございます。 – user1641854

関連する問題