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
        
原文地址:https://www.cnblogs.com/wzben/p/5487094.html