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中

 

 

posted on 2013-06-04 21:49  死鱼翻身ing  阅读(499)  评论(0编辑  收藏  举报