#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)
|