c语言到汇编的学习
[内存结构]
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语言到汇编的学习的更多相关文章
- arm:c语言和汇编混合编程
仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...
- 汇编入门学习笔记 (七)—— dp,div,dup
疯狂的暑假学习之 汇编入门学习笔记 (七)-- dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...
- 汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)-- call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...
- 汇编入门学习笔记 (十二)—— int指令、port
疯狂的暑假学习之 汇编入门学习笔记 (十二)-- int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...
- C语言结构体的学习,以及gdb的调式
#include <stdio.h> #include <string.h> #define format "%d\n%s\n%f\n%f\n%f\n" t ...
- C语言ASM汇编内嵌语法
转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...
- x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式
目录 x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式 一丶x86指令复习. 1.1什么是x86指令. 1.2 x86与x64下的通用寄存器 1.3 OpCode 1.4 7种寻址方式 二 ...
- C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...
- 【机器学习与R语言】5-规则学习算法
目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...
随机推荐
- xlrd读取多个excel电子表数据
import sys import xlrd import traceback def ReadData(FileName): try: workBook = xlrd.open_workbook(F ...
- oracle 第一章总结
sysdba: 即数据库管理员,权限包括:打开数据库服务器.关闭数据库服务器.备份数据库.恢复数据库.日志归档.会话限制.管理功能.创建数据库.sys用户必须用 sysdba身份才能登录,syste ...
- Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)
如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...
- 今天发现之前瑞乐做的登录和注册居然都是用的get请求,瞬间出了一身冷汗.
今天发现之前瑞乐做的登录和注册居然都是用的get请求,瞬间出了一身冷汗. 然后迅速的让晓勇改成post请求了. 不然我觉得凡是有点抓包能力的人抓到我们登录和注册这么涉及安全的东西居然用的是get请求, ...
- [NOIP2015]信息传递
[NOIP2015]信息传递[问题描述]有
- asp - Session
Session[]就是缓存,默认的类型是Object,就是说无论你把什么值赋给Session[],都是会变成Object类型的数据,空说没用,你也别看技术文献里面生涩的解释,我举个例子吧:比如说页面P ...
- cvInRangeS函数演示
camshift算法中,用到了cvInRangeS函数,作为初学者,对这个函数很不理解,所以就写了个程序演示效果,加强理解. 代码: #include "cv.h" #includ ...
- Oracle 表空间联机(online)与脱机(offline)
数据库管理员可以在数据库处于开启(open)状态时令除 SYSTEM 表空间(tablespace)之外的任何表空间联机(online)(可访问)或脱机(offline)(不可访问).SYSTEM 表 ...
- vs2015 command prompt here
网上搜的很多方法都不能用,比如:http://app.paraesthesia.com/CommandPromptHere/ 主要是都搞错了注册表路径,写成了: HKCR,Directory\Shel ...
- C++链接两个cpp 文件
我们在编程中,有没有想过,分别写代码,然后把两个cpp,文件合并,两个自身本不能运行的文件,在一起却可以运行(主要牵扯函数调用,一个有声明和调用,另一个定义).那么具体如何实现呢? 跟着我的步骤: 1 ...