2014-04-23 204 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这太可怕了:) –