ARM汇编 均值滤波实验
实验要求是排序后去掉最大值最小值,然后把剩下的求平均数。
排序可以用之前的冒泡排序,关键的问题是求平均数。因为ARM没有除法,应该怎么求平均数呢?
最简单的方法就是减法了,用被除数一直减除数,看减了多少次就可以了。
然而要四舍五入,因为寄存器都是整数,保留余数再和除数的一半比较,如果大于就进一,小于等于就忽略
所以把被除数加上除数的一半(向下取整)再循环减除数就行。
AREA EXAMPLE,CODE,READONLY ENTRY MOV R2,R0 LOOP_1 CMP R1,R0 BGE LOOP_3 ADD R1,R1,#1 SUB R2,R2,#1 MOV R3,#0 LDR R4,=0X40000000 B LOOP_2 LOOP_2 CMP R3,R2 BGE LOOP_1 ADD R3,R3,#1 LDR R5,[R4] LDR R6,[R4,#4] ADD R4,R4,#4 CMP R5,R6 BLS LOOP_2 SUB R4,R4,#4 STR R5,[R4,#4] STR R6,[R4] ADD R4,R4,#4 B LOOP_2 LOOP_3 LDR SP,=0X40000000 MOV R2,#0 STR R2,[SP] MOV R3,#4 MUL R3,R0,R3 SUB R3,R3,#4 STR R2,[SP,R3] MOV R3,#0 MOV R4,#0 MOV R5,#0 B LOOP_4 LOOP_4 CMP R2,R0 BGE LOOP_5 LDR R3,[SP,R4] ADD R5,R5,R3 ADD R4,R4,#4 ADD R2,R2,#1 B LOOP_4 LOOP_5 SUB R2,R0,#2; ADD R5,R2,LSR#1;除数的一半 MOV R1,#0 B LOOP_6 LOOP_6 CMP R5,R2 BLO LOOP_END ADD R1,R1,#1;把减的次数放在R1 SUB R5,R5,R2 B LOOP_6 LOOP_END NOP END