ARM汇编语言和C语言混合编程

ATPCS规灾了一种模块化设计的观念,其基本内容是C模块(函数)和汇编模块(函数)相互的一套规?中还有类似的一套规晕腋芯谙呋惚喙δ芮看用有很多忌讳),厅知道(很寄几它/p>

ATPCS规暂:

1)寄存乒用规誉

1、子程袖通过寄存苧3来释放参数,当参数膏于4脯使用堆栈来释放参数。此时r0~r3可记譇4。

2、在子程鞋使用寄存苧11保存局部变量。冶进行子程忻时应留意对这种寄存疲存和恢复。此时r4~r11可记譜8。

3、寄存朴糜诒4娑颜恢刚隨P,当子程胸时使用该寄存苹,记祝

4、寄存朴米恢刚耄亲<拇嫫称为链接寄存魄祝该寄存期保存子程械回地址。

5、寄存瞥莆绦亲Ⅻ/p>

2)堆栈的使用规誉

ATPCS规定堆栈采用满递纪(FD,Full Descending),即堆栈通过兼储品而犀堆栈指针指犀有效数据项的最低地址。

3)参数的传递规誉

1、整数参数的前4该r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且无法满足需要的一组连续的寄存戚参数。

2、子程械回结果为一富整数时,通过r0返回;返回结果为一富整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过异或运算组件的寄存脾D0?返回。

比较有态最明白,我举两赣:

1.汇编置C子程衪rong>

汇编程虚写要譚PCS规栽保证程忻时参数正确释放。在汇编程谐绦椒ㄎ裹/p>

1)在汇编程泄用IMPORT伪指令粁tern事先声锚的C语言函数;

2)通过BL指令来岛Ⅻ/p>

例如在一肝募卸ㄒ辶巳缦虑裹/p>

int add(int x,int y)

{

return(x+y);

}

礵d()函数的汇编程泄如下:

area main,code,readonly ;代码段

entry ;声泌

code32 ;32位ARM指令

IMPORT add 粁tern add;声媚C函数

start

……

MOV r0,1

MOV r1,2

BL add ;岛齛dd

……

end

当进行变量当,使用r0和r1实现参数传递,返回结果由r0带回。函数滇束?的值成为3。

2.C置汇编子程衪rong>

C程忻汇编程鞋汇编程虚写也要譚PCS规栽保证程忻时参数正确释放。在C程秀编子程薪法为:

1)在汇编程泄用EXPORT伪指令声媚子程许示该子程汹其他文件中被袋/p>

2)在C程泄用extern关键字声媚汇编子程锈部函数。

例如在一膏源文件中定义了如下钳数:

EXPORT add ;声米映绦煌獠亢/p>

……

add ;怯程宵/p>

.global add ;声漫

ADD r0,r0,r1

MOV pc,lr

……

在一感ain()函数中对add汇编子程行了岛

extern int add (int x,int y); //声梦獠亢?/p>

void main(){

int a=1,b=2,c;

c=add(a,b); //礵d子程孝且隐式地对r0和r1赋值

……

}

当main()函数礵d汇编子程鞋变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给函数c。函数滇束轰量c的值成为3。

3、C程汹嵌汇编语句

在C语言中嵌入汇编语句可以实现一些高级语言不能实现换容易实现的功能。对于时间侥功能也可以借助在C语言中嵌入汇编语句来推动。内嵌的汇编浦粗ARM指令跟Thumb指令,但是不支持例如直接设置PC实现跳转的底层功能c语言对应汇编语句,也不能直接引用C语言中的变量。

内嵌汇编:在C和C++语言中嵌入汇编语言可以推动一些高级语言中没有的功能。

语法

__asm__( ;注意:前面是两竡uo;_”

“instruction

...

instruction”

);//Linux gcc中支持

__asm{

instruction

...

instruction

}; //ADS中支持

asm(“instruction[; instruction]”); //ARM C++中使用

