joe 发表于 2022-10-12 15:08:20

arm汇编最大公约数

C语言最大公约数算法:
int gcd(int a, int b)
{
        while (a != b)
        {
                if (a > b)
                        a = a - b;
                else
                        b = b - a;
        }
        return a;
}
在ARM架构中如何用汇编语言实现算法:有二种想法,一种是纯粹用跳转指令,一种是用条件执行指令
根据ATPCS规范,gcd函数中接收参数时:r0=a,r1=b
1)条件执行指令
gcd:       
        cmp r0,r1//r0-r1
        subgt r0,r0,r1 //gt带符号数大于则执行减法 如果a>b则a=a-b
        suble r1,r1,r0//a<=b时b=b-a,算术逻辑运算指令执行之后还更新CPSR中相应的条件标志位
        bne gcd
        b lr //只有r1==r0时才会到此句,并且寄存器r0作为返回值给调用者

joe 发表于 2022-10-12 15:19:40

2)纯粹用跳转指令
gcd:
        cmp r0,r1
        beq        end                //a==b相等则退出
        blt less        //a<b
        subs r0,r0,r1 //if(a>b) a=a-b 同时指令执行之后置相应标志位 其实也可以用sub r0,r0,r1
        b gcd
less:
        subs r1,r1,r0 //b=b-a 其实也可以用sub r1,r1,r0
        b gcd
end
页: [1]
查看完整版本: arm汇编最大公约数