位移指令实现乘法、除法计算

article/2025/10/7 8:23:42

前言

大家都知道51单片机是有乘法、除法指令的,不管是用C语言还是汇编语言,都是可以直接计算乘法、除法的,我以为+,-,*,/ 这些算术运算是单片机的标配,而我公司使用的应广单片机居然没有乘法、除法指令,应广单片机使用的是mini-C语言,和C语言有点像,可以在C代码中穿插汇编指令。但mini-C不支持for循环,也不支持函数传参,所以一下代码都没有传参,也没有for循环。

乘法

思路0

我们都知道左移1位(<<1)相当于乘2,左移2位(<<2)相当于乘4,但想乘3、乘5、乘6、乘7怎么办?
在已知要乘多少时,我们可以考虑这种方法

int a=13;
b=a<<1;//b=a*2
b=(a<<1)+a;//b=a*3
b=a<<2;//b=a*4
b=(a<<2)+a;//b=a*5
b=(a<<2)+a+a;//b=a*6
b=(a<<3)-a;//b=a*7
b=a<<3;//b=a*8
//.....

思路1

前面的方法显然不是我想找的,也不是你想找的,我需要一个实现乘法的功能:a×b,a是变量,b也是变量。
再想想,例如做9×4时,我们是如何计算除法的?相信大家首先想到的是乘法口诀“四九三十六” 那是中国人太聪明了有乘法口诀,若是老外计算,可能就是“nine plus nine equals eighteen, eighteen plus nine equals twenty seven …”,乘法的本质就是把n个数相加,所以写程序的时候做循环相加即可以实现乘法计算。

byte ma;//第一个因式,这里byte等价于unsigned char
byte mb;//第二个因式
word mc;//计算结果,这里word等价于unsigned int
void mult(void)
{mc=0;while(mb){mc+=ma;mb--;}
}

很好理解,mb是几,mc就循环加几次ma,但这个方法在比较耗时,例如2×100时,2+2+2+2+…+2,这里有100次加法运算。

思路2

小学乘法的竖式计算也同样适用于二进制
在这里插入图片描述

因为二进制只有0或1,ma×1=ma,ma×0=0;程序中只需要:
①判断被乘数mb的最低位,若为1则mc累加ma,为0则不累加(或累加0)
②让ma左移1位,mb右移1位
③再次回到①,直到mb变为0,运算结束

