❶ 80C51指令系统中Rn与Ri有什么区别
arm汇编 和 arm C 混合编程 只支持一种 满递减堆栈 ,所以都是一样的
❷ 为什么要C和汇编混合编程
依我的看法,上面两位说的都不对:
一楼:汇编语言是低级语言直接往硬件的寄存器里写入东西:
其实C语言和汇编语言都一样,都会编译成二进制文件机器语言烧录到单片机中,所以没有一楼所说的区别
二楼:在C中也不会有数据损失的,如果你定义好数据类型的话。
单片机中是将C编译成汇编,然后根据汇编编译成机器语言---可执行文件;
其实单片机中经常在C中嵌入汇编,主要是因为时间的关系,因为一条汇编语言执行的时间都是可以知道的,而C指令执行的时间是不可知的,因为C编译器不一样,编译后的汇编也是不一样的,如果用汇编就不会有这种情况。所以在一些精确延时的场合,要嵌入汇编
另外,C的可移植性较强,不同的单片机里,功能要求相同的可以直接拿去用
总之,汇编是程序员可以自己翻译成机器语言的,所以单片机的运行是可以完全掌握的
❸ ARM单片机可以用汇编语言编程吗
ARM单片机程序可以用汇编语言进行编写。除去协处理器(高级的arm单片机才具有)的指令,常用的指令大致为MSR、MRS、LDR、STR、LDM、STM,ORR、BIC,TEST, ADD, SUB,MUL等指令。如果说想写一写汇编代码玩一下的话还行。原则上能用C语言则一定不会使用汇编。例如UBOOT的引导代码,linux内核的启动代码都是用汇编写的,本质是快速初始化以满足C程序的运行条件。除了特殊的寄存器(如CPSR)要用专用的汇编指令(MSR、MRS)外,对于读写寄存器操作一般使用LDR、STR指令,也就对应于C语言的通过指针访问内存。
在实际开发中,经常要读写寄存器。所以经常会使用到访存指令(ldr、str),以及各种逻辑操作(add、sub、bic、orr、and)。如果设置到使用栈暂存数据还需要ldm和stm指令。其实常用的也就这几个。因此,可以用汇编写单片机程序,但还是那句话,能用C语言则不要使用汇编。因为把C程序转化为汇编代码那是编译器做的事情。。。
❹ 嵌入式ARM 混合编程,汇编调用C语言,在线等
段定义前加 PRESERVE8 伪指令试一下。
前两天刚好看到 ARM UCOS 汇编代码中用到PRESERVE8这个关键字(加在段定义之前),以前没见过的,于是网络。
1.汇编代码没有保持8字节栈对齐而调用C或C++代码。
2.ADS下的代码用RVDS2.2编译时,即使已经8字节栈对齐,连接器也将之当作非8字节栈对齐。
所以要用伪指令指明一下。
E文不好,故而附原文以供参详:
where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment.
❺ 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语言更接近硬件而已。
❻ C/C++与汇编混合编程有什么好处
当需要C/C++与汇编混合编程时,可以有以下两种处理策略:
若汇编代码较短,则可在C/C++源文件中直接内嵌汇编语言实现混合编程。
若汇编代码较长,可以单独写成汇编文件,最后以汇编文件的形式加入项目中,通过ATPCS规定与C程序相互调用及访问。
后缀.S文件中的汇编指令是用armasm汇编器进行汇编的,而C语言程序中的内嵌汇编指令则是用内嵌汇编器进行汇编的。这两种汇编器存在一定的差异,所以在内嵌汇编时要注意以下几点。
2.3.1 小心使用物理寄存器
必须小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V标志位。因为计算汇编代码中的C表达式时,可能使用这些物理寄存器,并会修改N、Z、C、V标志位。
如计算:
y=x+x/y;
[cpp] view plain
1. __asm
2. {
3. MOV R0, x //把x的值给R0
4. ADD y, R0, x/y //计算x/y时R0的值会被修改
5. }
2.3.2 内嵌汇编程序中允许使用C变量
在计算x/y时R0会被修改,从而影响R0+x/y的结果。内嵌汇编程序中允许使用C变量,用C变量来代替寄存器R0可以解决上述问题。这时内嵌汇编器将会为变量var分配合适的存储单元,从而避免冲突的发生。如果内嵌汇编器不能分配合适的存储单元,它将会报告错误。
[cpp] view plain
1. int var;
2. __asm
3. {
4. MOV var, x //把x的值给R0
5. ADD y, var, x/y //计算x/y时R0的值会被修改
6. }
2.3.3 不需要保存和恢复用到的寄存器
对于在内嵌汇编语言程序中用到的寄存器,编译器在编译时会自动保存和恢复这些寄存器,用户不用保存和恢复这些寄存器。除了CPSR和SPSR寄存器外,其他物理寄存器在读之前必须先赋值,否则编译器会报错。
[cpp] view plain
1. int fun (int x)
2. {
3. __asm
4. {
5. STMFD SP!, {R0} //保存R0,先读后写,汇编出错
6. ADD R0, x, #1
7. EOR x, R0, x
8. LDMFD SP!, {R0} //多余的
9. }
10. return x;
11. }