2017-06-21 6 views
1

gdbの出力を確認してアセンブリ呼び出しを調べるときは、通常、ハードコードされた値を使用してレジスタを右から左またはその逆。通常レジスタが右から左にロードされているかどうかを判断する方法

次のようなもの:

sub  rsp, 16 

または

sub  16, rsp 

しかし、他の回、上記のような何の値が表示されません。 私が見るすべては、次のように呼び出します:

(gdb) disassemble 
Dump of assembler code for function main: 
0x0000000100000f54 <main+4>: mov $rdi,%r15 
0x0000000100000f59 <main+9>: mov $rsi,%r14 
0x0000000100000f60 <main+16>: mov $rdx,%r13 
0x0000000100000f67 <main+23>: mov $ecx,$r12d 
End of assembler dump. 

値は右、またはその逆に左に処理される場合は、1つは決定しない方法は?

+3

レジスタに '%'接頭辞=> AT&T構文=> 'src、dst'の順序がある場合。さもなければ、未塗装=>インテル構文=> 'dst、src'。 –

答えて

6

通常、GnuツールはAT & T構文を使用します。 $リテラルのような小さな記号の存在と、先行するレジスタ%のように、それがAT & T構文であることがわかります。たとえば、この命令:

sub $16, %rax 

は明らかに& T構文AT使用しています。 raxレジスタの値から16を減算し、その結果をraxに戻します。 AT & T構文で

、デスティネーション・オペランドはである:

insn source, destination  # AT&T syntax 

インテルの構文もあります。これはWindowsプラットフォーム上で普及しており、通常はGnu/Linuxツールのオプションとしても利用できます。インテルの構文は、は未装飾 - です。

それは上記 raxレジスタの値から16を減算し、バック raxレジスタに結果を格納AT & T命令と同じである
sub rax, 16 

。インテルの構文で

、デスティネーション・オペランドはに常にを左:

insn destination, source  ; Intel syntax 

あなたが持っているどのバージョンの絶対確実にするために、あなたは/あなたの逆アセンブラの設定を確認する必要があると思いますデバッガを起動し、使用するように設定されている構文を確認してください。ただし、シンボリックな装飾があるかどうかを一目で確認するのは簡単ではありません(AT & Tシンタックスのための死んでいます)。

概要:

  • レジスタは、& T構文→ src, dstためAT %接頭→を持っている場合。
  • それ以外の場合は、不変のレジスタ→インテル構文→ dst, srcの順番です。

あなたが何らかの形で任意のレジスタ(???)を使用しないコードを見終わった場合、別の良いヒューリスティック手がかりは、インテルの構文はDWORDQWORDのような(サイズ指定子を付加し、ということです​​)を関連オペランドに割り当てますが、AT & T構文では、命令ニーモニック自体に接尾辞(lqbなど)が追加されます。

+0

3つ以上のオペランドの命令については、AT&Tの構文がインテルのリストを逆にしました。例えば'pshufd $ 0xE4、%src、%dst'です。 –

+0

私は、この情報(よくある質問のためのいくつかの良いdupターゲットへのリンクを含む、この1つをオペランドオーダーの答えとして使用することを含む)で[AT&T tag wiki](https://stackoverflow.com/tags/att/info) –

関連する問題