ARM汇编与C语言混合编程之汇编调用C函数

本文详细介绍了在ARM汇编中如何调用C语言函数,包括没有参数和有参数的情况。对于无参数函数,只需设置堆栈即可调用;有参数函数时,参数需存入R0-R3寄存器,超过4个参数则使用堆栈传递,并在调用后手动清理。实例展示了如何通过汇编调用C函数来控制LED灯的闪烁。
摘要由CSDN通过智能技术生成

  • 调用没有参数的函数
  • 调用有参数的函数
  • 总结

本文所用硬件平台为S3C2440开发板。通过一个点亮数码管的程序说明ARM汇编调用C函数的方法。
根据C语言中函数参数的个数,可以将汇编调用C函数分为两种情况,调用没有参数的函数和调用有参数的函数。


调用没有参数的函数

这种方式是最简单的调用,只需关闭看门狗,设置堆栈即可实现这种调用。
该例子程序包括汇编代码start.s,C语言代码led.c,相关寄存器定义在s3c2440.h中。改程序通过start.s调用led.c中main函数,实现led灯的闪烁。
led.c内容如下:

#include "s3c2440.h"
#define DELAYTIME 100000

void Delay(unsignedlong delaytime);

int main(void)
{
    GPIOFCON->PORT4 = OUTPUTCFG;
    GPIOFDATA->PORT4 = RESETBIT;

    while(1)
    {
        Delay(DELAYTIME);
        GPIOFDATA->PORT4 = SETBIT;
        Delay(DELAYTIME);
        GPIOFDATA->PORT4 = RESETBIT;
    }

    return;
}

void Delay(unsignedlong delaytime)
{
    while(delaytime--);
}

main函数实现LED灯的闪烁,该函数并没有参数。start.s直接通过bl指令调用main函数。

start.s内容如下:

.text
.global_start
_start:
    ldr     r0,=0x56000010 @关看门狗
    mov     r1,#0x0
    str     r1,[r0]       

    ldr     sp,= 1024*4    @设置堆栈

        bl      main       @调用c语言main函数

main_loop:
        b       main_loop  @一直循环

首先需要定义入口_start;接着要关看门狗,否则会cpu会不断重启;由于调用了函数,所以必须要设置堆栈SP;然后直接调用C语言中的main函数。

main函数主要是实现led灯的不断闪烁,程序比较简单。Led.c包含了一个名为s3c2440.h的头文件,该文件主要定义了用到的寄存器。
S3c2440.h内容如下所示:

#ifndef __S3C2440_H__
#define __S3C2440_H__

#define SETBIT      (0x01)
#define RESETBIT    (0x00)
#define INPUTCFG    (0x00)
#define OUTPUTCFG   (0x01)
#define EINTCFG     (0x10)

//为实现位操作,故采用结构体位域数据结构。
typedef volatile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值