先说一下汇编程序的语法格式,参考一下代码中的注释
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
如果是以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语言程序段中添加一段汇编程序
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
__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 }
这里命名为BEGIN1,是因为如果是BEGIN就跟刚才的那个一段重名了,是错误的。
这样的定义方式就不需要像前一段代码那样有【ENTRY】【END】等了,但是这里的段标识符还需要顶格写,否则会报错
此外,还需要注意区别C/汇编的混合编程中的【内联】和【内嵌】两种编程方式
http://www.amobbs.com/thread-3624548-1-1.html
ADS中不在main.s中定义【__main】也可以,也可以叫其他的名字,很随意
此外,在汇编中调用C的程序段,在MDK中不知道该怎么弄,在ADS中