ARM汇编语言实现除法
- 格式:docx
- 大小:13.19 KB
- 文档页数:1


ARM的除法运算优化策略与传统的4/8位单片机相比,ARM的性能和处理能力是遥遥领先的。
但与之相应,ARM 的系统设计复杂度和难度,较之传统的设计方法也大大提升了,同时也大大拓展了针对ARM 芯片特性进行优化的空间,例如针对指令流水线的优化、针对寄存器分配进行的优化等。
ARM在硬件上不支持除法指令,编译器是通过调用C库函数来实现除法运算的,有许多不同类型的除法程序来适应不同的除数和被除数。
但直接利用C库函数中的标准整数除法程序,根据执行情况和输入操作数的范围,要花费20~100个周期,消耗较多的软件运行时间。
在实时嵌入式应用中,对时间参数较为敏感,故可以考虑如何优化避免除法消耗过多的CPU 运行时间。
除法和模运算(/和%)执行起来比较慢,所以应尽量避免使用。
但是,除数是常数的除法运算和用同一个除数的重复除法,执行效率会比较高。
在ARM中,可以利用单条MUL指令实现乘法操作。
本文将阐述如何用乘法运算代替除法运算,以及如何使除法的次数最少化。
1 避免除法运算在非嵌入式领域,因为CPU运算速度快、存储器容量大,除法操作通常都是不加考虑直接使用的。
但在嵌入式领域,首先需要考虑的是这些除法操作是否是必须的。
以对环形缓冲区操作为例,经常要用到除法,其实完全可以避免这些除法运算。
假定有一个buffer_size大小的环形缓冲区,,offset指定目前所在的位置。
通过increment字节来增加offset的值,一般是这样写的:0ffset=(Offset+increment)%buffer_size;效率更高的写法是:offset+=increment;if(offset>=buffer_size){offset-=buffer_size;}第一种写法要花费50个周期,而第二种因为没有除法运算,只须花费3个周期。
这里假定increment如果不能避免除法运算,那么就应尽量使除数和被除数是无符号的整数。
汇编语⾔系列之汇编实现简单数学运算⽬录1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:1.2设计思路:1.3程序清单:1.4程序运⾏结果及分析:2.计算N!2.1设计要求:2.2设计思路:2.3程序清单:2.4程序运⾏结果及分析:软件:emu8086语⾔:汇编语⾔(Assembly)注意:本⽂列出了两种算术运算的代码,全部代码为博主独⾃⼀⼈编写,会有瑕疵,谨慎使⽤。
1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。
数值N由加键盘输⼊,计算结果在显⽰终端输出。
设计要求:计算结果不超过⼗六位寄存器的存储能⼒,如有溢出提⽰错误。
1.2设计思路:输⼊N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为⼗六进制,通过除以10得到⼗进制,存⼊堆栈再依次输出。
1.3程序清单:DATA SEGMENTpkey DB 0dh,0ah,"pleas input N end by ';' :$"over DB 0AH,0DH,"overflow!",0dh,0ah,'$'result DB 0dh,0ah,'result is:','$'DAT1 DB 8 DUP(0)DATA ENDSSTACK SEGMENTSSTACK DB 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTATE:MOV AX,DATAMOV DS,AXLEA SI,DAT1 ;开辟缓冲区LEA DX,pkeyMOV AH,9INT 21H ;DOS功能调⽤,输出字符串LLP:MOV AH,1INT 21H ;DOS功能调⽤,输⼊N值SUB AL,2FHINC DX ;DX计数MOV [SI],AL ;将输⼊的数据存在SI缓冲区INC SICMP AL,0CH ;输⼊为封号结束输⼊JNZ LLPSUB SI,2CMP DX,02H ;DX不为2表⽰输⼊为两位数JNZ LLLPLLP1:MOV CX,1MOV BL,2 ;赋初始值JMP LPLLLP:MOV DI,SISUB DI,1SUB [DI],1MOV AL,10MUL [DI]ADD [SI],AX ;输⼊是两位数时⼗位乘10加个位SUB AH,AHJMP LLP1LP: MOV BH,[SI] ;把循环次数给BHMOV AL,BLINC BLMUL BL ;BL(加1)和AL(原值)相乘给AXADD CX,AX ;AX和CX相加给CX,通过循环实现累加JO OOF ;如果溢出重新输⼊CMP BH,BL ;判断是否达到N值JNZ LPMOV AX,CXMOV CX,0AHMOV BX,0LOP:MOV DX,0DIV CX ;AX表⽰的32位数除以10,商放在AX,余数放在DX INC BXADD DX,30HPUSH DX ;将余数依次压⼊栈CMP AX,0JNZ LOP ;商不为0继续除10LEA DX,resultMOV AH,9INT 21H ;DOS功能调⽤,输出字符串OUTPUT:POP DXMOV AH,2INT 21H ;DX中数据依次出栈并显⽰DEC BXJNZ OUTPUT ;出栈完成后停⽌JMP STATEOOF:LEA DX,overMOV AH,09HINT 21H ;DOS功能调⽤,溢出显⽰JMP STATECODE ENDSEND STATE1.4程序运⾏结果及分析:乘法和累加计算根据流程图⼀步步赋值即可得到,在输⼊两位数和结果转⼗进制输出时遇到了⿇烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输⼊两位时移位累加,输出除以10存⼊堆栈并依次输出显⽰。
单片机移位实现的乘除法一、乘法运算:乘法运算是指两个数相乘的操作。
在单片机中,可以通过移位运算和累加运算来实现乘法运算。
1.乘法基本原理:乘法运算的基本原理是将一个数转换为二进制表示,然后按位相乘再相加。
单片机中的乘法移位算法是指通过移位运算来实现乘法的操作。
2.移位运算:在计算机中,移位运算可以分为左移和右移两种操作。
左移是将数的二进制表示向左移动指定位数,右边空出的位用0补齐。
右移是将数的二进制表示向右移动指定位数,左边空出的位用0或1补齐,取决于原始数的符号位。
3.移位实现乘法的步骤:以下是使用移位实现乘法运算的步骤:-将第一个数转换为二进制表示。
-将第二个数转换为二进制表示,然后从低位开始逐位遍历。
-如果当前位为1,则将第一个数左移对应的位数,然后累加到结果中。
-继续遍历第二个数的下一位,重复上述操作。
-最后得到的结果就是两个数相乘的结果。
4.乘法示例程序:下面是一个使用移位实现乘法的示例程序:```c#include <stdio.h>int multiply(int num1, int num2)int result = 0;while (num2 != 0)if (num2 & 1)result += num1;}num1 <<= 1;num2 >>= 1;}return result;int maiint num1 = 5;int num2 = 6;int result = multiply(num1, num2);printf("Result: %d\n", result);return 0;```该程序中,multiply函数使用了移位运算和累加运算来实现两个数的乘法。
通过调用multiply函数,可以得到5和6相乘的结果,并输出到屏幕上。
二、除法运算:除法运算是指一个数除以另一个数的操作。
在单片机中,可以通过移位运算和减法运算来实现除法运算。