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

f2e87833f64465a826f0b986ce7cbdbf.png

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>

6-810-jpg_6-1080-0-0-1080.jpg

例如在一肝募卸ㄒ辶巳缦虑裹/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>

7-810-jpg_6-1080-0-0-1080.jpg

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。

2-810-jpg_6-1080-0-0-1080.jpg

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(

汇编语句模板:

输持:

5c8a58e5687e7ad1f52ecd38a3edacf1.png

输入部分:

修改部分

);

比如: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值