汇编作业三:判断倍数函数,判断质数函数以及素数求和函数的递进实现

在传参方面,都从R0寄存器开始按需往后使用
所以R0既承担传参责任,也负责接住最后函数的返回值。

1.汇编语言实现一个函数,判断a是否为b的倍数 (judge1)

个人设定:返回值(R0)为0->不是倍数
返回值(R0)为1->是倍数
实现的主要思路是利用a/b的结果会取整,在不是倍数的情况下,结果再乘以除数不会等于被除数。(当然如果被除数小于除数直接得到不是倍数的结论)

代码

在这里插入图片描述

老师的实现方式是通过加减法,看b+b+b…能不能等a。速度上应该更快些,但我不想loop太多次想在调试时能少点几次单步调试所以还是用了除法。
以下老师方法的c语言实现:

int Is_Multi(int a, int b) //这是老师的思路,和我的汇编实现不对应噢
    {
     int i = b; 2
     
     while (b <= a)
     {
      if (a == b)
      {
       return 1;
      }
      b = b + i;
     }
    
     return 0;
     
    }

运行结果:

a为4b为2时:在这里插入图片描述
结果R0如我们所期望,是1.
a为3,b为2时:
在这里插入图片描述
结果如我们所期望,返回0.

2.实现一个函数,判断一个数x是否为质数(judge2)

质数是除了1和它本身没有别的数能整除的数,所以对于一个数x,我们可以通过查看2到x-1有没有一个数,使x是它的倍数,这里我们就可以用上刚写的judge1了。如果最后都没有找到这样一个数,说明x是质数。(写C时候我们都知道我们可以把范围缩小到根号x,不过感觉汇编应该不会连开根的指令都有,所以还是老老实实2~x-1吧)

代码:

个人设定:返回值(R0)为0->不是质数
返回值(R0)为1->是质数

在这里插入图片描述
在这里插入图片描述

运行结果

当x为5,返回值为1,是质数(素数)
在这里插入图片描述
当x为4,返回值(R0)为0,不是质数:
在这里插入图片描述

3. 汇编语言实现100以内所有素数之和(judge3)

在实现了前两个函数后,遇到这个题的第一反应就是从2遍历到100,将使judge2返回1的数加起来。写起来也更简单。

代码:

参数只有一个,放在R0,最后返回值也是通过R0。
在这里插入图片描述
Gk,shadow_10,text_aHR0cHM6Ly9ibG9nLmN

运行结果:

我们先看10以内素数和是不是17:
在这里插入图片描述
0x11就是十进制的17,符合要求,再看看100(0x64)以内的结果:在这里插入图片描述

改良版

以下是老师提供的更快的方法,直接利用judge1判断是不是比自己小的素数的倍数:

代码:

c语言版:

int a[100] = {2}; //保存100以内所有的素数
    int i_a = 1; //下标,表示数组a中的元素个数
    int sum = 2; 
     for (x = 2; x <= 100; x++)
     {
      for (i = 0; i < i_a; i++)
      {
       if (x % a[i] == 0)
       {
        break;
       }
      }
      
      if (i == i_a)
      {
       a[i_a++] = x;
       sum += x;
      }
     }

汇编:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

运行结果

结果也是0x424,且看下方的memory还把素数存储了下来:
在这里插入图片描述

总结

老师说最后一题是企业面试题,且求的是一万以内的和。在三个函数的递进实现下感觉很简单,但要是直接做一万以内的第三题感觉还是会受挫的,答案能对可能也会超时,老师的改良版很厉害,我的思路还是太直接了,记笔记学习[抱拳]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值