ARM内嵌汇编语法

asm(

汇编语句模板:

输持:

输入部分:

修改部分

);

比如: asm("mov %0, %1, ror #1" :"=r" (result) : "r" (value));

共四钢:汇编语句模板,输持,输入部分c语言对应汇编语句,破坏描手,钢使用“:”脯汇编语句模板必不可少,其他三个别可选,如果使用了耗部分,而后面部分为空,也必须用“:”脯相应部分内容为空。例如:

__asm__ __volatile__(

"CLI":

:"memory"

);

示例:/* main.c */

void __main(void)

{

int var=0xAA;

__asm //内嵌汇编标识

{

MOV R1,var

CMP R1,#0xAA

}

while(1);

}

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-138768-1.html

汇编和c语言混合编程缺点,汇编C语言混合编程经验总结相关推荐

  1. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编

    gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T:  %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...

  2. S5PV210体系结构与接口02:ARM编程模型 汇编指令

    目录 1. ARM的基本设定 1.1 ARM数据类型 1.1.1 基本数据类型 1.1.2 浮点数据类型 1.1.3 存储器大小端 1.2 支持的指令集 2. Cortex-A8编程模型 2.1 处理 ...

  3. c语言中 伪指令,ARM汇编伪指令介绍(1)

    ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...

  4. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  5. 在易语言代码中嵌入汇编/机器码

    在易语言代码中嵌入汇编/机器码                    --"置入代码"的使用方法简介 作者:liigo 原文链接:http://blog.csdn.net/liig ...

  6. VS2005混合编译ARM汇编代码

    2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...

  7. GCC在C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  8. C语言中内嵌汇编asm语法

    这篇文章写得炒鸡详细而且很全面,易于理解,建议新手查看 C语言中内嵌汇编asm语法 下面这两篇文章作为补充来看 C语言内嵌汇编:asm volatile C语言ASM汇编内嵌语法

  9. python和c语言混合编程-python和C语言混编的几种方式

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7594551.html 作者:窗户 Q ...

最新文章

  1. 数字经济时代,什么是关键资源?(算力篇)
  2. 对sigma pix 的理解
  3. 使用Intellij IEDA创建hibernate
  4. G_PERIOD_GET
  5. Linux下Weblogic 11g R1安装和配置
  6. 案例研究设计与方法-罗伯_旭进口重新设计-用户体验案例研究
  7. 用Excel VBA连接SQL Server数据库并将表中的数据显示到Excel中
  8. 永恒之塔修改服务器,[搬运工]永恒之塔单机版7.8 德国最新服务端
  9. SQL的四种连接-左外连接、右外连接、内连接、全连接(转)
  10. 【SpringCloud】Spring Cloud Config 配置中心
  11. 基于BS模式的航材电子商务交易平台(1)
  12. sqlmap注入语句整理
  13. 局域网测试工具、局域网UDP、TCP端口诊断工具
  14. Python实现的简易HTTP代理服务器
  15. 不小心格式化硬盘,重新分区了硬盘的恢复方法
  16. pandas——显示设置
  17. php后端自学,【后端开发】自学php有哪些好的方法
  18. python判断是否构成三角形并计算面积
  19. 2023年的深度学习入门指南(14) - 不能只关注模型代码
  20. java惊魂_我的世界孤儿院惊魂

热门文章

  1. python第四章单元测试_Python 单元测试
  2. 2017.7.30 玩具装箱 思考记录
  3. 【Linux使用】Centos 7设置时区与时钟(chrony / ntp /systemd)
  4. 【英语学习】【WOTD】sleuth 释义/词源/示例
  5. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
  6. 台湾大学公开课《概率》第五周一道不会作的作业题 ,一种看不懂的解法
  7. centos下添加windows启动项
  8. Django - 两周从入门到熟练工
  9. 29.C++- 异常处理
  10. Hadoop2.6.0中YARN底层状态机实现分析