ARM汇编与GCC汇编
/**
您忘记正确设置程序集。要解决此问题,请在文件开头发出这些指令:
*/
.syntax unified
.cpu cortex-m3
.fpu softvfp
.thumb
.global add
.global gpio_init_PD2
.global test_arm
.global demo
.global number_function
.equ APB2ENR, 0x40021080 /* 类似于C语言的宏定义 #define ABB2ENR 0x40021080 */
.equ CHR, 0x40010804
.equ ODR, 0x4001080c
add:
add r3,r0,r1 /*ARM汇编参数传递 r0-r5*/
add r3,r2
mov r0,r3 /*ARM汇编参数返回 r0 */
mov pc,lr
gpio_init_PD2:
ldr r0,=APB2ENR /*将 APB2ENR的值给r0*/
mov r2,#4
str r2,[r0] /*获取 r2中的值给 r0指向的地址*/
ldr r0,=CHR
ldr r1,[r0]
orr r1,#1
str r1,[r0]
ldr r0,=ODR
ldr r1,[r0]
bic r1,#256
str r1,[r0]
mov pc,lr
test_arm:
mov r1,r0
bx r1
mov pc,lr /*返回跳转 将链接寄存器中的值lr给pc程序计数器寄存器*/
number_function:
mov r1,r0
mov r3,#0
mov r5,#0
loop1:
cmp r3,#10 /*将r3-10 设置标志位*/
beq for_end
add r3,#1
mov r0,#22
str r0,[r1,r5]
add r5,#4
b loop1
for_end:
mov pc,lr
/*
*
BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
*
*
*/
导出方式
extern int add(int a,int b,int c);
extern void gpio_init_PD2();
extern uint32_t test_arm(void* addr);
extern void number_function(int* number);
内敛汇编
int num1=10,num2=20;
asm volatile(
"mov %0,%1\n\t"
"add %0,100\n\t"
:"+r"(num1)
:"r"(num2)
:"memory"
);
int number[10]={1,2,3,4,5,6,7,8,9,10};
asm volatile(
"mov r0,%0 \n\t"
"mov r1,#0 \n\t"
"mov r2,#0 \n\t"
"loop1: \n\t"
"cmp r1,#9 \n\t"
"beq for_end \n\t"
"add r1,#1 \n\t"
"mov r5,22 \n\t"
"str r5,[r0,r2] \n\t"
"add r2,#4 \n\t"
"b loop1 \n\t"
"for_end: \n\t"
:
:"r"(number)
:"memory"
);
int i;
for(i=0;i<10;i++){
printf("number=%d\r\n",number[i]);
}