ARM汇编实现简单的加法运算
2012-12-04 12:11
344 查看
对于初学者来说,这个程序还是能学到很多东西的。另外,对要学汇编的同学说一句,就算是选修课做作业,也不要觉 得几行就写完很容易,光在纸上写,实际运行的时候语法问题上还是很多的。我做这个作业用的是Keil的RealView MDK测 试, ARM9平台。 题目:将内存中从0x400800开始的100个字数据相加,其结果存于R3、R2中(R3中为高32位)。 分析:看起来很简单有木有!!假象啊,假象,一上手才知道涉及到很多细节内容,比如读存储器,循环计数,加法溢出, 还要注意是100个字数据,每个字32位(ARM9中)。单独说这三个关键点很容易想到,LDR——读存储器内容;ADD——加法; B——跳转实现循环。但是光着三点是远远不够的,下面贴上我写的代码分享一下: [code] AREA code, CODE, READONLY ;声明代码段 ENTRY CODE32 START MOV R0, #0x0 ;置R0初值为0,虽然调试模拟是是置为0,但是要考虑实际情况 MOV R4, #count ;R4里存储循环次数 LDR R1, =start ;将初始存储器地址放到R1中 LOOP LDR R0, [R1, #step]! ;将R1中地址里的数据放到R0中,并且R1自增一个步长,指向下一个32位字数据 ADDS R2, R0, R2 ;R2+=R0,低32位累加到R2中,并修改状态寄存器,就是当出现加法溢出时,C置位 ADCCS R3, R3, #0x0 ;加法溢出时,即C = 1时,R3+=C,即溢出的高位累加到R3中 SUBS R4, #0x1 ;计数器减一,并修改状态寄存器,若当R4减为0时,状态寄存器位Z置零 BNE LOOP ;循环次数未达到时,即检查状态寄存器位Z = 0时,结束循环,否则跳转到循环开头 AREA data, DATA, READONLY ;声明数据段 start EQU 0x400800 step EQU 0x10 count EQU 100 END 寄存器及变量使用说明: R0:每次从存储器读出来的数据放到R0; R1:存储下一个将要读取的存储器的地址; R2:存储计算结果低32位(包括中间结果); R3:存储计算结果高32位(包括中间结果); R4:存储循环次数; 三个变量的设置是为了程序有更好的扩展性, start:存储器起始地址 step:每次读取存储器后,R1向后移动步长,这个值是固定的0x10就是移动32位; count:循环次数 程序说明: 这个程序本来可以写的更复杂一点,比如用到MRS去取状态寄存器,通过与或移位等操作判断C、Z等状态位的值,但是这样显然 增加了代码的复杂度。为了减少代码量,我增加了很多条件码,可以看到,循环部分几乎每句都是条件码。条件码,顾名思义, 有if在内,如果不用条件码,那就是很多判断语句嵌入其中,代码真的会冗长低效,以上是我所能写出的最简代码,这个程序让 我了解到条件码和状态寄存器搭配使用的绝妙之处,希望同学习汇编的同志们互相交流。
[/code]
本文出自 “驿落黄昏” 博客,请务必保留此出处http://yiluohuanghun.blog.51cto.com/3407300/1078140
相关文章推荐
- C语言中嵌入汇编语言实现简单的加法
- 汇编调用C语言 实现简单加法计算
- 线性代数·矩阵的加法减法乘法运算简单实现
- C++编程->汇编内联实现加法运算
- 用javascript的下拉列表菜单中选中所需要运算的数值来实现简单的加法运算
- 位运算实现加法的一个简单例子
- C++编程->汇编内联实现加法运算
- ARM汇编程序---ARM汇编实现简单判断环习题
- ARM 汇编实现简单的向量乘
- 用ARM汇编实现64位数据的运算
- 用ARM汇编实现64位数据的运算
- ARM指令--adc 实现64位加法运算
- 栈的应用,实现简单的不带括号的四则运算
- Java实现两个复数的加法运算
- 位运算实现加法
- 关于Django模板不能运算的临时解决办法 在Django 模板template 中实现加法,减法,乘法,除法运算
- [2017-AspNet-MVC4] 简单加法的演化-3-采用Model技术添加一个减法运算
- ARM汇编程序---通过LDMFD/STMFD实现R0-R6寄存器的数据的交换
- 使用运算符重载实现复数的加法运算
- PHP实现的简单四则运算计算器功能示例