如何从汇编语言过渡到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语言与汇编语言混合编程相关推荐

  1. C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt

    补充:单片机c语言与汇编语言混合编程 reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0 ...

  2. keil4c语言和汇编混合,keil C语言与汇编语言混合编程

    keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...

  3. 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf

    维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...

  4. c语言混合编程 pdf,C语言与汇编语言混合编程的方法.pdf

    C语言与汇编语言混合编程的方法 维普资讯 讫 梅 龄 施 扰 绝 埔 综 勿 穗 直 触 搔 拌 橱 悬 邱 舟 絮 颈 茬 辞 乏 味 绞 涡 菊 黄 宜 悄 条 搬 悄 俱 泼 洋 醚 檀 测 易 ...

  5. c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验

    混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...

  6. c语言汇编混合编程方法,C语言和汇编语言混合编程方法

    摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言.两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用.本文通过具体的实例,说明了混合编程的基本方法, ...

  7. ARM下C语言和汇编语言混合编程

    文章目录 一. 在C语言中调用汇编语言 1. 编写代码 2. 调试验证 二. 在汇编语言中调用C语言 1. 编写代码 2. 调试验证 关于函数的传递参数以及接受返回值的原理,在另一篇博客:X86与AR ...

  8. keil下C与汇编语言混合编程

    文章目录 前言 一.在c函数中调用汇编函数 1.调用不带参数的汇编函数 2.调用带形参的汇编函数 二.在汇编函数中调用c函数 三.汇编函数与c函数混合调用 总结 前言 如今C语言很强大,在嵌入式编程当 ...

  9. STM32的C与汇编语言混合编程

    本次我们要运用到汇编语言,并且将其与c混合编程.内容较多. 一.在c语言中调用汇编语言 新建一个工程 new project 芯片型号,STM32F103VE 配置如下 创建c文件 代码部分几乎相同, ...

最新文章

  1. 运行程序报“应用程序配置不正确”或者缺少运行库造成程序不可移植的问题...
  2. 【Spring框架家族】SpringBoot自动配置原理源码跟进
  3. Matlab实用程序--图形应用-填充图
  4. 动态代理:JDK动态代理和CGLIB代理的区别
  5. python中sorted()函数的用法
  6. window mysql proxy_window下mysql-proxy简单使用
  7. 矩阵A对任意的可逆矩阵p都有Ap=pA,证明A为数量矩阵
  8. leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
  9. 用Create Fishnet来生成格网
  10. 定义空列表元素类型_【Python+Excel】做数据分析5--列表和元组读取和常用查询
  11. 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】
  12. Ardence BXP 3.5 - 4.1 PNP 方法
  13. 设置后台事务的执行人
  14. 操作系统课后答案第五章
  15. MATLAB插值函数interp1
  16. 「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
  17. 试算平衡表示例图_试算平衡表的编制 试算平衡表示例图
  18. 【03】品优购电商项目:00-品优购项目代码规范
  19. freemarker模板生成pdf文件
  20. 一个即将30岁Java程序员的自诉,在内卷的大环境之下迷惘的大龄程序员该如何破局?

热门文章

  1. 模式识别或智能视频处理常用的视频库素材库
  2. 实例讲解电源高频变压器的设计方法
  3. vue实现粘贴截图上传图片
  4. 微信小程序开发之大转盘 仿天猫超市抽奖
  5. s7300的db块详细说明_S7300中FB、FC和DB块的使用
  6. pyqt5自定义控件的方法
  7. Android 利用OpenCV 的Stitcher做全景图片拼接(支持平面和球面)
  8. python爬虫爬取网络小说
  9. 以航天标准研制,饮冰携三款激光雷达上演价格战?...
  10. 监控系统计算机网络自检表,高速公路机电系统交工自检表格(全)