计算机组成原理算法实现.doc

上传人:最*** 文档编号:1644434 上传时间:2019-11-01 格式:DOC 页数:30 大小:765KB
返回 下载 相关 举报
计算机组成原理算法实现.doc_第1页
第1页 / 共30页
计算机组成原理算法实现.doc_第2页
第2页 / 共30页
计算机组成原理算法实现.doc_第3页
第3页 / 共30页
点击查看更多>>
资源描述
计算机组成原理课程设计说明书(课题二)信 息 工 程 学 院目 录1 课程设计的目的12 设计内容与要求12.1 题目12.2 功能12.3 算法原理13 主要技术指标及特点43.1 登录窗体43.2操作界面73.3定点小数机器表示窗口界面93.4定点小数变形补码加减运算界面133.5定点小数的原码乘法界面163.6浮点数加减运算界面193.7帮助界面264 设计小结27参考文献28计算机组成原理算法实现(二)1 课程设计的目的 本课程设计是在学完本课程教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的计算机组成原理课程基本知识,进一步领会计算机组成原理的一些算法,并进行具体实现,提高分析问题、解决问题的综合应用能力2 设计内容与要求2.1 题目计算机组成原理算法实现(二) 2.2 功能能够实现定点小数的机器数表示、定点小数的变形补码加减运算、定点小数的原码一位乘法运算和浮点数的加减运算。2.3 算法原理数据表示方法: 计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式。(1)定点表示:约定机器中所有数据的小数点位置是固定的。由于约定在固定的位置,所以小数点就不再使用记号“.”来表示。 (2)浮点表示:定点数表示的数的范围有限,为了扩展数的表示范围,按照科学记数法表示数据的方式,任何一个二进制数N都可以表示成如下的格式:NM*2eM :尾数,是一个纯小数,决定数据的表示精度 e :指数,又称为阶码,是一个整数,决定数据的表示范围数的机器码表示: 一般书写所表示的数据称为真值,在计算机中为了表示符号位,通常把符号位和数字位一起编码来表示相应的数,形成了各种数据的存储和表示方法,这些编码称为机器码。常用的机器码有原码、反码、补码和移码。(1)原码:原码的数值部分是该数的绝对值,最高位表示符号位,最高位为0是正数,最高位为1是负数。(2)反码:正数的反码等于原码,负数的反码等于除符号位外其余二进制数码0变成1,1变成0。 正数: x反 = x原 = x 负数: 符号位不变,其余变反(3)补码:正数的补码等于原码,负数的补码等于反码加1。 正数: x补= x原 负数: x补= x反 +1定点加、减法运算:结论:任何两数的补码之和等于两数之和的补码v 补码加法 基本公式: x补 + y补 = x+y补 v 补码减法 基本公式: x补 - y补x补 + -y补 当负数用补码表示后,符号位作为数据的一部分一起参加运算,运算器不用考虑参加加法运算的操作数的正负以及结果的正负,任意数的加法就可以化作正数加法来实现。v 溢出:在定点数机器中,数的大小超出了定点数能表示的范围,叫溢出。(1)在定点小数机中数的表示范围是-1x1,如果运算过程中出现了大于1或者小于1的情况。(2)在定点整数机(8位)中数的表示范围是-128x127,如果运算过程中出现了大于127或者小于128的情况。双符号位法:将符号位扩展为2位,具体说就是对于正数两个符号位是“00”,对于负数两个符号位是“11”。两个符号位都看作数码一样参加运算。两个数相加后,其结果的符号位出现“01”或“10”两种组合时,表示发生溢出。 符号位“01”,上溢出 符号位“10”,下溢出 符号位“00”或者“11”,未溢出 从补求补的法则是: 对补“包括符号位求反且最末位加1”,即可得到补定点乘法运算 :在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示(定点整数也同样适用)被乘数 原f .n110 乘数 原f .n110 则乘积 原(ff)(0.n110)(0.n110) 式中,f为被乘数符号,f为乘数符号。 机器算法: 机器中一种方法是多次采用“加法移位”的方法来完成,称为串行乘法器,它的硬件结构简单,但是速度慢,目前广泛使用的是流水式阵列乘法器,称为并行乘法器。无符号数m乘以n会产生m*n个位积,出现m+n个列和,并行乘法器的关键是快速产生m*n个位积,对位积进行相加运算产生m+n个列和。第一步:位积的产生观察乘法运算:0*00,0*10,1*00,1*11 相当于:ab所以m*n个位积可以由m*n个与门并行产生。第二步:列和的产生:利用全加器浮点数的加减法运算: 浮点数的加减法运算分为六个步骤:(1)0操作数检查 浮点加减运算过程比定点运算过程复杂。如果判知两个操作数或中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。0操作数检查步骤则用来完成这一功能。 参加加法运算的数据都是非零,进入下一步。(2)比较价码大小并完成对阶 为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。 两浮点数进行加减,首先要看两数的阶码是否相同,若二数阶码不同,表示小数点位置没有对齐,此时必须使两个数阶码相同,这个过程叫作对阶。对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。(3)尾数进行加减运算 对阶结束后,即可进行尾数的求和运算。不论加法运算还是减法运算,都按加法进行操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。 (4)结果规格化 a. 采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1(叫“右规”)。 b. 如果尾数最高数值位与符号位相同,应将尾数左移,阶码减,直至数值位最高位与符号位相反(叫“左规”)。(5)舍入运算 在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位部分会被丢掉,从而造成一定误差,要进行舍入处理。简单的舍入方法有两种:一种是“0舍1入”法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位做加加1运算。另一种是“恒置1”法,即只要数位被移掉,就在尾数的末尾恒置1。(6)判断结果是否溢出根据补码的双符号检测溢出的方法确定阶码是否溢出。3 主要技术指标及特点 针对题目的各个功能要求,本人将程序分为一个主模块ZuCheng和六个子模块分别为Password、Show、Form3、Form4、Form5、Help。显然这是一个典型的使用模块化结构的程序。所有独立功能的部分都采用子模块结构,因为模块化设计使人一目了然。下面将介绍主模块和各子模块的运用特点和参数说明,并给出他们的流程图和主要Java代码。3.1 登录窗体口令输入错误时给出重新输入口令的提示三次口令输入错误被禁止使用Password模块流程图Password模块的主要Java代码public void actionPerformed(ActionEvent e) String s = new String(123if (e.getSource() = button1) while (i = 0 & m 3) JOptionPane.showMessageDialog(this, 您已被禁用, 错误对话框, JOptionPane.ERROR_MESSAGE);if (e.getSource() = button2) setVisible(false);if (i = 1) ZuCheng s1 = new ZuCheng(操作菜单);s1.setVisible(true);setVisible(false); 3.2操作界面通过ZuCheng主模块,调用Show、Form3、Form4、Form5、Help子模块。当选择对应子模块的按钮就可以调用各个子模块,而各子模块之间是相互独立的,下面用模块图来表示程序模块间的调用关系:(箭头起始处模块调用箭头指向处模块)Zucheng模块流程图Zucheng模块的主要Java代码public void actionPerformed(ActionEvent e)if(e.getSource()=m1)Show s1=new Show(机器数表示);s1.setVisible(true);else if(e.getSource()=m2)Form3 f1=new Form3();f1.setTitle(定点变形补码加减);f1.setVisible(true);else if(e.getSource()=m3)Form4 f2=new Form4(); f2.setTitle(定点原码乘法); f2.setVisible(true);else if(e.getSource()=m4)Form5 f5=new Form5(浮点加减);f5.setVisible(true);else if(e.getSource()=m5)Help h1=new Help(帮助信息);h1.setVisible(true);h1.work();3.3定点小数机器表示窗口界面 在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。输入一个带符号的二进制定点小数(如+0.11010或-0.010101)后,按“原码”、“反码”、“补码”或“移码”按扭中的任一个后,将在第二个文本框中显示对应的机器数,同时要求将第二个标签中“原码”字样改成对应的编码字样。选择“返回”按扭时回到主窗体。比如,用户输入-0.010101,执行相应的操作会出现相应的结果,如下列各图表示原码表示: 反码表示:补码表示: 移码表示:Show模块流程图Show模块的主要Java代码public void actionPerformed(ActionEvent e) if (e.getSource() = button1) me = 1; t1.requestFocusInWindow(); else if (me = 1) if (e.getSource() = button2) b3.setText(该数对应的原码为:); String sg = t1.getText(); if (sg.startsWith(+) int index = sg.indexOf(+); String ss = sg.substring(index + 1); t2.setText(ss); else int index = sg.indexOf(-); String ss = sg.substring(index + 1); String sf = ss.replaceFirst(0, 1); t2.setText(sf); else if (e.getSource() = button3) b3.setText(该数对应的反码为:); String sg = t1.getText(); if (sg.startsWith(+) int index = sg.indexOf(+); String ss = sg.substring(index + 1); t2.setText(ss); else int index = sg.indexOf(-); String ss = sg.substring(index + 1); char a = ss.toCharArray(); for (int i = 2; i a.length; i+) char m = 1, n = 0; if (ai = m) ai = n; else ai = m; String se = new String(a); String sf = se.replaceFirst(0, 1); t2.setText(sf); else if (e.getSource() = button4) b3.setText(该数对应的补码为:); String sg = t1.getText(); if (sg.startsWith(+) int index = sg.indexOf(+); String ss = sg.substring(index + 1); t2.setText(ss); else int index = sg.indexOf(-); String ss = sg.substring(index + 1); char a = ss.toCharArray(); for (int i = 2; i = 2; j-) if (aj - 1 = 0) aj - 1 = 1; aj = 0; break; else aj = 0; String se = new String(a); String sf = se.replaceFirst(0, 1); t2.setText(sf); else if (e.getSource() = button5) b3.setText(该数对应的移码为:); String sg = t1.getText(); if (sg.startsWith(+) int index = sg.indexOf(+); String ss = sg.substring(index + 1); String se = ss.replaceFirst(0, 1); t2.setText(se); else int index = sg.indexOf(-); String ss = sg.substring(index + 1); char a = ss.toCharArray(); for (int i = 2; i = 2; j-) if (aj - 1 = 0) aj - 1 = 1; aj = 0; break; else aj = 0; String sf = new String(a); t2.setText(sf); if (e.getSource() = button6) setVisible(false); 3.4定点小数变形补码加减运算界面 在此窗口用户需要输入两个定点小数来参加运算,同上面一样,用户必需点击输入按钮,才能激活输入框。输入完毕,用户点击各个按钮,则会出现相应的结果,比如,用户输入-0.11010和+0.01101,执行相应的操作会出现相应的结果,如下图表示 Form3模块流程图Form3模块的主要Java代码 /获得第一个数的补码public String work1() String sg = d1.getText(); System.out.print( sdf); if (sg.startsWith(+) int index = sg.indexOf(+); String ss = sg.substring(index + 1); ss1 = ss.replaceFirst(0, 00); else int index = sg.indexOf(-); String ss = sg.substring(index + 1); char a = ss.toCharArray(); for (int i = 2; i = 2; j-) if (aj - 1 = 0) aj - 1 = 1; aj = 0; break; else aj = 0; String se = new String(a); ss1 = se.replaceFirst(0, 11); return ss1;/做加法时获得第二个数的补码 public String work2() String sa = d2.getText(); if (sa.startsWith(+) int index = sa.indexOf(+); String ss = sa.substring(index + 1); ss2 = ss.replaceFirst(0, 00); else int index = sa.indexOf(-); String ss = sa.substring(index + 1); char b = ss.toCharArray(); for (int i = 2; i = 2; j-) if (bj - 1 = 0) bj - 1 = 1; bj = 0; break; else bj = 0; String sc = new String(b); ss2 = sc.replaceFirst(0, 11); return ss2;/做减法时获得第二个数的补码 public String work3() String sa = d2.getText(); if (sa.startsWith(-) int index = sa.indexOf(-); String ss = sa.substring(index + 1); ss2 = ss.replaceFirst(0, 00); else int index = sa.indexOf(+); String ss = sa.substring(index + 1); char b = ss.toCharArray(); for (int i = 2; i = 2; j-) if (bj - 1 = 0) bj - 1 = 1; bj = 0; break; else bj = 0; String sc = new String(b); ss2 = sc.replaceFirst(0, 11); return ss2; /实现两数补码相加 public String add1(char a1, char a2) char jg = new charr; char cf = 0; while (r 0) if (a1r - 1 = 0 & a2r - 1 = 0 & cf = 0) jgr - 1 = 0; cf = 0; else if (a1r - 1 = 0 & a2r - 1 = 0 & cf = 1) | (a1r - 1 = 0 & a2r - 1 = 1 & cf = 0) | (a1r - 1 = 1 & a2r - 1 = 0 & cf = 0) jgr - 1 = 1; cf = 0; else if (a1r - 1 = 0 & a2r - 1 = 1 & cf = 1) | (a1r - 1 = 1 & a2r - 1 = 0 & cf = 1) | (a1r - 1 = 1 & a2r - 1 = 1 & cf = 0) jgr - 1 = 0; cf = 1; else if (a1r - 1 = 1 & a2r - 1 = 1 & cf = 1) jgr - 1 = 1; cf = 1; else jgr - 1 = a1r - 1; r-; String result = new String(jg); return result; 3.5定点小数的原码乘法界面同样,在此界面用户必需要输入乘数和被乘数后执行乘法操作,输入前,用户必需要点击输入按钮才能接获输入框,如输入乘数为+0.1000,被乘数为+0.1101,执行相应的操作得出相应的结果,如下图Form4模块流程图Form4模块的主要Java代码/被乘数转化为原码形式 public String work1() String a1 = t1.getText(); if (a1.startsWith(+) int index = a1.indexOf(+); s1 = a1.substring(index + 1); else int index = a1.indexOf(-); String ss = a1.substring(index + 1); s1 = ss.replaceFirst(0, 1); return s1; /乘数转化为原码形式 public String work2() String a2 = t2.getText(); if (a2.startsWith(+) int index = a2.indexOf(+); s2 = a2.substring(index + 1); else int index = a2.indexOf(-);String ss = a2.substring(index + 1); s2 = ss.replaceFirst(0, 1); return s2;/实现两数的相加public String add1(char a1, char a2) int r = a1.length; char jg = new charr;char cf=0; while (r 0) if (a1r - 1 = 0 & a2r - 1 = 0 & cf = 0) jgr - 1 = 0; cf = 0; else if (a1r - 1 = 0 & a2r - 1 = 0 & cf = 1) | (a1r - 1 = 0 & a2r - 1 = 1 & cf = 0) | (a1r - 1 = 1 & a2r - 1 = 0 & cf = 0) jgr - 1 = 1; cf = 0; else if (a1r - 1 = 0 & a2r - 1 = 1 & cf = 1) | (a1r - 1 = 1 & a2r - 1 = 0 & cf = 1) | (a1r - 1 = 1 & a2r - 1 = 1 & cf = 0) jgr - 1 = 0; cf = 1; else if (a1r - 1 = 1 & a2r - 1 = 1 & cf = 1) jgr - 1 = 1; cf = 1; else jgr - 1 = 0; r-; result = new String(jg); return result; /实现两数的相乘 public String mul(String ss1, String ss2) char a = ss1.toCharArray(); char b = ss2.toCharArray(); int n1 = ss1.length(); int n2 = ss2.length(); char mul = new charn1 + n2 - 2; int m = mul.length; char temp1 = new charn1 + n2 - 4;char temp2 = new charn1 + n2 - 4; /实现积的符号位和小数点 if (a0 = b0) mul0 = 0; else mul0 = 1; mul1 = a1; for (int g = 0; g n1 + n2 - 4; g+) temp1g = 0; for (int g = 0; g = 2; y-) if (by = 1) ss1.getChars(2, n1, temp2, 0); else for (int g = 0; g = 2; i-) temp1i - 1 = temp1i - 2; if (cf = 0) temp10 = 0; else temp10 = 1; String g2 = new String(temp1); g2.getChars(0, g2.length(), mul, 2); String g3 = new String(mul); return g3; 3.6浮点数加减运算界面在此界面,用户需要输入两个浮点数的阶码和尾数,若用户输入的数中不包含正负号,则无法做出任务运算,当用户输入完数据后点击相应的按钮,则会出现具体的结果(本程序也包含了对溢出数据的检测),当然用户输入数据前同样要先点击输入按钮才会激活输入框按钮,如输入第一个浮点数的阶码是-101,尾数为+0.1101010,第二个浮点数的阶码是-100,尾数是-0.1011101,执行结果如下图Form5模块流程图Form5模块的主要Java代码public String dJ(String da, String db)/对阶 String cd; System.out.println(da: + da); System.out.println(db: + db); char w1 = da.toCharArray(); char w2 = db.toCharArray(); if (da.length() db.length() r = da.length() + 1; m = da.length() - db.length(); char c1 = new charda.length(); char d1 = new charda.length(); da.getChars(1, da.length(), c1, 1); c10 = w10; for (int i = 1; i m + 1; i+) d1i = 0; d10 = w20; db.getChars(1, db.length(), d1, m + 1); String s1 = work3(c1); System.out.println(s1: + s1); String s2 = work4(d1); System.out.println(s2: + s2); char c = new charr; char d = new charr; s1.getChars(0, s1.length(), c, 0); s2.getChars(0, s2.length(), d, 0); cd = this.add2(c, d); else r = db.length() + 1; m = db.length() - da.length(); char c1 = new chardb.length(); char d1 = new chardb.length(); for (int i = 1; i m + 1; i+) c1i = 0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!