c/汇编的混合编程
2017-03-20 19:12
134 查看
混合编程:
1.总的来说,链接的时候要指定入口【--ffirst start.o(Init)】-->这个主要是在Linker Miscs control里面填写,start.o是根据你所产生的文件名来改动。
2.在汇编代码里面最顶端要写上PRESERVE8,这是由于加上一条伪指令8字节对齐。
混合编程的方式:
1.当汇编代码比较少的时候,一般采用c语言内嵌汇编方法来实现。
2.当汇编代码较长的时候,一般写成函数调用的方式实现。
汇编调用c的时候:
1.import导入c语言的标号(函数名)。
汇编使用c语言定义的全局变量:
1.通过import导入标号。
比如:
import gival
ldr r0,=gival
ldr r1, [r0]
c语言调用汇编
1.是通过r0-r3传递的。
2.返回值是r0。
汇编:
通过export导入标号。
c外部声明该函数。(完整的函数原型。)
举例子:
使能中断:
main.c
[b]在状态寄存器中的I位就是IRQ的屏蔽位。当I=1时。则屏蔽IRQ中断,当I=0时,则允许中断。处理器复位后置I为1,关闭中断
[/b]
1.总的来说,链接的时候要指定入口【--ffirst start.o(Init)】-->这个主要是在Linker Miscs control里面填写,start.o是根据你所产生的文件名来改动。
2.在汇编代码里面最顶端要写上PRESERVE8,这是由于加上一条伪指令8字节对齐。
混合编程的方式:
1.当汇编代码比较少的时候,一般采用c语言内嵌汇编方法来实现。
2.当汇编代码较长的时候,一般写成函数调用的方式实现。
汇编调用c的时候:
1.import导入c语言的标号(函数名)。
汇编使用c语言定义的全局变量:
1.通过import导入标号。
比如:
import gival
ldr r0,=gival
ldr r1, [r0]
c语言调用汇编
1.是通过r0-r3传递的。
2.返回值是r0。
汇编:
通过export导入标号。
c外部声明该函数。(完整的函数原型。)
举例子:
使能中断:
main.c
PRESERVE8 area Init, code, readonly code32 entry start ;初始化工作 ldr sp, =0x40001000 ;栈顶 import giVal ldr r0, =giVal ldr r1, [r0] add r1, r1, #10 ; str r1, [r0] import testMain bl testMain ; 测试C修改后的asmVal ldr r0, =asmVal ldr r1, [r0] stop b stop export asmAdd asmAdd ;注意r0-r3不需要入栈保护,因为作为参数和返回值 stmfd sp!, {r4-r11, lr} add r0, r0, r1 ldmfd sp!, {r4-r11, pc} export stringcpy stringcpy stmfd sp!, {r4-r11, lr} ;r0 -> destStr ;r1 -> srcStr loop ldrb r4, [r1], #1 ; 读源字符串的字符 strb r4, [r0], #1 ; 存到目的数组中 cmp r4, #0 ; 判断字符串是否结束 bne loop ldmfd sp!, {r4-r11, pc} ; 注意数据段的地址是在ram里 area datasec, data, readwrite export asmVal asmVal dcd 0x11 end ;混合编程: ;链接时,要指定入口(--first start.o(Init)) ;在汇编代码的最顶端写PRESERVE8 ; 汇编调用C ; 1.import导入C语言的标号(函数名)start.s
PRESERVE8 area Init, code, readonly code32 entry start ;初始化工作 ldr sp, =0x40001000 ;栈顶 import giVal ldr r0, =giVal ldr r1, [r0] add r1, r1, #10 str r1, [r0] import testMain bl testMain ; 测试C修改后的asmVal ldr r0, =asmVal ldr r1, [r0] stop b stop export asmAdd asmAdd ;注意r0-r3不需要入栈保护,因为作为参数和返回值 stmfd sp!, {r4-r11, lr} add r0, r0, r1 ldmfd sp!, {r4-r11, pc} export stringcpy stringcpy stmfd sp!, {r4-r11, lr} ;r0 -> destStr ;r1 -> srcStr loop ldrb r4, [r1], #1 ; 读源字符串的字符 //将R1指向地址的字节数据存入R4,R1=R1+1 strb r4, [r0], #1 ; 存到目的数组中 cmp r4, #0 ; 判断字符串是否结束 bne loop ldmfd sp!, {r4-r11, pc} ; 注意数据段的地址是在ram里 area datasec, data, readwrite export asmVal asmVal dcd 0x11 end ;混合编程: ;链接时,要指定入口(--first start.o(Init)) ;在汇编代码的最顶端写PRESERVE8 ; 汇编调用C ; 1.import导入C语言的标号(函数名)
[b]在状态寄存器中的I位就是IRQ的屏蔽位。当I=1时。则屏蔽IRQ中断,当I=0时,则允许中断。处理器复位后置I为1,关闭中断
[/b]
相关文章推荐
- ARM裸机程序开发7(汇编与c混合编程)
- VxWorks中高精度实时时钟的实现及C语言汇编混合编程
- 嵌入式C语言和汇编语言的混合编程
- C/C++与汇编混合编程简介
- c和汇编混合编程
- C/C++与汇编混合编程简介
- ARM汇编, C语言和汇编混合编程
- c和汇编混合编程
- VxWorks中高精度实时时钟的实现及C语言汇编混合编程
- CCS下的C和汇编的混合编程
- 嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程
- 汇编与C的混合编程(数字振荡器的实现)
- C与汇编混合编程
- C和汇编混合编程
- C/C++ 与汇编混合编程 总结
- C/汇编的混合编程
- C 和 汇编语言的混合编程(实时控制TLC1549的实现)
- 关于C51与汇编的实用混合编程
- Linux0.11内核--汇编和C语言混合编程之参数传递