#include"stdio.h"
#include"limits.h"
#include"time.h"
#include<stdlib.h>
#include"math.h"
#include<ctype.h>
#include"rt_misc.h"
#include<setjmp.h>
#include<cstddef>
在C语言中嵌入汇编程序,用__asm,asm前是两个下滑杠,汇编语言在其后的大括号实体中写出,例如:在C语言中定义一个整型f函数,自变量为整型x,则可按下列规格编写
int f(int x)
{
int r0;
__asm
{
ADD r0,x,1
EOR x,r0,x
}
return x;
}
函数名后加 __pure:为了通知编译器这是一个纯函数,在申明时需要将该函数定义为 __pure 。
int f(int x)__pure
{
int r0;
__asm
{
ADD r0,x,1
EOR x,r0,x
}
return x;
}
////////////////////////////////////////////////////////////////////////////
Thumb状态编译C或C++时,内联汇编程序不编译,且自动切换到ARM状态,如果要在Thumb状态内编译汇编指令到代码中,需要将含有汇编指令的函数包含在
#pragma arm 和#pragma thumb之间。
#pragma arm
int add(int i,int j)
{
int res;
__asm
{
ADD res,i,j
}
return res;
}
#pragma thumb
需要注意的是,内连汇编不支持以下汇编指令
svc,
LDR Rn , =expression伪指令,可用MOV Rn, expression代替
LDRT,LDRBT, STRT ,STRBT
MUL,MLA,UMULL,SMULL,SMLAL
MOV 或MVN标志设定指令(当第二操作数为常数)
用户模式LDM指令
ADR和ADRL伪指令
====================================
嵌入C程序中的汇编函数如果想访问C中的常量表达式,可用__cpp关键字。例如
mov r0,#__cpp(expr)
例如 mov r0,#__cpp(res)
LDR r1,=__cpp(res)
BL __cpp(res)
|