最近学习ARM 汇编,写了一个C调用汇编函数的例子。
AREAAsmTest, CODE, READONLYPRESERVE8
;void ArraryArrange(char * buf, unsigned long length);
;R0 传递buf、R1传递 length。
EXPORT ArraryArrange ;在这里声明一个可全局引用的标号也就是该函数的名称
ArraryArrange ;必须顶格写,下面的就是实现其功能的具体方法啦
STMFD R13!, {R1-R7, LR}
MOV R4, R0
ADD R5, R0, R1
STAR_CMP_ARRARY
LDRB R2, , #0x01
LDRB R3,
STAR_CMP_BYTE
CMP R2, R3
BLS CMP_NEXT_BYTE
MOV R6, R2
MOV R2, R3
MOV R3, R6
STRB R2,
STRB R3,
CMP_NEXT_BYTE
MOV R2, R3
LDRB R3, !
CMP R4, R5
BLT STAR_CMP_BYTE
SUB R5, R5, #0x01
MOV R4, R0
CMP R0, R5
BLT STAR_CMP_ARRARY
LDMFD R13!, {R1-R7, LR}
BX LR ; == MOV PC, LR
;unsigned long ArithmeticSum(char *buf, unsigned long length);
EXPORT ArithmeticSum
ArithmeticSum
STMFD R13!, {R1-R7, LR};== STMDBR13!, {R1-R7, LR}
ADD R0, R0, #0x01
SUB R2, R1, #0x02
ADD R2, R0
MOV R4, #0x00
MOV R3, #0x00
SUM_ADD
LDRB R4, , #1
ADD R3, R4
CMP R0, R2
BLT SUM_ADD
MOV R0, R3
LDMFD R13!, {R1-R7, LR} ;== LDMIAR13!, {R1-R7, LR}
BX LR; 等同于 MOV PC, LR; 但BX指令在返回的同时自动从THUMB状态切换回ARM状态
END
void ArraryArrange(char * buf, unsigned long length);
unsigned long ArithmeticSum(char *buf, unsigned long length);
//求算均,但ARM没除法指令。所以只好分成两步写。
char ArithmetAverage(char *buf, unsigned long length)
{
unsigned long sum;
//ArithmeticSum函数需要增加入栈、出栈
sum = ArithmeticSum(buf, length);
sum = sum / (length-2);
return (char)sum;
}
char DataBuf =
{
100,
99,
70,
50,
200,
40,
50,
73,
74,
12
};
int main(void)
{
char Aver = 0;
while(1)
{
ArraryArrange(DataBuf, 10);
Aver = ArithmetAverage(DataBuf, 10);
}
} 学习,学习
页:
[1]