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

1个回答

写回答

18238276956

2024-09-29 18:39

+ 关注

AI
AI

。添加;添加子程序添加添加r0,r0,r1MOVpc,LR。在C程序的mAIn()函数中调用了addassembly子例程:externintadd(intx,inty);//声明添加为外部函数voidmAIn(){inta=1,b=2,c;c=加(a,b);//调用add子例程。

}当mAIn()函数调用addAssembly子例程时,将变量a和b的值赋予r0和r1,并将返回结果由r0带回并分配给变量c。函数调用结束后,变量c的值为3。4。C程序中的嵌入式汇编语句C语言的嵌入式汇编语句可以实现一些高级语言无法实现或不容易实现的功能。

对时间要求严格的功能也可以通过将汇编语句嵌入C语言中来实现。内置的汇编器支持大多数ARM指令和Thumb指令,但不支持诸如直接修改PC以实现跳转之类的基础功能,也不能直接使用C语言引用变量。内联汇编用C和C++语言嵌入汇编语言可以实现一些高级语言无法提供的功能。

C++
C++

语法__asm__(“说明。说明”);//linuxgcc支持__asm{说明。说明};//支持ADSasm(“指令[;指令]”);//用于ARMC++ARM汇编程序设计ARM嵌入式程序集语法asm(汇编语句模板:输出部分:输入部分:编辑部分)asm(“mov%0,%1,ror#1”:“=r”(结果):“r”(值));共有四个部分:汇编语句模板,输出部分,输入部分,销毁描述部分,每个部分用“:”分隔,汇编语句模板是必不可少的,其他三个部分是可选的,如果后面的部分是使用c语言对应汇编语句,并且前面部分为空,您还需要使用“:”打开,对应的部分为空。

例如:__asm____volatile__(“CLI”::“内存”)汇编语句模板汇编语句模板由以sequences分隔的汇编语句序列组成;”,“ ”或“ ”。指令中的操作数可以使用占位符来引用C语言变量。

多达10个占位符的名称如下:%0,%1。%9汇编程序指令,定义为单个字符串常量:“mov%0,%1,ror#1”输出部分输出部分描述输出操作数。不同的操作数描述符用逗号分隔。每个操作数描述符均由限定的字符串和C语言变量组成。每个输出操作数的限定字符串必须包含“=”,以表明它是一个输出操作数。

“=r”(结果)输入部分输入部分描述输入操作数。不同的操作数描述符用逗号分隔。每个操作数描述符均由限定的字符串和C语言表达式或C语言变量组成。“r”(值)修改:这部分通常使用“内存”作为约束,以指示操作完成后内存的内容已更改。如果某个寄存器的内容来自内存,则内存中的此单位已更改。

asm(代码:outputoperandlist:inputoperandlist:clobberlist);asm(“mov%0,%1,ror#1”:“=r”(结果):“r”(值));%0表示“=r”(结果),并且%1代表“r”(值)生成的汇编语句:编译器选择registerr3进行位旋转。

它可能还选择了其他任何寄存器。ldrr3,[sp,#0]movr3,r3,ror#1strr3,[sp,#4]您可以将volatile属性添加到theasm语句中,以指示编译器不要优化您的汇编代码。asmvolatile(“mov%0,%1,ror#1”:“=r”(结果):“r”(值));限制字符它们的作用是指示编译器如何处理后续C语言变量和指令操作数之间的关系,例如将变量放置在寄存器中还是在内存中等等。

字母含义m,vc语言对应汇编语句,o表示存储单元R表示任何通用寄存器Q表示寄存器eax,ebx,ecx,edx之一I,h表示直接操作数E,F是浮点数G表示“任何”a,b。

cd表示寄存器eax/ax/al,ebx/bx/bl,ecx/cx/cl或edx/dx/dlS,D表示需要寄存器esi或edi&输出操作数不能使用与交叉输入操作数相同的寄存器%此操作数可以与下一个数字交换位置,例如加号我的意思是常数(0?31)。

举报有用(17分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号