[内存结构]

C程序通过编译-汇编-连接,最后到可执行文件。载入内存有这几个部分:

text:正文段,存放的是可执行的机器码段

data:存放初始化之后的全局变量和静态变量

bbs:存放未初始化的静态变量和全局变量

heap:堆,由程序员自己分配和释放,程序结束时,操作系统也会释放。

stack: 栈,编译器自动分配,存放函数的参数,局部变量

下图是典型的内存布局图

#include <stdio.h>
#include <stdlib.h>
void foo(int x){printf("hello");}
typedef void(*FunCall)(int);
typedef struct{
FunCall b;
char c;
int a;
}AA; int main(){
AA aa;
aa.c = 's';
aa.a = ;
aa.b = foo;
(*(aa.b))(aa.a);
return ;
}

这是一个很简单的程序, 使用GCC编译选项编译成AT&T语法的汇编语言

  gcc -S test1.c

下面来分析汇编代码

     .file    "test1.c"
.section .rodata
.LC0:
.string "hello"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
movq %rsp, %rbp
.cfi_offset , -
.cfi_def_cfa_register
subq $, %rsp
movl %edi, -(%rbp)
movl $.LC0, %eax
movq %rax, %rdi
movl $, %eax
call printf
leave
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
movq %rsp, %rbp
.cfi_offset , -
.cfi_def_cfa_register
subq $, %rsp
movb $, -(%rbp)
movl $, -(%rbp)
movq $foo, -(%rbp)
movq -(%rbp), %rdx
movl -(%rbp), %eax
movl %eax, %edi
call *%rdx
movl $, %eax
leave
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
.section .note.GNU-stack,"",@progbits

以点开头的是汇编指示。

指令介绍

寄存器介绍

函数调用

汇编生成

gcc -g -c test.c
objdump -d -M intel -S test.o

c语言到汇编的学习的更多相关文章

  1. arm:c语言和汇编混合编程

    仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...

  2. 汇编入门学习笔记 (七)—— dp,div,dup

    疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...

  3. 汇编入门学习笔记 (九)—— call和ret

    疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...

  4. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  5. C语言结构体的学习,以及gdb的调式

    #include <stdio.h> #include <string.h> #define format "%d\n%s\n%f\n%f\n%f\n" t ...

  6. C语言ASM汇编内嵌语法

    转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...

  7. x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

    目录 x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式 一丶x86指令复习. 1.1什么是x86指令. 1.2 x86与x64下的通用寄存器 1.3 OpCode 1.4 7种寻址方式 二 ...

  8. C语言与汇编的嵌入式编程:求100以内素数

    写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...

  9. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

随机推荐

  1. JS编写全选,复选按钮

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. 判断当前VC是不是正在展示的活跃页面

    viewController.isViewLoaded && viewController.view.window

  3. Java动手动脑(二)

    1>类的对象实例化 由于main为静态类型,所以在调用函数时也必须调用静态方法,如上代码中的求平方数的静态方法,如何在静态main中调用非静态类的方法呢? 静态方法只能直接访问静态成员,无法访问 ...

  4. Handler使用总结(转)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  5. WCF权限控制

       前面写了 WCF账户密码认证, 实现了帐号密码认证, 接下来看看如何对方法的细粒度控制, 本文很大程度参考了 WCF安全之基于自定义声明授权策略, 这篇文章对原理讲得比较清楚, 而我这篇文章呢, ...

  6. PHP获取具有相同name的多个input表单信息

    首先是表单应该这样写,注意每个 name="name[]"后面是有一个方括号的.这是PHP特有的获取具有相同name的多个input元素value的方法.(复选框也是采用这种方法) ...

  7. GIL与线程互斥锁

    GIL 是解释器级别的锁,是限制只有一个原生线程运行,防止多个原生线程之间修改底层的共享数据.而线程互斥锁是防止多个线程同时修改python内存空间的共享数据.

  8. IOS 支付、性能调试、IPv6兼容支持等

    微信支付 支付宝支付 性能调试 IPv6兼容支持 APP引导页框架

  9. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  10. [转]阿里云CentOS配置全过程