MOV R0 #X;第一个立即数的低32位
MOV R1 #Y;第二个立即数的低32位
ADD R2 R1 R0;低位相加
MOV R0 #X>>32;第一个立即数的高32位
MOV R1 #Y>>32;第二个立即数的高32位
ADC R1 R0;带进位的高位相加
MOV R0 #NUM;内存单元NUM地址送入R0
STR R2 [R0];存储低32位结果
STR R1 [R0,#32];存储高32位结果
1用ARM汇编指令实现的C赋值语句:x=(a+b)-c,在进行运算之前,代码必须先把a、b、c的值装入到寄存器,运算结束后,还要把x的值存回存储器中。
2用ARM汇编指令实现的C语句:z=(a<<2)|(b&15)。
3在ARM汇编指令中实现下面条件转移语句:
if(a<b){
x=5;
y=c+d;
}
else
x=c-d;
在要指定代码的存储空间不是一件特别简单的事情,尤其是你想为某个或某几个函数指定具体的地址。
1,编译器只有在最终的Link阶段才会为代码和数据分配内存地址,因此指定代码段的地址一般是通过写一个link脚本来进行的。Link阶段时,编译器的Linker会读取你写的Link脚本,并且按照脚本的规定给代码分配地址。
2,根据ARM开发工具的不同,link脚本的语法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等开发工具都支持Link脚本。
如果你英文还可以,建议你直接找到开发工具的Help手册去研究。如果你英语实在不行,也可以把开发工具名称和你代码的具体情况告诉我,我帮你看看。
ARM编程或者单片机编程的调试,一般都需要查看CPU寄存器和内存。不知道你用的是什么编程环境,如果用Keil,调试工具多一点,有一个逻辑分析仪可以图形化显示需要观察引脚的输出波形。对于Keil的话, *** 作步骤如下:
1)进入Debug模式,菜单栏上“Debug->Start/Stop ”
2)然后在调试模式下,菜单栏上"View->Register Window",打开寄存器窗口,可以在调试的时候实时显示寄存器的变化情况。
3)菜单栏上"View->Analysis Windows->Logic Analyzer",打开逻辑分析仪,具体的使用方法自己再百度一下,这里就不细说了。同样在View(视图)下还可以打开其他的监视窗口,可以自己尝试一下。
4)在程序中设置断点,运行;或者按F11,单步执行也是可以的。
希望对你有所帮助吧,努力吧少年!
#define U8 unsigned char
#include <stringh>
#include <stdioh>
#define TRUE 1
#define FALSE 0
//#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
void my_strcat(const char str1, const char str2)
{
int ch1;
__asm
{
loop:
ldrb ch1, [str1], #1
cmp ch1,#0
bne loop
sub str1,str1,#1
loop2:
ldrb ch1, [str2], #1
strb ch1, [str1],#1
cmp ch1,#0
bne loop2
};
}
int main(void)
{
const char b = "Hello World!";
char a[30];
strcpy(a,"I am allright!");
printf("before strcat :b=%s\n",b);
__asm{
MOV R0, a
MOV R1, b
BL my_strcat, {R0, R1}
};
printf("after strcat :b=%s\n",b);
}
这个回答够标准了吧
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的体系结构,和8086体系结构(也就是《微机原理》主要讲的)不同,所以指令集上是有一些不同的,但是其实思想还是一样的。ARM汇编是对ARM处理器的控制。学习嵌入式的bootloader时,就会有很多行代码的汇编程序(基于ARM体系结构的),但是说实话,主要你能看懂,知道是怎么跳转执行的,就可以了!bootloader都是大公司里很多牛逼人,花几个月写的硬件初始化代码,你要是自己能写出来,并且好使,那你就NB了,年薪30万左右了,慢慢来吧!我也是才菜鸟,大家一起加油!
以上就是关于编写ARM汇编程序,完成两个64位数相加,结果存放在NUM单元全部的内容,包括:编写ARM汇编程序,完成两个64位数相加,结果存放在NUM单元、ARM汇编语言简单编程问题、在ARM汇编编程中如何指定某段程序的存储地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)