arm编译器能编译c
⑴ ARM中c语言调用汇编程序,如何用ARM编译器调试啊,急!!!求大家帮助
编程的时候用ADS1.2就可以了,新建一个工程,把汇编的.s和C程序的.c都加进去,注意好程序的入口位置,然后编译,用AXD进行调试,查看内存,寄存器等值很方面
⑵ arm 汇编调用 C 函数问题
不同的编译器对C 函数的处理不同,如armcc和gcc就有很多不同,从你的代码来看,应该使用的是armcc编译器;
应注意到代码中涉及两次返回:函数返回和中断返回;
进入中断后,lr寄存器保存的是中断函数的返回地址,因此中断返回时出栈时将该返回地址赋给PC即可,这一点比较好理解;
但函数返回的问题比较复杂:
1.为什么不使用BL来调用C函数?
因为bl 指令跳转范围有限(好像4M左右吧),但bl指令可以将返回地址保存在lr中,当然,如果你的跳转范围不大,也可使用BL,则不需要ldr lr, =int_return 。
;而“ldr pc, =EINT_Handle”跳转范围为4G,但不会保存返回地址。
2. C函数使用 ldr pc, lr来实现返回,所以lr应预先保存好返回地址,即ldr lr, =int_return
⑶ arm编程与C语言的编程区别和方法
汇编主要是要了解CPU指令及用法,常说的是PC机的x86汇编,指令是x86的复杂指令集。缓冲
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。
C语言ARM的和x86的差不多,除了对硬件寄存器操作不同,其它语法和流程都一样。
arm汇编程序每一行是指定arm
core执行一条指令,每条指令都是硬件相关。
如:LDR
R3,
#1
;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的操作才与硬件相关;
如果用arm编译器来编译,每行可能编译出1到多条arm指令。
如:i++;
//变量
i
递增1等效于LDR
R3,#1
;
用LDR指令将数值1放入R3寄存器准备参与运算ADD
R2,
R2,
R3
;
用ADD指旁返令将R2、R3寄存器里的数值相加后放回R2寄存器以上等效汇编的R2、R3寄存器只是为了举例,运哪饥C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。
⑷ arm汇编怎么调用C程序
.global _C函数名
;然后在汇编里面
BL _C函数名
;注意调用的前.设置好堆栈就好了.
;当然..如果C函数是单独一个文件的话,,还是需要编译这个文件,
;并加入链接里面,如果写在其他文件里面的.makefile里面不需要额外的东西
范例汇编文件.调用C文件的..mycmp函数
xxxx.asm
.global _mycmp
BL _mycmp
yyyyy.c
void mycmp(void)
{}
⑸ ARM编程只用C语言不要汇编可以吗
可以的,但是c编译器最终会生成汇编代码的。