一、 参数传递的基本规则(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语言函数?相关推荐

  1. C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...

  2. java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...

    问题描述: 某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(), ...

  3. ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

    参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/ ...

  4. 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在

    函数内创建的数组在调用后,是不是就不存在 本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 编辑 第1种写法: char *getABC() { char str[10 ...

  5. C语言 vprintf 函数和 printf 函数区别 - C语言零基础入门教程

    目录 一.vprintf 函数和 printf 函数声明简介 1.printf 函数声明 2.vprintf 函数声明 二.vprintf 函数和 printf 函数使用 三.猜你喜欢 零基础 C/C ...

  6. 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区

    目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...

  7. 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)

    目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...

  8. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

  9. 怎样用才c语言定义一个三位数,怎样编写一个c语言程序计算任意输入一个3位数的整数的各位数字之和。要求主函数包括输入输出和调用该函数。...

    点击查看怎样编写一个c语言程序计算任意输入一个3位数的整数的各位数字之和.要求主函数包括输入输出和调用该函数.具体信息 答:#include void main(){ int a,sum=0; pri ...

最新文章

  1. c++ 从文本中逐行读取,并按空格对读取的一行进行分割
  2. 输入法项目-用delphi生成GBK 中文编码 表(4~5) GBK/4~5: 0xAA40~0xFEA0(部分) 扩充汉字 包括繁体 0xA840~0xA995(部分) 扩充非汉字...
  3. MySQL隧道创建方式
  4. 50 【Go版本变化】
  5. 将windows下编辑好的文件(GBK)转换成Linux下的格式(UTF8)
  6. 我该学习哪个人工智能系统
  7. String的点点滴滴
  8. jquery上传图片_MVC 上传图片,裁剪头像
  9. java-JDBC配置驱动程序
  10. unix源码分析_UNIX网络分析
  11. 计算机硬件配件怎么查,如何查看计算机主板型号?主板型号在哪里[方法]
  12. 独家 | 零基础入门优化问题
  13. 跨平台应用即将消亡!
  14. 海康摄像机3D PTZ功能,拍照功能
  15. python输入百分制成绩s、按五级分制输出_输入一个百分制成绩,利用switch语句编写程序,要求输出成绩等级A B C D,E。90以上为A...
  16. 知识图谱中的实体定义
  17. [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应
  18. 点集拓扑学习(一)拓扑空间
  19. 网络安全能力认证CCSC管理Ⅰ级认证
  20. linux配置https不安全链接,配置HTTPS证书后,浏览器出现不安全提示的解决方法

热门文章

  1. LeetCode-1.Two Sum
  2. 10.Facade-外观模式
  3. Mysql自带客户端与可视化客户端的乱码处理
  4. 进击的UI--------------------GETPOST
  5. IIS6.0上某些文件类型不能下载
  6. 今天准备正式开博了!专注于Silverlight!
  7. realloc,malloc,calloc的区别
  8. (zz)ubuntu 9.04 下无线破解
  9. JavaScript OOP(2)定义JavaScript类
  10. Git创建ssh密匙时报错Too many arguments解决方法