2014-04-23 266 views
0

根據網上的教程,當我拆開一個計劃,我應該看到這樣的代碼:(C的hello world)%,這意味着

0x8048384  push ebp      
0x8048385  mov ebp,esp    
0x8048387  sub esp,0x8     
0x804838a  and esp,0xfffffff0   
0x804838d  mov eax,0x0     
0x8048392  sub esp,eax     
0x8048394  mov DWORD PTR [esp],0x80484c4  
0x804839b  call 0x80482b0 <_init+56>      
0x80483a0  mov eax,0x0     
0x80483a5  leave        
0x80483a6  ret  

但是,我看到的是:

0x0804860c <+0>: push %ebp 
    0x0804860d <+1>: mov %esp,%ebp 
    0x0804860f <+3>: and $0xfffffff0,%esp 
    0x08048612 <+6>: sub $0x10,%esp 
    0x08048615 <+9>: movl $0x8048720,0x4(%esp) 
    0x0804861d <+17>: movl $0x804a040,(%esp) 
    0x08048624 <+24>: call 0x8048500 <[email protected]> 
    0x08048629 <+29>: mov $0x0,%eax 
    0x0804862e <+34>: leave 
    0x0804862f <+35>: ret 

其中參數(?不知道它是如何調用的,我的意思是%esp,%ebp thingies)與第一個代碼中的內容完全相反。是否由於'%'標記?他們甚至是什麼意思? (以及'$'是什麼意思?)

回答

2

這些是針對x86彙編的2種不同的語法。第一個稱爲「intel語法」,第二個稱爲「在& t語法」。有關此問題的更多信息wikipedia

您的反彙編程序應該有一個選項來改變它生成的程序集的風格。例如objdump支持-M intel交換機。

+2

第一個被稱爲「intel語法」,第二個被稱爲「WTF就是所有這些廢話」:) –

+0

@MartinJames AT&T語法是Unix的傳統,源於PDP和VAX彙編程序。由於奇怪的英特爾禮儀,Unix系統沒有理由放棄所有便利的東西。 – Netch

+0

@Netch這太可怕了:) –