Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370491
  • 博文数量: 94
  • 博客积分: 3421
  • 博客等级: 中校
  • 技术积分: 919
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-18 16:27
文章分类

全部博文(94)

文章存档

2015年(8)

2013年(6)

2012年(26)

2011年(8)

2010年(26)

2009年(20)

我的朋友

分类: LINUX

2011-08-02 15:32:44

一直以来对汇编是现用现查,浪费了好多时间,今天根据一个小程序,把自己的一些记录写下来,方便以后reference.(AT&T格式)

-1) 调用一个function时,在主函数这段的模式是.
0x08048563 :   sub    $0xc,%esp
0x08048566 :   pushl  0x8049924
0x0804856c :   call   0x8048622 <_ZN5CTest4fun1Ev>  (对栈有push)
0x08048571 :   add    $0x10,%esp

子函数:
0x08048622 <_ZN5CTest4fun1Ev+0>:        push   %ebp
0x08048623 <_ZN5CTest4fun1Ev+1>:        mov    %esp,%ebp
 .....
0x0804862e <_ZN5CTest4fun1Ev+12>:       leave
0x0804862f <_ZN5CTest4fun1Ev+13>:       ret   (对栈有pop)

-2) 汇编语句理解

%esp (%寄存器名) 都是在指寄存器的的值是多少,这个值是一个地址值.
一般都是读出寄存器对应地址的内容. gdb x/16w 0xxxxx

pushl 0x8049924
把0x8049924地址对应的内容入栈.

push %ebp
把寄存器本身的地址入栈.

movl $0xa, (%eax)
把0xa付给%eax对应地址所指向的内容.

movl 0x8(%ebp) %eax
把%ebp的地址值加上8,在把此地址对应的内容覆给%eax做为地址.

movl   $0x0,0xfffffffc(%ebp)
把0 赋值给%ebp对应的地址减去4后所对应的地址.



Note: GCC编译的c++ code.
阅读(1110) | 评论(0) | 转发(0) |
0

上一篇:浅析C++中的this指针

下一篇:数据类型范围

给主人留下些什么吧!~~