C与汇编混合编程的实现示例

目录
  • 1. C语言内联汇编
  • 2. C语言调用汇编函数
  • 3. 汇编代码调用C语言函数

上一期中,使用链表的方式进行对不同任务的调用,实现的效果还是不错的,但是,任务在进行过程中不能进行来回的切换,必须要执行完,这是一个弊端,若不使用实时操作系统的情况下,如何切换呢,那就要说一下万能的汇编了,用汇编则可以做到任务的切换

首先我们知道,c与汇编的联合使用就三种情况,如下

1. C语言内联汇编

首先看一下代码

__inline int ADD(int input1,int intput2)
{
	int output;
	__asm{
		ADD output,input1,intput2
	}
	return output;
}

int Number(void);

int value;
int main(void)
{
	int a = 12,b = 13;
	while(1)
	{
		value = ADD(a,b);
	}
}

执行效果

0x19的十进制为25

2. C语言调用汇编函数

调用汇编函数,首先创建一个.s汇编文件

创建完成后,在汇编文件中写入一个汇编函数

				AREA |.text|,CODE,READONLY
				EXPORT Get_Number
Get_Number
		MOV		R0,#761
		BX		LR
		ALIGN
		END

然后写一个main函数调用它

int Get_Number(void);

int value;
int main(void)
{
	while(1)
	{
		value = Get_Number();
	}
}

查看执行效果

3. 汇编代码调用C语言函数

在汇编文件中,输入如下代码

				AREA 	|.text|,CODE,READONLY
				IMPORT Get_Number
				IMPORT Number

				EXPORT __main
				ENTRY

__main
				LDR		R1,=Number
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Number

				END

在C文件中输入如下代码

int Number;

int Get_Number(void)
{
	Number = Number + 32;

	return Number;
}

看一下执行效果吧

继续向下执行

数字由100变成132;实现功能

解释说明:

/*
AREA
    语法格式:
    AREA 段名 属性1 ,属性2 ,……
    AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如:|1_test| 。
    属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:
    — CODE 属性:用于定义代码段,默认为READONLY 。
    — DATA 属性:用于定义数据段,默认为READWRITE 。
    — READONLY 属性:指定本段为只读,代码段默认为READONLY 。
    — READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE 。
    — ALIGN 属性:使用方式为ALIGN表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。
    — COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。 

*/

/*
MOV
	传送指令	将右边数据移入左边寄存器
LDR
	将右值地址存的数据移入左边寄存器
BX
	通用寄存器 里面存入基地址、偏移量、临时数据
BL
	跳转指令

LR r14
(1)当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复
(2)异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址

ENTRY   是程序入口伪指令。在一个完整的汇编程序中至少有一个 ENTRY,编译程序在编译连接时依据程序入口进行连接。
		在只有一个入口时,编译程序会把这个入口的地址定义为系统复位后的程序起始点。但在一个源文件里最多只能有一个 ENTRY。

ENDP    表示PROC所定义的过程结束. (end procedure)
ENDS    表示SEGMENT定义的段结束.   (end segment)
END     程序结束.
*/

使用BL跳转
BL指令同时还将PC寄存器的值保存到LR寄存器中,是带返回的跳转指令
所以
假设在一个汇编程序中,要调用两个C语言函数
用事实证明可以返回

将汇编代码修改为如下

				AREA 	|.text|,CODE,READONLY
				IMPORT Get_Number
				IMPORT Number
				IMPORT Get_Value
				IMPORT Value

				EXPORT __main
				ENTRY

__main
				LDR		R1,=Number
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Number

				LDR		R1,=Value
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Value

				END

对应的c文件为

int Number;

int Get_Number(void)
{
	Number = Number + 32;

	return Number;
}

int Value;

int Get_Value(void)
{
	Value = Value - 32;

	return Value;
}

查看代码执行情况
首先进行第一个函数的执行,数字发生改变

接下来是第二个函数执行,数字发生改变

证明BL跳转可以返回。
可以使用汇编加C语言的编程思路,打破一些限制
也为后面进行PC的跳转打下基础

