2017-06-21 57 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. 

一個人如何判斷值進行處理左到右,反之亦然?

+3

如果寄存器有'%'prefix => AT&T語法=>'src,dst'的順序。否則,unatned => Intel語法=>'dst,src'。 –

回答

6

通常,Gnu工具使用AT & T語法。您可以通過出現一些小符號來判斷它是否爲語法,如之前的文字爲$,以及之前的寄存器爲%。例如,此指令:

sub $16, %rax 

顯然是使用AT & T語法。它從rax寄存器中的值中減去16,並將結果存回rax

在AT & T語法,目標操作數是在

insn source, destination  # AT&T syntax 

還有英特爾的語法。這在Windows平臺上無處不在,並且通常也可用作Gnu/Linux工具的選項。英特爾的語法是未修理的 - 例如

sub rax, 16 

這是一樣的AT & T代碼上面它從rax寄存器中的值減去16,並且將結果存儲回在rax寄存器。

在Intel語法,目標操作數總是在

insn destination, source  ; Intel syntax 

以絕對的你有哪個版本,你需要檢查設置你的拆裝/調試器,並查看它配置使用的語法,但是通過查看符號裝飾是否在那裏(一個AT & T語法的一個無用的東西),一眼就能看出通常是非常簡單的。

摘要:

  • 如果寄存器有%前綴→ AT & T語法→ src, dst秩序。
  • 否則,未經處理的寄存器→英特爾語法→ dst, src命令。

如果你莫名其妙地結束在看代碼,不使用任何寄存器(???),另一個很好的啓發線索就是英特爾語法將預先考慮大小說明(如DWORDQWORD和​​)添加到關聯的操作數,而AT語法將在指令助記符本身附加後綴(l,q,b等)。

+0

對於具有兩個以上操作數的指令,AT&T語法顛倒了來自Intel的列表。例如'pshufd $ 0xE4,%src,%dst'。 –

+0

我用這個信息更新了[AT&T標籤wiki](https://stackoverflow.com/tags/att/info)(包括一些常見問題的重複目標的鏈接,使用這個作爲操作數順序的答案) –

相關問題