当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-06-10 20:36 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
tony@ubuntu:~/projects/tt$ vim tt.c
tony@ubuntu:~/projects/tt$ cat tt.c

代码:
一个异常简单的c程序:
#include <stdio.h>
int main()
{
   return 0;
}

tony@ubuntu:~/projects/tt$ gcc -S tt.c
tony@ubuntu:~/projects/tt$ cat tt.s

代码:
这是上面tt.c编译出来的汇编程序:
   .file   "tt.c"
   .text
.globl main
   .type   main, @function
main:
   leal   4(%esp), %ecx
   andl   $-16, %esp
   pushl   -4(%ecx)
   pushl   %ebp
   movl   %esp, %ebp
   pushl   %ecx
   movl   $0, %eax
   popl   %ecx
   popl   %ebp
   leal   -4(%ecx), %esp
   ret
   .size   main, .-main
   .ident   "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
   .section   .note.GNU-stack,"",@progbits


我的理解是,但搞不太懂
代码:
1.   leal   4(%esp), %ecx                      ;; ecx = esp+4 ,
2.   andl   $-16, %esp                     ;; esp = esp AND -16, 谁解释下作用?据说是使得十六位对齐, 为啥?
3.   pushl   -4(%ecx)                         ;; ecx 入栈 , 我不理解这里为什么入栈后又不要出栈?         搞不懂,加四减四什么技巧来的 ??¥¥@@??
4.   pushl   %ebp                               ;; ebp入栈
5.   movl   %esp, %ebp                   ;; ebp = esp, 转移ebp
6.   pushl   %ecx                                ;; ecx入栈
7.   movl   $0, %eax                         ;; eax = 0 , 即返回0
8.   popl   %ecx                                ;; ecx 出栈
9.   popl   %ebp                               ;; ebp出栈
10.   leal   -4(%ecx), %esp                     ;; 据说这里是和 前面(1,2,3)相补,刚好返回初始状态
11.   ret


_________________
There should be one-- and preferably only one --obvious way to do it.


最后由 tonychen123 编辑于 2009-06-10 21:02,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-06-10 20:43 
头像

注册: 2007-09-26 17:34
帖子: 618
送出感谢: 0 次
接收感谢: 2
汇编。。。。好神奇


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-06-10 21:00 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
代码:
0. 开始运行时堆栈情况:
内存xxx  O <- ebp          ;基址
..
内存001 O <- ebp+esp ;  初始时esp指针……
内存002 O <- esp+4      ; 3.   pushl   -4(%ecx)  执行后……  入栈内容是: [ecx-4],即执行1.代码前esp的值
内存003 O <- esp+8      ; 4.   pushl   %ebp 执行后……         入栈内容是:ebp

====================================================================================
5.   movl   %esp, %ebp 执行后:

内存001 O
内存002 O
内存003 O <- ebp / esp          ; 注意,基址移到这里来了!是这样吗?
内存004 O <- esp+4               ; 6.   pushl   %ecx 执行后                                     入栈内容是: ecx


====================================================================================
8.   popl   %ecx                                ;; ecx 出栈
9.   popl   %ebp                               ;; ebp出栈
运行后:

内存001 O <- ebp+esp ;  10.   leal   -4(%ecx), %esp执行后 ,esp重新指向了这里来……, 注:ecx = esp+4
内存002 O <- esp+4      ;


这样的理解有没有错阿?


_________________
There should be one-- and preferably only one --obvious way to do it.


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-08 1:54 
头像

注册: 2007-05-31 20:17
帖子: 207
地址: DUT
送出感谢: 0 次
接收感谢: 0 次
看汇编的书吧


_________________
I can do if I try!!!


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-08 1:58 

注册: 2006-09-07 22:51
帖子: 849
送出感谢: 0 次
接收感谢: 0 次
马克


_________________
blog:http://wkt55555.blog.163.com/


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-08 2:03 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
看看这个,中文版书店有


附件:
Professional.Assembly.Language.pdf.7z [1.73 MiB]
被下载 270 次


_________________
目前负债150多万
页首
 用户资料  
 
7 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-08 2:03 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
AT&T格式汇编


_________________
目前负债150多万


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-19 20:16 
头像

注册: 2007-11-23 12:31
帖子: 192
送出感谢: 0 次
接收感谢: 0 次
居然是AT&T的汇编!正好需要!哈哈


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-07-25 14:43 
头像

注册: 2005-04-15 5:59
帖子: 308
送出感谢: 0 次
接收感谢: 0 次
标记 切换linux下载~~ :em11


_________________
AMD Althon64X2 Dual Core Processor 5000+
Jetway Hammar A770
Segate SATA 160G + Segate ATA 80G
Geil DDR2-800 2048 MB
AOC2016SW 1650x1050 with Geforce 9600GT

Windows XP sp3 & ubuntu 10.10


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-10-28 20:50 
头像

注册: 2009-10-02 15:47
帖子: 257
送出感谢: 0 次
接收感谢: 0 次
全英的啊 真的要恶补英语了 :em06


_________________
爱Linux 也爱Ubuntu
简洁美观的桌面
更爱高效稳定的系统
不是不折腾难受夫斯基不想浪费时间
我和大多数人一样 我是菜菜
我要有菜菜的觉悟
我是Drdi


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-10-30 16:52 

注册: 2007-12-05 18:37
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
代码:
main:
   leal   4(%esp), %ecx            ;将调用main前的栈顶指针保存,用于main结束后恢复地址,+4是随机选取的,可
                                    ;以+2或者+6,只要恢复是-4就行
   andl   $-16, %esp                 ;栈顶指针向下移动了4n个字节,n个内存单元,用来进行32位系统的内存对齐
   pushl   -4(%ecx)                   ;%ecx-4所指向的内容,就是调用main前%esp中的内容,此时将其压入栈中,
                                     ;以便于恢复现场。压栈前,%esp自减4
   pushl   %ebp                        ;将调用main前的栈底指针压入栈中,保存现场
   movl   %esp, %ebp                    ;将此时%esp所在处作为栈底,为main函数的执行构建栈帧
   pushl   %ecx                         ;保存中%ecx中的值,即调用main前%esp-4地址所指向的值
   movl   $0, %eax                    ;将0放入%eax中,作为return的参数。
   popl   %ecx                           ;将栈中%esp-4地址所指向的值弹出送给%ecx
   popl   %ebp                           ;将掉用main前的栈底指针恢复给%ebp
   leal   -4(%ecx), %esp             ;将调用main前的栈顶指针恢复给%esp
   ret                                           ;返回


建议使用gdb,一边调试一边查看各寄存器值,这样对栈帧的变化会更加清晰~


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-10-30 18:51 

注册: 2009-04-05 21:48
帖子: 17
送出感谢: 0 次
接收感谢: 0 次
1 .file "main.c"
2 .text
3 .globl main
4 .type main, @function
5 main:
6 pushl %ebp
7 movl %esp, %ebp
8 movl $0, %eax
9 popl %ebp
10 ret
11 .size main, .-main
12 .ident "GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
13 .section .note.GNU-stack,"",@progbits
这是我的GCC编译出来的,GCC版本是4.4.1


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 学习gcc生成的汇编语言,会的教教... 十分之谢谢
帖子发表于 : 2009-10-30 20:03 

注册: 2009-04-05 21:48
帖子: 17
送出感谢: 0 次
接收感谢: 0 次
可能跟gcc -O 或者 -O2 有关,


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译