mov al, [2000h]
sub al, 0fah
pushf
mov [3000h], al
mov al, [1000h]
popf
sbb al, 0
mov [3001h], al
int countCarryOver(int a,int b, int radix)
// 两个数相加,进位时本位的结果一定会小于两个数本位值
// 2+9=11, 本位结果1一定小于a,b的本位2,9,所以只要算出c有几个本位小于a,b本位应该就可以了。
{
int result = 0;
//首先计算结果c
int c = a+b;
//按进制取出最低位
int aLast,bLast,cLast;
while (c!=0)
{
aLast = a%radix;
bLast = b%radix;
cLast = c%radix;
a=a/radix;
b=b/radix;
c=c/radix;
if (cLast<aLast ||cLast<bLast)
result++;
}
return result;
}
算法是我自己理解的,不知道符合不符合情况。
当然一般人会按照我的说明,用十进制来理解,这里加了radix参数,是更加通用的理解方式。
不过我刚刚想到有的情况下,这样也会错,还需要更细化才行。
比如本位9,9,结果是8,但是如果前一位有进位1,程序结果就会错。
所以,最终的那个判断条件还要细化分析。
#include <iostream>
using namespace std;
int main()
{
int a,b,tmp,i;
char op;
cin>>a>>op>>b;
int num1[2],num2[2],ans[3];
num1[0]=a%10;
num1[1]=a/10;
num2[0]=b%10;
num2[1]=b/10;
tmp=0;
if(op=='+')
{
ans[0]=num1[0]+num2[0];
if(ans[0]>9)
{
tmp=ans[0]/10;
ans[0]%=10;
}
ans[1]=num1[1]+num2[1]+tmp; //tmp用来记录进位
if(ans[1]>9)
{
tmp=ans[1]/10;
ans[1]%=10;
ans[2]=tmp;
}
else ans[2]=0;
}
if(op=='-')
{
if(a<b)
{
ans[2]='-';
ans[0]=num2[0]-num1[0];
if(ans[0]<0)
{
ans[0]+=10;
tmp=1;
}
ans[1]=num2[1]-num1[1]-tmp;
}
else
{
ans[0]=num1[0]-num2[0];
if(ans[0]<0)
{
ans[0]+=10;
tmp=1;
}
ans[1]=num1[1]-num2[1]-tmp;
ans[2]=0;
}
}
tmp=0; //tmp用来标记是否为第一个0
for(i=2;i>=0;i--)
{
if(ans[i]==0)
{
if(tmp==1)
{
cout<<ans[i];
}
if(i==0&&tmp==0) cout<<ans[i];
}
else
{
if(ans[i]!='-')
cout<<ans[i];
else cout<<"-";
tmp=1;
}
}
cout<<endl;
return 0;
}
1
连接实验电路并检查无误。
带进位运算实验接线图
2
打开电源开关。
3
用输入开关向暂存器DR1和DR2置数,方法与344相同:
a)
用输入开关向暂存器DR1置数:
拨动输入开关形成二进制数01100101(或其它数值)。(数据显示灯亮为0,灭为1)。
使SWITCHUNIT单元中的开关SW-B=0(打开数据输入三态门)、
ALU-B=1(关闭ALU输出三态门)、
《计算机组成原理》实验报告正文用纸
2
LDDR1=1、LDDR2=0。
按动微动开关KK2,则将二进制数01100101置入DR1中。
b)
用输入开关向暂存器DR2置数。
拨动输入开关形成二进制数10100111(或其它数值)。
SW-B=0、ALU-B=1保持不变,
改变LDDR1、LDDR2:使LDDR1=0、LDDR2=1,
按动微动开关KK2,则将二进制数10100111置入DR2中。
4
关闭数据输入三态门(SW-B=1),
打开ALU输出三态门(ALU-B=0),
使LDDR1=0、LDDR2=0,关闭寄存器。
5
对进位标志清零:CLR=1→0→1(每次计算前都要对进位标志清零,实验板
上“SWITCH
UNIT”单元中的CLR开关为标志CY、ZI的清零开关,它为零时是清零状态,所以将此开关做1→0→1 *** 作,即可使标志位清零)。
注意:
本实验中运算结果是否产生进位、结果是否为0是根据进位指示灯CY和零标志指示灯ZI的状态来判断的。
进位标志指示灯CY亮(cy=0)时表示进位标志为假[此时运算没有产生进位];标志指示灯CY灭(cy=1)时表示进位标志为真[此时运算产生了进位]。
零标志指示灯ZI灯亮时表示零标志为假[此时运算结果不为“0”],灯灭时表示零标志为真[此时运算结果为“0”]。
6
验证带进位运算及进位锁存功能。
置Cn=1、AR=0,然后进行带进位算术运算:
例如做加法运算,使ALU-B=0,S3、S2、S1、S0、M和状态依次为1、0、0、1、0,此时数据总线上显示的数据为DR1加DR2加当前进位标志的和,但此时的进位状态位还没有打入进位锁存器中(它是要靠T4节拍来打入的)。这个结果是否有进位产生,则要按动微动开关KK2,若进位标灯亮,则无进位,反之则有进位。因为做加法运算时,数据总线一直显示的数据为DR1+DR2+CY,所以当有进位输入到进位锁存器后,总线显示的数据将为加上当前进位锁存器中锁存的进位的结果。
进位加法,数学运算的一种,加法的一种。例如十进制时,一位上的数相加过十,则在此位上写相加得数的个位,向下一位进十位上的数。
以个位向十位进位为例:基数为10(2进制的基数是2,类推),个位这个数位上的数量达到了10的情况下,则个位向前一位进1,成为一个十。
在十进制的算法中,个位满十,在十位中加1;十位满十,在百位中加一。
在二进制的算法中,个位满二,在十位中加1;十位满二,在百位中加一。
以此类推。
计算
在大多数计算机中,算术运算(或从移位 *** 作中移出的位)的最高有效位的进位置于特殊进位位中,该进位位可用作多精度运算的进位或测试并用于控制计算机程序的执行。相同的进位位也通常用于指示减法中的借位,尽管由于二进制补码运算的影响,该位的含义被反转。
通常,进位位值“1”表示加法溢出ALU(加法器),并且在添加长度大于CPU的数据字时必须加以说明。对于减法 *** 作,采用两个(相反)约定,因为大多数机器在借位时设置进位标志,而某些机器(例如6502和PIC)则以借位(反之亦然)重置进位标志。
以上就是关于设计一个汇编语言程序,用AL寄存器实现带进位的加减法运算。假如1000H地址的数据内容为…急求答案全部的内容,包括:设计一个汇编语言程序,用AL寄存器实现带进位的加减法运算。假如1000H地址的数据内容为…急求答案、c语言,计算加法进位次数的题目、求救 用C++ 编一个关于加减法 进位退位运算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)