双符号位法:
将符号位扩展为2位,具体说就是对于正数两个符号位是“00”,对于负数两个符号位是“11”。
两个符号位都看作数码一样参加运算。
两个数相加后,其结果的符号位出现“01”或“10”两种组合时,表示发生溢出。
符号位“01”,上溢出 符号位“10”,下溢出 符号位“00”或者“11”,未溢出
从[y]补求[-y]补的法则是:
对[y]补“包括符号位求反且最末位加1”,即可得到[-y]补
在此窗口用户需要输入两个定点小数来参加运算,同上面一样,用户必需点击输入按钮,才能激活输入框。
输入完毕,用户点击各个按钮,则会出现相应的结果,比如,用户输入+0.1101和+0.1110,执行相应的操作会出现相应的结果,如下图表示
定点小数变形补码加减运算算法:
首先获取两个数的变形补码,获取补码的原则是:
首先判断是正数还是负数,如果是正数,则将“+”号去掉,然后将第一个“0”变成“00”;如果是负数,则将“-"号去掉,然后从低位向高位找,直到找到第一不为零的位置将第一个不为零的数后(包括第一个不为零的数)的所有数按位取反(包括符号位)。
然后在通过按位加运算计算两个数的值,如果是减法也转换成加法做。
3.4ymcf.java
定点小数的原码乘法
在定点计算机中,两个原码表示的数相乘的运算规则是:
乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。
设n位被乘数和乘数用定点小数表示
被乘数 [x]原=xf .xn-1„x1x0
乘数 [y]原=yf .yn-1„y1y0
则乘积 [z]原=(xf⊕yf)+(0.xn-1„x1x0)(0.yn-1„y1y0)
式中,xf为被乘数符号,yf为乘数符号。
机器算法:
机器中一种方法是多次采用“加法-移位”的方法来完成,称为串行乘法器,它的硬件结构简单,但是速度慢,目前广泛使用的是流水式阵列乘法器,称为并行乘法器。
无符号数m乘以n会产生m*n个位积,出现m+n个列和,并行乘法器的关键是快速产生m*n个位积,对位积进行相加运算产生m+n个列和。
第一步:
位积的产生
观察乘法运算:
0*0=0,0*1=0,1*0=0,1*1=1,相当于:
a∩b 所以m*n个位积可以由m*n个与门并行产生。
第二步:
列和的产生:
利用全加器
在此界面用户必需要输入乘数和被乘数后执行乘法操作,输入前,用户必需要点击输入按钮才能接获输入框,如输入乘数为0.10101,被乘数为+0.11100,执行相应的操作得出相应的结果
定点原码乘法:
乘数的每一位分别跟被乘数的每一位相乘001*1=1,1*0||0*1||0*0=0,其中小数点后面的第一位为两个数的符号运算。
乘数以及被乘数转化为原码形式正数直接操作,负数第一个由零变为1 。
浮点加减法根据阶码相同阶码则后面的尾数做加减运算,阶码不相同先把阶码转化为相同的阶码,同时改变的尾数做加减法运算。
按每一个界面的返回的时候就会转变为开始的界面。
3.5fdjj.java
浮点加减法的运算
浮点数的加减法运算分为六个步骤:
(1)0操作数检查
浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。
0操作数检查步骤则用来完成这一功能。
参加加法运算的数据都是非零,进入下一步。
(2)比较价码大小并完成对阶
为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。
两浮点数进行加减,首先要看两数的阶码是否相同,若二数阶码不同,表示小数点位置没有对齐,此时必须使两个数阶码相同,这个过程叫作对阶。
对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。
(3)尾数进行加减运算
对阶结束后,即可进行尾数的求和运算。
不论加法运算还是减法运算,都按加法进行操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。
(4)结果规格化
a. 采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1
b. 如果尾数最高数值位与符号位相同,应将尾数左移,阶码减1,直至数值位最高位与符号位相反
(5)舍入运算
在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位部分会被丢掉,从而造成一定误差,要进行舍入处理。
简单的舍入方法有两种:
一种是“0舍1入”法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位做加加1运算。
另一种是“恒置1”法,即只要数位被移掉,就在尾数的末尾恒置1。
(6)判断结果是否溢出
根据补码的双符号检测溢出的方法确定阶码是否溢出。
用户需要输入两个浮点数的阶码和尾数,若用户输入的数中不包含正负号,则无法做出任务运算,当用户输入完数据后点击相应的按钮,则会出现具体的结果(本程序也包含了对溢出数据的检测),当然用户输入数据前同样要先点击输入按钮才会激活输入框按钮,如输入第一个浮点数的阶码是+101,尾数为+0.10101,第二个浮点数的阶码是+100,尾数是-0.00011,执行结果如下
浮点数的加减法运算:
首先将两个浮点数用变形补码表示。
然后进行对阶运算,若两数的阶码相同,则可直接对两数的尾数进行加减运算,否则必须先使两数的阶码相同,原则是将阶码小的向阶码大的看起,再对阶码小的浮点数的尾数进行移位处理。
再将两个数的尾数进行求和,并进行规格化处理,规格化处理的原则是:
如果符号位是11并且小数点后的第一位也是1,则将尾数左移,直到小数点后的第一个数为0;如果符号位是00并且小数点后的第一个数是0,则进行左移处理,直到小数点后的第一个数为1;如果符号位是10或01,则将尾数右移一位。
最后进行舍入处理且判断溢出。
4设计小结
一周的课程设计报告结束了,计算机组成原理是一门理论性和实践性都很强的课程,这次的课程设计,一开始我拿到题目,只有一点是会的,其它看起来都很陌生,后来经过从网上找资料,去问学长,终于把程序做了出来,并且运行出来了。
但是,这次课程设计在整个的设计过程中也遇到了许多问题,老是运行不出正确的结果。
而且有很多时候为了找出一个错误,绞尽脑汁。
我的基本功不够扎实,Java语言运用不够熟练,平时很少自自己编写算法、上机运行和调试过,这值得自己认真反思一下,大学学习的自主性是很强的,自己平时的课余时间也是挺多的,要多去看看专业课程的书,努力提高自己的专业水平。
参考文献
[1]白中英.计算机组成原理(第五版)[M].北京:
科学出版社,2010.
[2]耿祥义、张跃平Jave2实用教程(第五版)[M].北京:
清华大学出版社,2017
附录:
源程序代码
Main.java
packagexiaoshu;
publicclassmain{
publicstaticvoidmain(String[]args){
Windowwin=newWindow();
}
}
Jqbs.java
packagexiaoshu;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
classDdxsextendsJFrameimplementsActionListener{
JLabellabel1,label3,label2;
JTextFieldf1,f2;
JButtonshuru,yma,fanma,buma,yima,fanhui;
publicDdxs(){
this.setBounds(400,100,600,400);
this.setLayout(null);
publicvoidactionPerformed(ActionEvente){
Strings1=f1.getText().trim();
if(e.getSource()==fanhui){
//win=Window();
this.dispose();
}
elseif(e.getSource()==shuru){
f1.setText(null);
f2.setText(null);
f1.requestFocusInWindow();
}elseif(e.getSource()==yma){
yuanma(s1);
label2.setText("该数对应的原码:
");
}elseif(e.getSource()==fanma){
fanma(s1);
label2.setText("该数对应的反码:
");
}elseif(e.getSource()==buma){
buma(s1);
label2.setText("该数对应的补码:
");
}elseif(e.getSource()==yima){
yima(s1);
label2.setText("该数对应的移码:
");
}
}
privatevoidyuanma(Strings1){
StringBuffers=newStringBuffer(s1);
if(s.charAt(0)=='+'){
s.setCharAt(0,'0');
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
Stringshu=s.toString();
f2.setText(shu);
}
elseif(s.charAt(0)=='-'){
s.setCharAt(0,'1');
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
Stringshu=s.toString();
f2.setText(shu);
}
}
privatevoidfanma(Strings1){
StringBuffers=newStringBuffer(s1);
if(s.charAt(0)=='+'){
s.setCharAt(0,'0');
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
Stringshu=s.toString();
f2.setText(shu);
}elseif(s.charAt(0)=='-'){
for(inti=s.length()-1;i>1;i--){
if(s.charAt(i)=='1'){
s.setCharAt(i,'0');
}elseif(s.charAt(i)=='0'){
s.setCharAt(i,'1');
}
}
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
s.setCharAt(0,'1');
Stringshu=s.toString();
f2.setText(shu);
}
}
privatevoidbuma(Strings1){
charjinwei='1';
StringBuffers=newStringBuffer(s1);
if(s.charAt(0)=='+'){
s.setCharAt(0,'0');
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
Stringshu=s.toString();
f2.setText(shu);
}elseif(s.charAt(0)=='-'){
s.setCharAt(0,'1');
for(inti=s.length()-1;i>1;i--){
if(s.charAt(i)=='1'){
s.setCharAt(i,'0');
}elseif(s.charAt(i)=='0'){
s.setCharAt(i,'1');
}
}
for(inti=s.length()-1;i>1;i--){
if(s.charAt(i)=='0'&&jinwei=='0'){
jinwei='0';
}elseif(s.charAt(i)=='0'&&jinwei=='1'){
jinwei='0';
s.setCharAt(i,'1');
}elseif(s.charAt(i)=='1'&&jinwei=='0'){
jinwei='0';
}elseif(s.charAt(i)=='1'&&jinwei=='1'){
jinwei='1';
s.setCharAt(i,'0');
}
}
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
Stringshu=s.toString();
f2.setText(shu);
}
}
privatevoidyima(Strings1){
StringBuffers=newStringBuffer(s1);
if(s.charAt(0)=='+')s.setCharAt(0,'0');
elseif(s.charAt(0)=='-')s.setCharAt(0,'1');
if(s.charAt
(1)=='0')s.deleteCharAt
(1);
charzgw=s.charAt(s.length()-1);
for(inti=s.length()-1;i>2;i--){
s.setCharAt(i,s.charAt(i-1));
}
s.setCharAt(2,zgw);
Stringshu=s.toString();
f2.setText(shu);
}
}
Bmjj.java
packagexiaoshu;
privatevoidjiafa(Strings1,Strings2){
Strings10=buma(s1);
Strings20=buma(s2);
StringBuffers11=newStringBuffer(s10);
StringBuffers22=newStringBuffer(s20);
charjinwei='0';
if(s11.length()>s22.length()){
for(inti=s11.length()-s22.length();i>0;i--){
s22.append('0');
}
}elseif(s11.length()for(inti=s22.length()-s11.length();i>0;i--){
s11.append('0');
}
}
//补位结束
for(inti=s11.length()-1;i>=0;i--){
if(s11.charAt(i)=='0'&&s22.charAt(i)=='0'&&jinwei=='0'){
jinwei='0';
}elseif(s11.charAt(i)=='0'&&s22.charAt(i)=='0'&&jinwei=='1'){
s11.setCharAt(i,'1');
jinwei='0';
}elseif(s11.charAt(i)=='0'&&s22.charAt(i)=='1'&&jinwei=='0'){
s11.setCharAt(i,'1');
jinwei='0';
}elseif(s11.charAt(i)=='0'&&s22.charAt(i)=='1'&&jinwei=='1'){
jinwei='1';
}els