ARM汇编与GCC汇编

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"   //参数的顺序从左到右使用数字序号来引用, 例如%0表示第一个参数。
        :"+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]);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值