2

逆アセンブル コードを読んだとき、AT&T の構文に慣れていないため、(%esp,1) のようなコードが何を意味するのかわかりません。

11      printf("%x", a);
0x401386        <main+182>:    movl  $0x1,0x4(%esp,1)
0x40138e        <main+190>:    movl  $0x40300d,(%esp,1)
0x401395        <main+197>:    call  0x401810 <printf>

誰かがそれが何を意味するのか教えてもらえますか? ありがとうございました!

4

2 に答える 2

2

このウィキブックスには、GNUアセンブラとそのAT&T構文に関する情報が含まれているようです。

http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

また、Gasに関するこれらの2つのドキュメントのソースを見つけましたが、それらはあまり明確でも有用でもないようです。

  1. http://webster.cs.ucr.edu/AsmTools/Gas/GasDoc/as_toc.html
  2. http://sourceware.org/binutils/docs-2.17/as/index.html
于 2012-05-16T03:13:18.280 に答える
2
                              ; Decompiled, sort of, back to C
                              ; ==============================
    movl  $0x1,0x4(%esp,1)    ; %esp[1] = 1 (the "1" really means, "add 4")
    movl  $0x40300d,(%esp,1)  ; %esp[0] = "%x"
    call  0x401810 <printf>   ; push return address and branch to printf

コンパイラは、aが1に等しいことを認識しているようで、引数用のスペースを確保するために、スタック ポインターを既に下方に調整しているようです。おそらく、スペースをスタックにプッシュすることと、関数のプロローグを組み合わせたのでしょう。

一般に、アドレス指定モードは次のようになります...

r    ; register
(r)  ; memory, register contains the address
8(r) ; memory, displacement of 8 off the register
于 2012-05-16T03:07:04.290 に答える