39 :C语言与汇编语言混合编程

news2024/11/22 5:43:32

目录

编译过程

编译小知识

C语言中函数是如何进行调用的?

寄存器压栈过程

C语言函数调用过程

函数调用过程

函数返回过程

C语言中的调用约定

gcc编译器使用的栈帧布局

ebp是函数调用以及函数返回的核心寄存器 

用汇编语言编写Linux应用程序

交互关键字

汇编和C混合编程注意事项

小结

思考


编译过程

编译小知识

C语言中函数是如何进行调用的?

寄存器压栈过程

调用函数 func 会将函数的 返回地址 压入到栈中。此时,esp栈指针寄存器 会往下移动。

当程序执行 ret 的时候,程序恢复到 原来 调用 call的位置。在汇编代码层面,call 做的事情 和 ret做的事情,正好相反。

C语言函数调用过程

函数调用过程

函数返回过程

C语言中的调用约定

gcc编译器使用的栈帧布局

ebp是函数调用以及函数返回的核心寄存器 

用汇编语言编写Linux应用程序


global _start

[section .data]
    vstr  db  "D.T.Software",0X0A

[section .text]
_start:
    mov edx,13
    mov ecx,vstr
    mov ebx,1
    mov eax,4
    int 0x80
    
    mov ebx,0
    mov eax,1
    int 0x80

编译链接,运行如下所示:

delphi@delphi-vm:~$ nasm -f elf entry.asm -o entry.o
delphi@delphi-vm:~$ ld -s entry.o -o app.out
delphi@delphi-vm:~$ ./app.out 
D.T.Software
delphi@delphi-vm:~$ 

交互关键字

  1. global : 从汇编语言中导出符号(变量或函数)
  2. extern : 使用外部文件中定义的符号(变量或函数)

实例分析:

接着来看下一个demo:

entry.asm


global _start
global vstr
global vlen
global print

extern c_func;

[section .data]
    vstr  db  "D.T.Software",0X0A
    vlen  dd  $ - vstr

[section .text]
_start:
    mov ebp,0
    
    call c_func
    
    call exit
    
print:
    push ebp
    mov ebp,esp
    
    mov edx,[ebp + 12]
    mov ecx,[ebp + 8]
    mov ebx,1
    mov eax,4
    int 0x80
    
    
    pop ebp
    ret
    
exit:
    mov ebx,0
    mov eax,1
    int 0x80
    

main.c



extern void print(char*,int len);
extern char vstr[];
extern int vlen;

int c_func()
{
    print(vstr,vlen);
    return 0;
}

编译,链接,运行:

delphi@delphi-vm:~$ nasm -f elf entry.asm -o entry.o
delphi@delphi-vm:~$ gcc -c main.c -o main.o
delphi@delphi-vm:~$ ld -s entry.o main.o -o app.out 
delphi@delphi-vm:~$ ./app.out 
D.T.Software
delphi@delphi-vm:~$ 

接下来,将 main.c 改成如下的程序:



extern void print(char*,int len);
extern char vstr[];
extern int vlen;

int c_func()
{
    char* delphi = "Delphi\n";
    
    //print(vstr,vlen);
    
    print(delphi,7);
    
    return 0;
}

现在只需要编译 c文件,然后链接,运行就行:

delphi@delphi-vm:~$ gcc -c main.c -o main.o
delphi@delphi-vm:~$ ld -s entry.o main.o -o app.out 
delphi@delphi-vm:~$ ./app.out 
Delphi
delphi@delphi-vm:~$ 

汇编和C混合编程注意事项

  1. 相同的目标文件格式(如:elf格式)
  2. 相同的函数调用约定(如:cdecl调用约定)
  3. 相同的活动记录(栈帧)结构(如:ebp基准)

小结

思考

可以把 main.c 文件中的 c_func 函数名字,改为 main函数名吗?

当然不行,编译可以编译通过,但是会链接出错。

delphi@delphi-vm:~$ nasm -f elf entry.asm -o entry.o
delphi@delphi-vm:~$ gcc -c main.c -o main.o
delphi@delphi-vm:~$ ld -s entry.o main.o -o app.out
entry.o: In function `_start':
entry.asm:(.text+0x6): undefined reference to `c_func'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows下基于vscode的ssh服务远程连接ubuntu服务器

Ubuntu端配置 1.确保ubuntu端已启用ssh服务 首先,安装ssh服务 sudo apt-get install openssh-server 安装后,打开ssh服务 sudo service ssh start 如果显示有sshd就说明成功了。 判断是否成功打开 ps -e|grep ssh 同时也可以通过如下方式确保ss…

Spring-AOP概念及相关术语

AOP概念 一、概述1、相关术语2、作用 二、基于注解的AOP1、准备工作2、各种通知3、切入点表达式语法4、重用切入点表达式5、获取通知的相关信息6、切面的优先级 一、概述 回顾: 什么是面向对象 什么是AOP AOP(Aspect Oriented Programming)是…

STM32F103的GPIO

文章目录 STM32F103的地址STM32F103的GPIOA的地址推算 STM32F103的地址 GPIO 都是挂载在 APB2 总线之上。 STM32F103的GPIOA的地址推算 (出自STM32F103开发指南P127) GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4个地址&#x…

