不懂汇编,麻烦那位帮忙以下逐句解释一下

dfczj 2007-08-21 10:32:10
[root@xx btest]# cat test.c
#include <stdio.h>

int main(void){
char *a="test";
printf("%s\n",a);
return 0;
}
[root@xx btest]# gcc -S test.c
[root@xx btest]# cat test.s //不懂汇编,麻烦那位帮忙以下逐句解释一下.
.file "test.c"
.section .rodata //只读数据段
.LC0: //这种标号表示什么意思?
.string "test" //字符串常量
.LC1:
.string "%s\n" //常量
//下面是代码段的内容??
.text
.globl main
.type main,@function //下面的都不懂,解释一下
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movl $.LC0, -4(%ebp)
subl $8, %esp
pushl -4(%ebp)
pushl $.LC1
call printf
addl $16, %esp
movl $0, %eax
leave
ret
.Lfe1:
.size main,.Lfe1-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-34)"
[root@xx btest]#
...全文
179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vitin 2007-08-24
  • 打赏
  • 举报
回复
main:
pushl %ebp // 基址寄存器 %ebp 压栈
movl %esp, %ebp // %ebp = %esp,当前的基址为栈顶
subl $8, %esp // %esp -= 8,栈顶生长8字节(即2个字)
andl $-16, %esp // %esp &= -16,注意是负数是补码,
// 因此%esp后四位清零,即栈顶在16字节处对齐
movl $0, %eax // %eax = 0
subl %eax, %esp // %esp -= %eax,由于%eax=0,所以%esp实际没有变化
// 这个可能是占位符,以便需要时调整栈顶位置
movl $.LC0, -4(%ebp) // -4(%ebp) 是 a, 因此这句是 char* a="test";
subl $8, %esp // %esp -=8,函数调用前的准备,设此处为<语句一>
pushl -4(%ebp) // a 压栈
pushl $.LC1 // "%s\n" 压栈,注意函数的参数是逆向压栈的
call printf // 调用 printf
addl $16, %esp // %esp += 16,函数调用完成后栈顶到<语句一>之前的位置
movl $0, %eax // %eax = 0,这里是设置main函数的返回值
leave // 函数返回前的一系列环境设置工作
ret // 函数返回

.LXX 都是Label,在程序中可用来表示代码的地址,因此 $.LC0 就表示 "test"的首地址。
%ebp 是一个函数的基址,往往是函数调用前的栈顶位置,用-4(%ebp)之类的表示函数中的局部变量(它们都在栈中的固定位置,因此用%ebp和一个偏移量表示,注意栈是向下生长的)
%esp 永远是栈顶,将随着pushl 和 popl 自动改变
%eax 用于计算和存放函数的返回值。此外%ebx, %ecx, %edx 也可用于计算。
call 调用一个函数,调用前参数必须逆向压栈,调用后函数返回值在%eax中,并需要通过调整 %esp 退栈。
柳慧妍 2007-08-24
  • 打赏
  • 举报
回复
路过
会思考的草 2007-08-21
  • 打赏
  • 举报
回复
AT&T的格式,这个随便找个文档看看就行了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