word ma;//第一个因式,计算结果也存放在ma
byte mb;//第二个因式
void mult(void)
{word t=0;while(mb){if(mb.0)//if(mb&0x01){t+=ma;}ma<<=1;mb>>=1;}ma=t;
}

对于上面是程序,大大减少了计算时间,最坏情况ma*11111111B需要循环8次,一共8次累加、8次左移、8次右移。
这个程序也可以做一点优化,先比较ma、mb的大小,用大的数乘以小的数。
这样可以让0000 0001B×1111 1111B这样的乘法更快计算完成。

if(mb>ma)
{t=mb;	mb=ma;	ma=t;
}
t=0;

除法

思路0

通过右移指令实现÷2、÷4、÷8等,但对于除以其他数却不行了。

思路1

和乘法一样,除法也可以理解为减法。
例如:16个苹果分给5个孩子

  1. 每个孩子拿1个,还剩16-5=11个
  2. 每个孩子再拿1个,还剩11-5=6个
  3. 每个孩子再拿1个,还剩6-5=1个
    这时不够每个孩子拿1个了,所以余数是1,每个人都有3个,所以商是3。
byte ma;//被除数、商
byte mb;//除数、余数
void div(void)
{byte n=0;while(ma>mb){ma-=mb;n++;}mb=ma;ma=n;
}

这个方法对于被除数大、除数小的情况会耗时比较久。
大家可以考虑一下除数为0会发生什么,该怎么解决。

思路2

同样使用除法竖式来帮助理解

在这里插入图片描述
被除数高位需要对齐除数低位,再比较被除数与除数的大小决定要不要商1,但程序似乎不好写。再来看另一张图片
在这里插入图片描述

先将除数左移字长-1bit,就可以低位对齐并且可以相减了。
对照图片中的思路应该很好理解下面的程序。

byte ma;//被除数、商
word mb;//除数、余数
void div(void)
{word t=0;byte i=8;mb<<=7;while(i--){t<<=1;if(ma>=mb){ma-=mb;t|=0x01;//之前写错了:temp|=0x01;}mb>>=1;}mb=ma;//余数ma=t;//商
}

http://chatgpt.dhexx.cn/article/0vUhoef4.shtml

相关文章

微机原理——移位指令

例题 思路 选择移位语句&#xff0c;右移&#xff0c;将AL移出的送入DX左端&#xff0c;将BL移出的送入DX左端。循环八次 MOV AL,01100101B; MOV BL,11011010B; XOR DX,DX;两个值相同&#xff0c;异或结果为0。等效&#xff1a;MOV DX,0 MOV CX,8;count L1: SHR AL,1;逻辑右…

汇编语言---移位指令

移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位; 移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在其后的CPU中,该立即数可以是定义域[1,31]之内的数…

汇编语言——移位指令

基本概念 移位操作指令&#xff1a;移位操作指令是一组经常使用的指令&#xff0c;属于汇编语言逻辑指令中的一部分&#xff0c;它包括移位指令&#xff08;含算术移位指令、逻辑移位指令&#xff09;&#xff0c;循环移位指令&#xff08;含带进位的循环移位指令&#xff09;&…

汇编指令之移位指令

移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。 格式为:xxx oper1,CL/1 ;移位次数只能是1或者存放在CL里面。 一、算术移位指令 1、算术左移指令SAL 功能&#xff1a;左移一次&#xff0c;最低位补0&#xff0c;最高位送入CF标志位&#xff0c;如图&am…

汇编指令(四)移位指令

学习概要 格式 移位指令主要分四种 一、逻辑移位指令 1.逻辑左移指令SHL 2.逻辑右移指令SHR 3.逻辑移位指令的功能 二、算术移位指令 1.算术左移指令SAL 2.算术右移指令SAR 最高位不变的意思就是&#xff0c;最高位原来是1&#xff08;0&#xff09;&#xff0c;右移过后…

【大学生软件测试基础】白盒测试 - 语句覆盖 - 03

任务1、依据源代码画出程序流程图&#xff1b; 任务2、根据程序流程图&#xff0c;找出程序的所有执行路径&#xff1b; 任务3、找出能覆盖所有语句的最少路径&#xff1b; 任务4、根据最少路径设计语句覆盖用例&#xff1b; 流程图&#xff1a; 任务2、根据程序流程图&…

修正的判定条件覆盖例题_语句覆盖、判断覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖、修正条件覆盖...

int function(bool a,bool b,boolc){intx; x=0;if(a&&(b||c)){x=1;returnx; } } 1、语句覆盖(SC) 选择足够多的测试数据,使得被测程序中的每条语句至少执行一次。 测试用例:a=T,b=T,c=T 2、判断覆盖(DC) 设计足够的测试用例,使得程序中的每个判定至少都获得一次真值…

语句覆盖,判定覆盖,条件覆盖,条件/判定覆盖,条件组合覆盖,路径覆盖

最近在复习软件测试的考试&#xff0c;每次到白盒测试这里都要为这几种逻辑覆盖方法感到头疼&#xff0c;这次终于决定好好整理出来。 逻辑覆盖是通过对程序逻辑结构的遍历实现程序的覆盖。它是一系列测试过程的总称&#xff0c;这组测试过程逐渐进行越来越完整的通路测试。 根…

软件测试培训之:白盒测试的语句覆盖法和判定覆盖法

白盒测试是相对于黑盒测试而言的&#xff0c;黑盒测试不关注程序内部的实现结构&#xff0c;仅仅是通过向程序进行输入来观察程序的输出对不对;白盒测试就需要关注程序内部的实现结构&#xff0c;对程序的逻辑结构实施相关的测试;那么下面来谈谈语句覆盖法、判定覆盖法和条件覆…

语句覆盖、判定覆盖、条件覆盖 - 白盒笔试题解析

1. 定义 黑盒测试 - 不关注内部结构的测试/基于输入输出的测试 白盒测试 - 基于内部结构的测试 白盒测试的关键&#xff1a; 覆盖度 2. 白盒相关概念 语句覆盖 - 设计一套测试 让被测对象中所有语句得到测试覆盖 判定覆盖 - 设计一套测试 让被测对象中所有判定得到测试覆…

白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基本路径覆盖)

语句覆盖&#xff1a;每条语句至少执行一次。 判定覆盖&#xff1a;每个判定的所有可能结果至少出现一次。&#xff08;又称“分支覆盖”&#xff09; 条件覆盖&#xff1a;每个条件的所有可能结果至少执行一次。 判定/条件覆盖&#xff1a;一个判定中的每个条件的所有可能结果…

白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)

白盒测试逻辑覆盖&#xff08;语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖&#xff09; 逻辑覆盖测试&#xff1a; 语句覆盖&#xff1a;每条语句至少执行一次判定覆盖&#xff1a;每一判定的每个分支至少执行一次条件覆盖&#xff1a;每一判定中的每个条件&…

白盒测试技术——语句覆盖、判定覆盖、条件覆盖

结合一个例子说&#xff1a; 画出相应的程序流程图&#xff0c;更方便分析&#xff1a; 首先我们要明确一点&#xff1a;测试用例要尽可能少。 1、语句覆盖&#xff1a;被测程序中每个语句至少执行一次 路径&#xff1a;s->a->b->c->d->e A2&#xff0c;B0&a…

语句覆盖、分支覆盖、谓词测试和路径覆盖

目录 语句覆盖分支覆盖&#xff08;判定覆盖&#xff09;谓词测试原子谓词覆盖&#xff08;条件覆盖&#xff09;分支-谓词覆盖(判定条件覆盖或分支条件覆盖)复合谓词覆盖&#xff08;条件组合覆盖&#xff09; 路径覆盖包含关系 语句覆盖 “语句覆盖”是一个比较弱的测试标准…

白盒测试 | 用例设计方法之语句覆盖

语句覆盖&#xff0c;顾名思义就是针对代码语句的嘛。它的含义是我们设计出来的测试用例要保证程序中的每一个语句至少被执行一次。通常语句覆盖被认为是“最弱的覆盖”&#xff0c;原因是它仅仅考虑对代码中的执行语句进行覆盖而没有考虑各种条件和分支&#xff0c;因此在实际…

逻辑覆盖测试(一)语句覆盖

语句覆盖&#xff1a; 设计测试用例时保证程序的每条语句至少执行一次。 简单来说&#xff0c;就是每个语句都覆盖一遍。 例子&#xff1a; 流程图如下&#xff1a; 测试用例如下&#xff1a; x4,z9&#xff0c;第一个if语句执行到了&#xff1b; x4,y7,第二个if语句为true…

设计测试用例实现语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖.

第一题&#xff1a; 设计测试用例实现语句覆盖,判定覆盖,条件覆盖&#xff0c;判定/条件覆盖,条件组合覆盖,路径覆盖. 【1】语句覆盖&#xff08;设计若干个测试用例&#xff0c;使程序中的每个可执行语句至少执行一次&#xff09; &#xff08;x>3&#xff09;&&&…

语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖

文章目录 语句覆盖判定覆盖条件覆盖条件--判定覆盖组合覆盖路径覆盖 逻辑覆盖率&#xff1a;语句覆盖<条件覆盖<判定覆盖<条件-判定覆盖<组合覆盖<路径覆盖 语句覆盖 基本思想&#xff1a;设计用例&#xff0c;使程序中的每个可执行语句至少执行一次。 每个可执…

软件测试 白盒测试用例设计方法动态 逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)基本路径测试法

文章目录 1 静态2 动态2.1 逻辑覆盖2.1.1 语句覆盖2.1.2 判定覆盖2.1.3 条件覆盖2.1.4 判定条件覆盖2.1.5 条件组合覆盖2.1.6 路径覆盖 2.2 基本路径测试法&#xff08;重点&#xff09; 小结 白盒设计方法分为静态和动态。 1 静态 静态的白盒测试方法有桌面检查、代码审查、代…

软件测试——语句覆盖

语句覆盖 一、定义&#xff1a; 程序中每一个语句至少能被执行一次 二、特点&#xff1a; 1、程序中每一个语句执行一次 2、对程序执行逻辑的覆盖率低&#xff0c;属于最弱的覆盖方式 3、无需测试程序的分支情况 4、无需测试程序分支判断的输入值以及输入值的组合 5、无需测试…