c语言与汇编语言混合编程
如何从汇编语言过渡到c语言?
从编译过程谈起
编译小知识
源代码编译后得到目标文件 (二进制文件)
不同语言可编译得到相同格式的目标文件
链接器负责将目标文件组装得到可执行文件
老生常谈的问题。。。
c语言中的函数调用是如何进行的?
栈上的秘密
cdecl 调用约定 (C语言默认调用约定)
参数从右向左入栈
函数调用者负责参数的入栈出栈
函数本身根据约定使用栈中参数
gcc编译器使用的栈帧布局
ebp是函数调用以及函数返回的核心寄存器
ebp为当前栈帧的基准 (存储上一个栈帧的ebp值)
通过ebp能够获取返回值地址,参数,局部变量,等
目标文件分析
void g()
{
}int func(int a, int b)
{g();a = a + b;return a;
}int main()
{func(1, 2);return 0;
}
leave 指令将 ebp 寄存器的值赋给 esp 寄存器中,以释放分配给该过程的所有堆栈空间。然后,它从堆栈中恢复 ebp 寄存器的旧值。
通过反汇编我们观察到,c语言进行函数调用必须经历的4个步骤,将当前的ebp入栈;让ebp指向esp,也就是上一个栈帧的ebp值;函数执行完后,让esp指向ebp,将old ebp 出栈,ebp恢复为上一个栈帧的ebp值;最后返回到函数调用完后的下一条指令执行。
使用汇编语言编写Linux可执行程序
定义 _start 标签作为程序执行的起点
通过 int 0x80 使用内核服务 (执行系统调用)
交互关键字
global
- 从汇编语言中导出符号 (变量或函数)
extern
- 使用外部文件中定义的符号 (变量或函数)
示例分析
混合编程注意事项
相同的目标文件格式 (如:elf 格式)
相同的函数调用约定 (如:cdecl 调用约定)
相同的活动记录 (栈帧) 结构 (如:ebp 基准)
混合编程实战
entry.asm
global _start
global vstr
global vlen
global printextern c_func[section .data]vstr db "D.T.Software", 0x0Avlen dd $ - vstr[section .text]
_start:mov ebp, 0call c_funccall exitprint:push ebpmov ebp, espmov edx, [ebp + 12]mov ecx, [ebp + 8]mov ebx, 1mov eax, 4int 0x80pop ebpretexit:mov ebx, 0mov eax, 1int 0x80
main.c
extern void print(char*, int len);
extern char vstr[];
extern int vlen;int c_func()
{char* delphi = "Delphi\n";print(vstr, vlen);return 0;
}
成功打印了输出结果。
nasm -f elf entry.asm -o entry.o
gcc -c mian.c -o main.o
ld -s entry.o main.o -o app.out
通过上述方式生成可执行文件。
global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用。
global _start 让_start符号成为可见的标示符,这样链接器就知道跳转到程序中的什么地方并开始执行。linux寻找这个 _start标签作为程序的默认进入点。
c程序在调用print函数时,调用者c_func会将参数依次从右往左入栈,然后将返回地址入栈;在print函数里,要遵守函数的调用约定,字符串的起始地址存放在[ebp + 8]处,字符串的长度存放在[ebp + 12] 处。
c语言与汇编语言在满足以下条件时可混合编程
遵循相同的函数调用约定
遵循相同的目标文件格式
c语言与汇编语言混合编程相关推荐
- C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt
补充:单片机c语言与汇编语言混合编程 reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0 ...
- keil4c语言和汇编混合,keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...
- 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf
维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...
- c语言混合编程 pdf,C语言与汇编语言混合编程的方法.pdf
C语言与汇编语言混合编程的方法 维普资讯 讫 梅 龄 施 扰 绝 埔 综 勿 穗 直 触 搔 拌 橱 悬 邱 舟 絮 颈 茬 辞 乏 味 绞 涡 菊 黄 宜 悄 条 搬 悄 俱 泼 洋 醚 檀 测 易 ...
- c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验
混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...
- c语言汇编混合编程方法,C语言和汇编语言混合编程方法
摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言.两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用.本文通过具体的实例,说明了混合编程的基本方法, ...
- ARM下C语言和汇编语言混合编程
文章目录 一. 在C语言中调用汇编语言 1. 编写代码 2. 调试验证 二. 在汇编语言中调用C语言 1. 编写代码 2. 调试验证 关于函数的传递参数以及接受返回值的原理,在另一篇博客:X86与AR ...
- keil下C与汇编语言混合编程
文章目录 前言 一.在c函数中调用汇编函数 1.调用不带参数的汇编函数 2.调用带形参的汇编函数 二.在汇编函数中调用c函数 三.汇编函数与c函数混合调用 总结 前言 如今C语言很强大,在嵌入式编程当 ...
- STM32的C与汇编语言混合编程
本次我们要运用到汇编语言,并且将其与c混合编程.内容较多. 一.在c语言中调用汇编语言 新建一个工程 new project 芯片型号,STM32F103VE 配置如下 创建c文件 代码部分几乎相同, ...
最新文章
- 运行程序报“应用程序配置不正确”或者缺少运行库造成程序不可移植的问题...
- 【Spring框架家族】SpringBoot自动配置原理源码跟进
- Matlab实用程序--图形应用-填充图
- 动态代理:JDK动态代理和CGLIB代理的区别
- python中sorted()函数的用法
- window mysql proxy_window下mysql-proxy简单使用
- 矩阵A对任意的可逆矩阵p都有Ap=pA,证明A为数量矩阵
- leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
- 用Create Fishnet来生成格网
- 定义空列表元素类型_【Python+Excel】做数据分析5--列表和元组读取和常用查询
- 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】
- Ardence BXP 3.5 - 4.1 PNP 方法
- 设置后台事务的执行人
- 操作系统课后答案第五章
- MATLAB插值函数interp1
- 「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
- 试算平衡表示例图_试算平衡表的编制 试算平衡表示例图
- 【03】品优购电商项目:00-品优购项目代码规范
- freemarker模板生成pdf文件
- 一个即将30岁Java程序员的自诉,在内卷的大环境之下迷惘的大龄程序员该如何破局?