到此这篇关于C与汇编混合编程的实现示例的文章就介绍到这了,更多相关C与汇编混合编程 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言内嵌汇编API内存搜索引擎实例

    本文实例讲述了C语言内嵌汇编API内存搜索引擎的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: // apisearchEngine.cpp : Defines the entry point for the console application.  //    #include "stdafx.h"  #include <Windows.h>     DWORD __stdcall GetStrLengthA(char* szName)  {   

  • C语言中的数组和指针汇编代码分析实例

    今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

  • 汇编语言 跳转指令与C语言的条件分支

    跳转指令 跳转指令也是一个组的指令,称为j组.其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义,最左边为每条机器指令地址 jmp指令的对应机器指令有两个字节:eb表示这是jmp指令,03描述跳转信息.值得注意的是,跳转指令进行编码时,采用相对位置编码,如03描述的就是偏移量 结合实例进行理解:在未执行jmp指令时,rip寄存器存

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • c语言调用汇编的方法

    c部分很简单,文件名随便,如main.c: 复制代码 代码如下: #include <stdio.h>#include <stdlib.h> void decToBin(long dec,char *b); //声明外部汇编函数int main(){          long dec=254;          char *bin=(char*)malloc(sizeof(char)*64);          decToBin(dec,bin);          printf

  • C与汇编混合编程的实现示例

    目录 1. C语言内联汇编 2. C语言调用汇编函数 3. 汇编代码调用C语言函数 上一期中,使用链表的方式进行对不同任务的调用,实现的效果还是不错的,但是,任务在进行过程中不能进行来回的切换,必须要执行完,这是一个弊端,若不使用实时操作系统的情况下,如何切换呢,那就要说一下万能的汇编了,用汇编则可以做到任务的切换 首先我们知道,c与汇编的联合使用就三种情况,如下 1. C语言内联汇编 首先看一下代码 __inline int ADD(int input1,int intput2) { int

  • C语言如何与ARM汇编语言混合编程示例详解

    目录 一.ARM汇编语言简介 二.C语言调用汇编语言 1.无参数调用 2.有参数调用 三.汇编语言调用C语言 四.总结 五.参考文献 主要使用软件:keiL μVision5 一.ARM汇编语言简介 什么是汇编语言?汇编语言是任何一种适用于电子计算机.微处理器或其他可编程器件的低级语言.虽然被称为"低级语言",但是并不是说汇编语言真的"低级".特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.汇编语言主要包括传送指令.逻辑运算.移位指令.位

  • 汇编基础程序编写教程示例

    目录 源程序 1.1 构成 寄存器与段的关联假设 标号 定义一个段 程序结束标记 程序返回 程序运行 1.2 源程序中的"程序" 1.3 段结束.程序结束.程序返回 1.4 语法错误和逻辑错误 2 程序执行的过程 2.1 一个汇编语言程序从写出到最终执行的简要过程: 2.2 连接 2.3 可执行文件 2.4 程序执行过程的跟踪 总结 3 程序编写 3.1 两个基本的问题 3.2 数据在哪里 立即数(idata) 寄存器 段地址(SA)和偏移地址(EA) 3.3 指令处理的数据有多长 3

  • Swift和C语言混合编程教程

    作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 基本数据类型 Swift 提供了一些和 C 语言的基本类型如char,int,float,double等价的 Swift 基本数据类型.然而,这些 Swift 的核心基本类型之间并不能隐式的相互转换,如 Int.因此,只有你的代码明确要求它们时再使用这些类型,而 Int 可以在任何你想使用它的时候使用. C 类型

  • 批处理与python代码混合编程的方法

    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了bat+jscript的混编实现的. cn-dos和bathome论坛里先后有帖子介绍和示范了批处理和各种语言脚本的混合编程,有兴趣可以搜索看看. python不挑剔文件后缀,只要程序中包含正确的python代码都可以用python 解释器解释执行. 批处理与python的混合编程方法很简单,

  • 深入理解C/C++混合编程

    在工作中,C.C++密不可分,做我们嵌入式方面的,当然更多的是C,但,有时候却少不了C++,而且是C.C++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头.Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的....但,*.c与*.cpp文件混搭在一起,不是那么的简单,知识总是

  • python编程线性回归代码示例

    用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子.scipy.stats.linregress例子.pandas.ols例子等. 不过本文使用sklearn库的linear_model.LinearRegression,支持任意维度,非常好用. 一.二维直线的例子 预备知识:线性方程y=a∗x+b.y=a∗x+b表示平面一直线 下面的例子中,我们根据房屋面积.房屋价格的历史数据,建立线性回归模型. 然后,根据给出的房屋面积,来预测房屋价格

  • 如何利用Boost.Python实现Python C/C++混合编程详解

    前言 学习中如果碰到问题,参考官网例子: D:\boost_1_61_0\libs\python\test 参考:Boost.Python 中英文文档. 利用Boost.Python实现Python C/C++混合编程 关于python与C++混合编程,事实上有两个部分 extending 所谓python 程序中调用c/c++代码, 其实是先处理c++代码, 预先生成的动态链接库, 如example.so, 而在python代码中import example;即可使用c/c++的函数 . em

  • Python面向对象编程repr方法示例详解

    目录 为什么要讲 __repr__ 重写 __repr__ 方法 str() 和 repr() 的区别 为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print 实例对象时,输出自定义内容,就可以用 __repr__ 方法了 或者通过 repr() 调用对象也会返回 __repr__ 方法返回的值 是不是似曾相识....没错..和 __str__ 一样的

  • x86汇编DOS编程环境搭建过程

    目录 前言 相关工具的介绍 DOSBOX 汇编工具包 DOSBOX的使用 汇编 连接 执行 调试 其它 前言 在学习x86汇编时,第一步是搭建一个可以编译.运行代码的环境 这方面的教程有一些,但是给出的下载链接还要付费,或者内容不全,我看不起这些人,所以自己写一个,方便看到这个文档的大家,需要下载附件以度盘给出,免费下载 链接: https://pan.baidu.com/s/1syKK2kZoGLrCjF8WxvYM6g 提取码: e8et 相关工具的介绍 DOSBOX 这个软件在PC上模拟出

随机推荐