汇编调用c语言函数 call printf,如何在汇编调用c语言函数?
一、 参数传递的基本规则(ATPCS(ARM—Thumb Procedure Call Standard))
1、 参数传递
二、汇编程序、C程序相互调用举例
1、 C程序调用汇编程序
汇编程序的设计要遵守ATPCS(ARM—Thumb Procedure Call Standard),保证程序调用时参数的正确传递。
在汇编程序中使用EXPORT 伪操作声明本程序,使得本程序可以被别的程序调用。在C程序使用extern声明该汇编程序。
下面是一个C程序调用汇编程序的例子。其中汇编程序strcopy实现字符串复制功能,C程序调用strcopy完成字符串复制的工作。
//C程序
#include
extern void strcopy(char *d, const char *s);
int main( )
{
const char *srcstr=”First string-source”;
char dststr[ ]=”Second string-destination”;
printf(“Before copying:
”);
printf(“%s
%s
”, srcstr,dststr);
strcopy(dststr,srcstr);
printf(“After copying:
”);
printf(“%s
%s
“,srcstr,dststr);
while(1) ;
}
;汇编程序
AREA Scopy, CODE, READONLY
EXPORT strcopy
Strcopy
LDRB R2, [R1], #1
STRB R2, [R0], #1
CMPR2,#0
BNE Strcopy
MOV PC, LR
END
2、 汇编程序调用C程序
汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递。
在汇编程序中使用IMPORT伪操作声明将要调用的C程序。下面是一个汇编程序调用C程序的例子。其中在汇编程序中设置好各参数的值。本例中有6个参数,分别使用寄存器R0存放第1个参数,
R1存放第2个参数, R2存放第3个参数, R3存放第4个参数, 第5个、第6个参数利用数据栈传送。
由于利用数据栈传递参数,在程序调用结束后要调整数据栈指针。
//C程序g( )返回6个参数的和
int g( int a, int b, int c, int d, int e, int f )
{
printf(“e=%d
”, e);
printf(“f=%d
”, f);
return (a b c d e f);
}
; 汇编程序调用C程序 g( ) 计算6个整数 i, 2*i, 3*i, 4*i, 5*i, 6*i的和
EXPORT f
AREA f ,CODE, READONLY
IMPORT g
MOV R0, #1
ADD R1, R0, R0
ADD R2, R1, R0
ADD R3, R2, R0
ADD R4, R3, R0
ADD R5, R4, R0
STR R4, [SP, #-4]!
STR R5, [SP, #-4]!
BL g
ADD SP, SP, #4
ADD SP, SP, #4
STOP B STOP
END。
全部
汇编调用c语言函数 call printf,如何在汇编调用c语言函数?相关推荐
- C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...
1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...
- java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...
问题描述: 某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(), ...
- ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)
参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/ ...
- 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在
函数内创建的数组在调用后,是不是就不存在 本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 编辑 第1种写法: char *getABC() { char str[10 ...
- C语言 vprintf 函数和 printf 函数区别 - C语言零基础入门教程
目录 一.vprintf 函数和 printf 函数声明简介 1.printf 函数声明 2.vprintf 函数声明 二.vprintf 函数和 printf 函数使用 三.猜你喜欢 零基础 C/C ...
- 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区
目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...
- 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)
目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...
- c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...
点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...
- 怎样用才c语言定义一个三位数,怎样编写一个c语言程序计算任意输入一个3位数的整数的各位数字之和。要求主函数包括输入输出和调用该函数。...
点击查看怎样编写一个c语言程序计算任意输入一个3位数的整数的各位数字之和.要求主函数包括输入输出和调用该函数.具体信息 答:#include void main(){ int a,sum=0; pri ...
最新文章
- c++ 从文本中逐行读取,并按空格对读取的一行进行分割
- 输入法项目-用delphi生成GBK 中文编码 表(4~5) GBK/4~5: 0xAA40~0xFEA0(部分) 扩充汉字 包括繁体 0xA840~0xA995(部分) 扩充非汉字...
- MySQL隧道创建方式
- 50 【Go版本变化】
- 将windows下编辑好的文件(GBK)转换成Linux下的格式(UTF8)
- 我该学习哪个人工智能系统
- String的点点滴滴
- jquery上传图片_MVC 上传图片,裁剪头像
- java-JDBC配置驱动程序
- unix源码分析_UNIX网络分析
- 计算机硬件配件怎么查,如何查看计算机主板型号?主板型号在哪里[方法]
- 独家 | 零基础入门优化问题
- 跨平台应用即将消亡!
- 海康摄像机3D PTZ功能,拍照功能
- python输入百分制成绩s、按五级分制输出_输入一个百分制成绩,利用switch语句编写程序,要求输出成绩等级A B C D,E。90以上为A...
- 知识图谱中的实体定义
- [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应
- 点集拓扑学习(一)拓扑空间
- 网络安全能力认证CCSC管理Ⅰ级认证
- linux配置https不安全链接,配置HTTPS证书后,浏览器出现不安全提示的解决方法