编写ARM汇编程序,完成两个64位数相加,结果存放在NUM单元

编写ARM汇编程序,完成两个64位数相加,结果存放在NUM单元,第1张

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汇编编程中如何指定某段程序的存储地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9269052.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存