......
添加;添加子程序添加
添加r0,r0,r1
MOV pc,LR
......
在C程序的main()函数中调用了add assembly子例程:
extern int add(int x,int y); //声明添加为外部函数
void main(){
int a = 1,b = 2,c;
c =加(a,b); //调用add子例程
......
}
当main()函数调用add Assembly子例程时,将变量a和b的值赋予r0和r1,并将返回结果由r0带回并分配给变量c. 函数调用结束后,变量c的值为3.
4. C程序中的嵌入式汇编语句
C语言的嵌入式汇编语句可以实现一些高级语言无法实现或不容易实现的功能. 对时间要求严格的功能也可以通过将汇编语句嵌入C语言中来实现. 内置的汇编器支持大多数ARM指令和Thumb指令,但不支持诸如直接修改PC以实现跳转之类的基础功能,也不能直接使用C语言引用变量.
内联汇编
用C和C ++语言嵌入汇编语言可以实现一些高级语言无法提供的功能.
语法
__ asm __(“说明
...
说明”); // Linux gcc支持
__ asm {
说明
...
说明
}; //支持ADS
asm(“指令[;指令]”); //用于ARM C ++
ARM汇编程序设计
ARM嵌入式程序集语法
asm(
汇编语句模板:
输出部分:
输入部分:
编辑部分)
asm(“ mov%0,%1,ror#1”: “ = r”(结果): “ r”(值));
共有四个部分: 汇编语句模板,输出部分,输入部分,销毁描述部分,每个部分用“: ”分隔,汇编语句模板是必不可少的,其他三个部分是可选的,如果后面的部分是使用c语言对应汇编语句,并且前面部分为空,您还需要使用“: ”打开,对应的部分为空. 例如:
__ asm__ __ volatile __(
“ CLI”:
: “内存”)
汇编语句模板
汇编语句模板由以sequences分隔的汇编语句序列组成; ”,“ \ n”或“ \ n \ t”. 指令中的操作数可以使用占位符来引用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进行位旋转.
它可能还选择了其他任何寄存器.
ldr r3,[sp,#0]
mov r3,r3,ror#1
str r3,[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.c d表示寄存器eax / ax / al,ebx / bx / bl,ecx / cx / cl或edx / dx / dl
S,D表示需要寄存器esi或edi
&输出操作数不能使用与交叉输入操作数相同的寄存器
%此操作数可以与下一个数字交换位置,例如加号
我的意思是常数(0〜31)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-200717-1.html