MDK中汇编程序的调用

先说一下汇编程序的语法格式,参考一下代码中的注释

 1  1 rGPBCON        EQU            0x56000010      ;宏定义、每一段开始的标识都顶格写
 2  2 rGPBDAT        EQU            0x56000014
 3  3 rGPBUP        EQU            0x56000018    
 4  4 
 5  5     EXPORT BEGIN                      ;这几句都是必须的,详见相关书籍中对ARM9汇编语法格式的描述
 6  6 
 7  7     AREA  BEGIN, CODE, READONLY  
 8  8     ENTRY
 9  9 
10 10     ldr r0, =rGPBCON
11 11     ldr r1, =0x55<<10
12 12     str r1, [r0]
13 13 
14 14     ldr r0, =rGPBUP  
15 15     ldr r1, =0xffff  
16 16     str r1,[r0] 
17 17     
18 18     ldr r2, =rGPBDAT
19 19 
20 20     ldr r1, =0xff<<5
21 21     str r1, [r2]
22 22 
23 23 led_ctl            ;跳转的标识顶格写
24 24     
25 25     ldr r1, =0x0c<<5
26 26     str r1, [r2]
27 27 
28 28     B  led_ctl
29 
30 52     END            ;对应上面的标识符ENTRY,每一个ENTRY一个END
View Code

如果是以main.s来命名文件,那么代码中【ENTRY】上面的【BEGIN】就需要换成【__main】,否则会报错没有main,但main函数不是C语言才有吗?这里还需要弄清楚。但是在ADS1.2中,【BEGIN】就可以用。

 

如果工程中有main.c,这就涉及到了C和汇编的混合编程,可以分为以下情况

1、汇编程序段不在main.c中,那么在main文件中调用汇编程序段,就需要进行声明,例如上面那个程序

  在mian中进行声明【void BEGIN(void);】  随后就可以用BEGIN();来运行那一段程序了

  这里存在的一个疑问是:是否可以带参数,如果带参数的话该怎样定义

2、直接在C语言程序段中添加一段汇编程序

__asm void BEGIN1(void)          //软件复位 自己添加
{
    ldr r0, =0x56000010
    ldr r1, =0x55<<10
    str r1, [r0]

    ldr r0, =0x56000018  
    ldr r1, =0xffff  
    str r1,[r0] 
    
    ldr r2, =0x56000014

    ldr r1, =0xff<<5
    str r1, [r2]
    
led_ctl
    ldr r1, =0x01<<5
    str r1, [r2]

    B  led_ctl
}
View Code

这里命名为BEGIN1,是因为如果是BEGIN就跟刚才的那个一段重名了,是错误的。

这样的定义方式就不需要像前一段代码那样有【ENTRY】【END】等了,但是这里的段标识符还需要顶格写,否则会报错 

此外,还需要注意区别C/汇编的混合编程中的【内联】和【内嵌】两种编程方式

http://www.amobbs.com/thread-3624548-1-1.html

 

ADS中不在main.s中定义【__main】也可以,也可以叫其他的名字,很随意

此外,在汇编中调用C的程序段,在MDK中不知道该怎么弄,在ADS中

 

 

转载于:https://www.cnblogs.com/wangXX/archive/2013/06/04/3117943.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值