@[TOC]从汇编的角度看C语言(一)
从汇编的角度看C语言
gcc -S 参数可以把C语言代码转换成汇编代码。对照汇编代码看C别有一番风味,很多编译器行为都有了本质的解释。
本人对汇编也是一知半解,工作中没有用到过,上学时候学的还是16位的汇编,基本上也忘光了。一边学习一边记录吧。
复习汇编,一个简单的例子
如下是一段非常简单的c程序,文件名为:aa.cpp
int main(int argc, char* argv[])
{
int abc = 5;
return abc;
}
把它编译成汇编
gcc -S aa.cpp
生成汇编结果aa.s, 我在文件中增加了一些注释。
本程序只有一个代码段,没有数据段。参数和临时变量存储在栈中,栈属于代码段。本程序栈空间的组织如下:
函数调用
再分析以下带简单函数调用的例子
int myfunc(int a)
{
int b = 99;
long l = 2;
long t = 3;
a++;
return a;
}
int main(int argc, char* argv[])
{
int a = 1;
long e = 5;
a = myfunc(a);
return a;
}
对照的汇编代码如下:
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 15, 4 sdk_version 10, 15, 4
.globl __Z6myfunci ## -- Begin function _Z6myfunci
.p2align 4, 0x90
__Z6myfunci: ## @_Z6myfunci
.cfi_startproc
## %bb.0:
pushq %rbp ; 保存栈基址,
.cfi_def_cfa_offset 16 ; 把栈指针赋值给栈基址,
.cfi_offset %rbp, -16 ; 每个函数开头五行都是如此
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
movl %edi, -4(%rbp) ; 把参数a存储在-4的位置
movl $99,