Web入门笔记

Web入门笔记 HTTP协议 超文本传输协议 规定了浏览器和服务器之间数据传输的规则,请问数据和响应数据的格式 基于TCP请求-响应模式一次请求对应一次响应无状态的协议 请问数据格式 浏览器版本:解决浏览器兼容问题。GET请求体:存放请求参数…

缓解大模型幻觉问题的解决方案

本文记录大模型幻觉问题的相关内容。 参考:Mitigating LLM Hallucinations: a multifaceted approach 地址:https://amatriain.net/blog/hallucinations (图:解决大模型幻觉的不同方式) 什么是幻觉? 幻觉…

木疙瘩的进度动画实现文字逐个出现路径描边

第一步 创建素材 第二步 插入进度动画 第三步,在最后一帧插入关键帧即可!

Linux之系统编程

1.yum 1.yum list可以出现所有可下载的程序 辅助grep进行查找 2.yum install可以下载并安装 3.yum remove可以卸载程序 不同的商业操作系统内核都是一样的,主要是配套社区不一样。 开源组织,各大公司,既得利益者。 同上 基础软件源可以保证…

腾讯云轻量服务器地域选择教程,一篇文章就够了

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置,如上海、广州和北京等地域,如何选择地域?腾讯云百科txybk.com建议地域选择遵循就近原则,用户距离轻量服务器地域越近,网络延迟越低,速度就越…

Linux mv命令:移动文件或改名

mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。该命令的基本格式如下: [rootlocalhost ~]# mv 【选项】 源文件 目标文件 -f:强制覆盖,如果目标文…

问题 Y: LELE的RPG难题(分类讨论,三维)

算法如下 : eg.f(n,1,3)表示 以N为长度,以第一种颜色开头,3为结尾的合法字符串数量 故代码实现:

Docker:数据卷挂载

Docker:数据卷挂载 1. 数据卷2. 数据卷命令补充 1. 数据卷 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 Nginx容器有自己独立的目录(Docker为每个镜像创建一个独立的容器,每个容器都是基于镜像创建的运行实例),…

macOS M1安装wxPython报错

macOS12.6.6 M1安装wxPython失败: 报错如下: imagtiff.cpp:37:14: fatal error: tiff.h file not found解决办法: 下载源文件重新编译(很快,5分钟全部搞定),分三步走: 第一步&…

蚁群算法求包含34个国内城市的TSP,和最优解相差没那么大

文章目录 引言蚁群觅食算法原理代码实现ACO求解TSP整数规划求解TSP 相关阅读 引言 上一篇介绍的差分进化算法,很适合求解连续变量的优化问题;但针对组合优化问题,就不是很适用了。 至于哪一种智能优化算法更适合求解组合优化问题&#xff0…

STM32F10xx 存储器和总线架构

一、系统架构 在小容量、中容量和大容量产品 中,主系统由以下部分构成: 四个驱动单元 : Cotex-M3内核、DCode总线(D-bus)和系统总线(S-bus) 通用DMA1和通用DMA2 四个被动单元 内部SRAM 内部…

二叉树的概念

文章目录 二叉树一、树的概念1.树形结构1.1. 树的特点:1.2 概念:1.3 树的表示形式 2.树的应用 二、二叉树1.二叉数的概念2.满二叉树3.完全二叉树4.二叉树的性质练习: 二叉树 一、树的概念 1.树形结构 1.1. 树的特点: 1.根节点没…

SOLIDWORKS Simulation2024仿真10大新功能

SOLIDWORKS Simulation新增功能 1. 增强型轴承接头 •通过指定压缩、拉伸和弯曲的刚度,轻松创建自定义轴承接头。•通过向非线性和大型位移算例添加自定义条件,提高模拟精度。 优点:使用功能强大的接口,更轻松 、 更 准 确 地 设…

Spring-声明式事务

声明式事务 一、简介1、准备工作2、测试 二、声明式事务概念1、编程式事务2、声明式事务3、基于注解的声明式事务1.测试无事务情况2.加入事务①Transactional注解标识的位置②事务属性:只读③事务属性:超时④事务属性:回滚策略⑤事务属性&…

表单(form)

1、表单的作用&#xff1a; 收集 用户填入的 数据&#xff0c;并将这些数据 提交给服务器表单的语法 <form action"服务器地址" method"请求方式" enctype"数据格式"><!-- 表单项 --><input type"submit" value"提…

[毕设记录]@开题调研:外文博客搬运整理

搜college chatbot 好像比搜 university chatbot能搜出来的东西更多哈哈 我感觉&#xff0c;AI时代&#xff0c;粗看这种博客比较高效的方式是&#xff0c;用翻译插件迅速概览中文&#xff0c;然后复制给gpt让它总结要点&#xff0c;然后再去看重点部分的原文 文章目录 blog1&a…

【计算机网络】路由器的工作原理

文章目录 输入端口处理和基于目的地转发交换结构输出端口处理排队问题参考资料 路由器的四个组件 输入端口(input port)&#xff1a;执行物理层功能&#xff08;input port 左边方框、output port 右边方框&#xff09;、数据链路层功能&#xff08;input/output port 中间方框…