risc-v中文社区

 找回密码
 立即注册
查看: 802|回复: 1

arm汇编最大公约数

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-10-12 15:08:20 | 显示全部楼层 |阅读模式
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作为返回值给调用者

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 05:26 , Processed in 0.015499 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表