计算机组成原理实验.doc

上传人:最*** 文档编号:1672305 上传时间:2019-11-02 格式:DOC 页数:19 大小:155.86KB
返回 下载 相关 举报
计算机组成原理实验.doc_第1页
第1页 / 共19页
计算机组成原理实验.doc_第2页
第2页 / 共19页
计算机组成原理实验.doc_第3页
第3页 / 共19页
点击查看更多>>
资源描述
课程设计说明书计算机组成原理算法实现(五)1 课程设计目的本课程设计是在学完本课程教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的计算机组成原理课程基本知识,进一步领会计算机组成原理的一些算法,并进行具体实现,提高分析问题、解决问题的综合应用能力。2课程设计内容与要求 1、题目: 计算机组成原理算法实现(五)2、功能: 够实现机器数的真值还原(定点整数)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算。3 功能模块详细设计3.1 主窗体设计图3-1主界面图系统进入(主)窗体的设计:菜单需要在输入口令正确后方可激活使用。口令输入错误时要给出重新输入口令的提示,三次口令输入错误应该禁止使用。由于本次课程设计所用的语言是Java,在对应主窗口的主类中设计主窗口的样式,及个对应按钮的功能,根据指导书的内容布局各个Button,本次设计主窗口共有六个按钮,其中Button1对应确认,其余的分别对五个功能按钮。除此之外,各按钮标签都已在指导书中给出,留出白色的输入口令的窗口。运行程序的主界面如图3-3: 图3-3口令界面图3.2 主体功能NewClass.java该java文件为整个程序的主类。Form2.java实现机器数的真值还原(定点整数)Form3.java实现定点整数的单符号位补码加减运算、定点整数的Form4.java实现定点整数的原码乘法运算。Form5.java实现浮点数的加减运算。3.2.1定点整数真值还原点击主界面中的机器数真值还原按钮出现如图3-4界面 图3-4定点整数还原在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。输入一个机器数(如10010)后,按“原-真值”、“反-真值”、“补-真值”或“移-真值”按扭中的任一个后,将在第二文本框中显示对应操作的结果。选择“返回”按扭时将关闭此窗体。 定点表示:约定机器中所有数据的小数点位置是固定的。由于约定在固定的位置,所以小数点就不再使用记号“.”来表示。 一般书写所表示的数据称为真值,在计算机中为了表示符号位,通常把符号位和数字位一起编码来表示相应的数,形成了各种数据的存储和表示方法,这些编码称为机器码。常用的机器码有原码、反码、补码和移码。a)原码:原码的数值部分是该数的绝对值,最高位表示符号位,最高位为0是正数,最高位为1是负数。b )反码:正数的反码等于原码,负数的反码等于除符号位外其余二进制数码0变成1,1变成0。正数: x反 = x原 = x ;负数: 符号位不变,其余变反c)补码:正数的补码等于原码,负数的补码等于反码加1。正数: x补= x原 ;负数: x补= x反 +1d)移码:是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器码为全0。3.2.3定点整数的单符号位补码加减运算进行定点整数单符号位补码加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。如图3-6 图3-6定点整数补码加减定点整数单符号位补码加减法的实现,输入按钮,删除所有数据并将光标移到第一个输入窗口里面,开始输入,注意是补码输入,实现定点整数加减法时,定义了一个carry数组记录每位的进位,carry最后一位初值为0,carry长度比输入大1位,用多重选择语句嵌套使用,罗列两数第i位及上位进位的状况,输出结果记录在outi中,第i位进位记录在carryi中,当最高数值位进位与符号位进位不同时表溢出。值得一提的是,加一个负数和减一正数时,都转化为加一个数的补码,由之前的算法保证,进行运算,其他保持不变。注意的是,输入第二个数时,要注意字符串长度与第一个字符串长度保持一致,否则将产生中断提醒请输入数值位长度相等的数字:接下来的返回键与之前界面功能相同,回到主界面。算法的原理:(1)参加运算操作的数都用补码表示。 (2)数据的符号与数据一样参加运算。 (3)求差时将负减数求补,用求和代替求差, 将减法运算转化为补码的加法运算。 (4)运算结果为补码。如果符号位为 0 ,表明运算结果为正;如果符号位为 1 ,则表明结果为负。5 )符号位的进位为模值,应该去掉。 补码减法 运算公式为: X补Y补=XY补 (3.2) 通过 Y补 求得 Y补 可以将减法运算转化为补码的加法运算。 已知 Y补求 Y补 的法则是:对 Y补各位(包括符号位)取反,末位加1 ,就可以得到Y补 例 Y补 =1.1011 则 Y补 =0.0101 Y补 = 0.1011 则 Y补 =1.0101 例 4 X=0.1100 Y=0.0110 求 X补Y补 = ? 解: X补 =01100 Y补 =00110 Y补 =11010 溢出:在定点数机器中,数的大小超出了定点数能表示的范围,叫溢出。a)在定点小数机中数的表示范围是-1x1,如果运算过程中出现了大于1或者小于1的情况。b)在定点整数机(8位)中数的表示范围是-128x127,如果运算过程中出现了大于127或者小于128的情况。双符号位法:将符号位扩展为2位,具体说就是对于正数两个符号位是“00”,对于负数两个符号位是“11”。两个符号位都看作数码一样参加运算。两个数相加后,其结果的符号位出现“01”或“10”两种组合时,表示发生溢出。符号位“01”,上溢出符号位“10”,下溢出符号位“00”或者“11”,未溢出从补求补的法则是:对补“包括符号位求反且最末位加1”,即可得到补。3.2.4定点整数的一位原码乘法运算进行定点整数原码乘法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。如图3-7图3-7定点整数原码乘法设置输出数组out与进位标志数组carry,carry最后一位初值为0, carry长度比输入大1位。对输入的两个字符串仿照并行乘法器的工作原理,将乘法转化为加法。使用循环语句,按位相乘,再做原码加法。由于是带一位符号位的原码乘法,要得到运算结果的符号位,就要对in10和in20进行判断:if (in10 = 0 & in20 = 0) | (in10 = 1 & in20 = 1) signal = +; if (in10 = 0 & in20 = 1)| (in10 = 1 & in20 = 0) signal = -;返回按钮。算法的原理:在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。设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个与门并行产生。第二步:列和的产生:利用全加器3.2.5浮点数的加减运算进行定点整数单符号位补码加减法、定点整数原码乘法、浮点加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。如图3-8图3-8浮点加减法运算数据输入分为阶码和尾数,将两个数的阶码和尾数对应的变形补码表示出来,比较价码大小并完成对阶即小阶向大阶看齐,若对阶时发生溢出则发出提醒,统一阶码后,采用规格化进行尾数求和,对尾数进行舍入处理,判断尾数最末尾情况,用Replace语句实现粗略舍入处理。最后进行变形补码还原。算法的原理:浮点数的加减法运算分为六个步骤:a)0操作数检查浮点加减运算过程比定点运算过程复杂。如果判知两个操作数或中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。0操作数检查步骤则用来完成这一功能。参加加法运算的数据都是非零,进入下一步。b)比较价码大小并完成对阶 为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。 两浮点数进行加减,首先要看两数的阶码是否相同,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。c)尾数进行加减运算 对阶结束后,即可进行尾数的求和运算。不论加法运算还是减法运算,都按加法进行操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。d)结果规格化 采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1(叫“右规”)。 如果尾数最高数值位与符号位相同,应将尾数左移,阶码减,直至数值位最高位与符号位相反(叫“左规”)。e)舍入运算 在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位部分会被丢掉,从而造成一定误差,要进行舍入处理。 简单的舍入方法有两种:一种是“0舍1入”法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位做加加1运算。另一种是“恒置1”法,即只要数位被移掉,就在尾数的末尾恒置1。f)判断结果是否溢出 阶码为00 011,阶码的符号位为00,根据补码的双符号检测溢出的方法确定阶码不溢出。4、设计小结通过这次的计算机组成原理的课程设计,把我很多不懂的内容又学习了一遍,又巩固了很多。使我对计算机的认识有了更进一步的加深和认知。在这为期一周的课程设计的期间内,在进行课程设计的过程中,我不仅巩固了以往所学过的知识,还学到了许多在课堂上所学不到的东西,比如动手能力,实际问题的解决能力和与团队中成员的团队协作与配合的能力,这都使我受益匪浅。但是我自己有很多不会的知识点,有很大一部分是同学们告诉我的。也有很多是自己在书本上学习到得当初在学习的时候并没有好好的学习所在做这个的时候比较困难。经过了这次的课程设计,我想,对于我日后的计算机的相关的学习肯定会有诸多助益与影响,为将来的学习生活打下了坚实的基础。以后在遇到这些就不会无从下手了。 参考文献1 白中英. 计算机组成原理(第五版)M. 北京: 科学出版社, 2010.2吴萍. java程序设计 (第一版) M. 北京:清华大学出版社2006. 附录 NewClass.java public static void main(String args) new Newclass(计算机组成原理);public void actionPerformed(ActionEvent e) String s = new String(000);if (e.getSource() = button1) while (i=0&m 3) JOptionPane.showMessageDialog(this, 您三次口令错误,确定后退出!, 警告,JOptionPane.ERROR_MESSAGE);System.exit(0);if (i = 1) if (e.getSource() = m1) Form2 s1 = new Form2();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); Form2.java public void mouseClicked(MouseEvent e) Component com = null;if (e.getSource() = button2) com = (Component) e.getSource();e = SwingUtilities.convertMouseEvent(com, e, this); String s = text1.getText();boolean boo = s.startsWith(0, 0);if (boo = true) n1 = s.length();s1 = s.substring(1, n1);text2.setText(+ + s1); else n1 = s.length();s1 = s.substring(1, n1);text2.setText(- + s1); else if (e.getSource() = button1) text1.setText();if (e.getSource() = button3) s = text1.getText();boolean boo = s.startsWith(0, 0);if (boo = true) n1 = s.length();s1 = s.substring(1, n1);text2.setText(+ + s1); else n1 = s.length();s1 = s.substring(1, n1);char a = s1.toCharArray();for (i = 0; i = a.length - 1; i+) if (ai = 0)ai = 1;else if (ai = 1)ai = 0;for (i = 0; i = a.length - 1; i+) s1 = String.valueOf(a);text2.setText(- + s1);if (e.getSource() = button4) s = text1.getText();boolean boo = s.startsWith(0, 0);if (boo = true) n1 = s.length();s1 = s.substring(1, n1);text2.setText(+ + s1); else n1 = s.length();s1 = s.substring(1, n1);j = s1.lastIndexOf(1) + 1;s1 = s.substring(1, j);char a = s1.toCharArray();for (i = 0; i = a.length - 1; i+) if (ai = 0)ai = 1;else if (ai = 1)ai = 0;for (i = 0; i = a.length - 1; i+) s1 = String.valueOf(a);temp = s.substring(j, n1);text2.setText(- + s1 + temp);if (e.getSource() = button5) com = (Component) e.getSource();e = SwingUtilities.convertMouseEvent(com, e, this);String s = text1.getText();boolean boo = s.startsWith(0, 0);if (boo = false) n1 = s.length();s1 = s.substring(1, n1);text2.setText(+ + s1); else n1 = s.length();s1 = s.substring(1, n1);j = s1.lastIndexOf(1) + 1;s1 = s.substring(1, j);char a = s1.toCharArray();for (i = 0; i = a.length - 1; i+) if (ai = 0)ai = 1;else if (ai = 1)ai = 0;for (i = 0; i = a.length - 1; i+) s1 = String.valueOf(a);temp = s.substring(j, n1);text2.setText(- + s1 + temp);if (e.getSource() = button6) com = (Component) e.getSource();e = SwingUtilities.convertMouseEvent(com, e, this);Newclass pp = new Newclass(null);setVisible(false);pp.setVisible(true); For3.java public void windowClosing(WindowEvent e) setVisible(false););validate();char bu(char in) char c = in0;if (c = 1) char carry = 0;int i;char temp = in;for (i = 1; i = 0; i-) if (tempi = 0 & carry = 0) tempi = 0;carry = 0; else if (tempi = 0 & carry = 1) tempi = 1;carry = 0; else if (tempi = 1 & carry = 0) tempi = 1;carry = 0; else if (tempi = 1 & carry = 1) tempi = 0;carry = 1;in = temp;return in;char jia(char in1, char in2) char out;char carry = new charin1.length + 1; int i = 0;out = in1;carrycarry.length - 1 = 0;for (i = in1.length - 1; i = 0; i-) if (in1i = 0 & in2i = 0 & carryi + 1 = 0) outi = 0;carryi = 0; else if (in1i = 0 & in2i = 1 & carryi + 1 = 0) outi = 1;carryi = 0; else if (in1i = 1 & in2i = 0 & carryi + 1 = 0) outi = 1;carryi = 0; else if (in1i = 1 & in2i = 1 & carryi + 1 = 0) outi = 0;carryi = 1; else if (in1i = 0 & in2i = 0 & carryi + 1 = 1) outi = 1;carryi = 0; else if (in1i = 0 & in2i = 1 & carryi + 1 = 1) outi = 0;carryi = 1; else if (in1i = 1 & in2i = 0 & carryi + 1 = 1) outi = 0;carryi = 1; else if (in1i = 1 & in2i = 1 & carryi + 1 = 1) outi = 1;carryi = 1;if (carry0 != carry1) String temp = new String(溢出);out = temp.toCharArray();return out;char jian(char in1, char in2) if (in20 = 1) in2 = bu(in2);in20 = 0; else if (in20 = 0) in20 = 1;in2 = bu(in2);char o = jia(in1, in2); return o;public void actionPerformed(ActionEvent e) if (e.getSource() = button1) data.setText(null);data1.setText(null);data2.setText(null);data3.setText(null);data.requestFocusInWindow(); else if (e.getSource() = button2) first = data.getText();next = data1.getText();char out;char i1, i2;i1 = first.toCharArray();i2 = next.toCharArray();if (i1.length != i2.length)data1.setText(请输入数值位长度相等的数字!);else out = jia(i1, i2);output = new String(out);data2.setText(output); else if (e.getSource() = button3) first = data.getText();next = data1.getText();char out;char i1, i2;i1 = first.toCharArray();i2 = next.toCharArray();if (i1.length != i2.length)data1.setText(请输入数值位长度相等的数字!);else out = jian(i1, i2);output = new String(out);data3.setText(output); else if (e.getSource() = button4)new Newclass(null);setVisible(false); Form4.javapublic void windowClosing(WindowEvent e) setVisible(false););validate();char jia(char in1, char in2) char out;char carry = new charin1.length + 1; int i = 0;out = in1;carrycarry.length - 1 = 0;for (i = in1.length - 1; i = 0; i-) if (in1i = 0 & in2i = 0 & carryi + 1 = 0) outi = 0;carryi = 0; else if (in1i = 0 & in2i = 1 & carryi + 1 = 0) outi = 1;carryi = 0; else if (in1i = 1 & in2i = 0 & carryi + 1 = 0) outi = 1;carryi = 0; else if (in1i = 1 & in2i = 1 & carryi + 1 = 0) outi = 0;carryi = 1; else if (in1i = 0 & in2i = 0 & carryi + 1 = 1) outi = 1;carryi = 0; else if (in1i = 0 & in2i = 1 & carryi + 1 = 1) outi = 0;carryi = 1; else if (in1i = 1 & in2i = 0 & carryi + 1 = 1) outi = 0;carryi = 1; else if (in1i = 1 & in2i = 1 & carryi + 1 = 1) outi = 1;carryi = 1;return out;public void actionPerformed(ActionEvent e) if (e.getSource() = button1) data.setText(null);data1.setText(null);data2.setText(null);data.requestFocusInWindow(); else if (e.getSource() = button2) String s1 = data.getText();String s2 = data1.getText();String beichengshu = s1.substring(1);String signal = 0;String temp = null;char in1 = s1.toCharArray();char in2 = s2.toCharArray();if (in1.length != in2.length)data1.setText(请输入数值位长度相等的数字!);else if (in10 = 0 & in20 = 0)| (in10 = 1 & in20 = 1)signal = +;if (in10 = 0 & in20 = 1)| (in10 = 1 & in20 = 0)signal = -;int count = beichengshu.length() - 1;char c = new charcount + 1;for (int i = 0; i 0; i-) if (in2i = 0) stri = new String(c) +newString(c); else if (in2i = 1) stri = beichengshu + new String(c);for (int i = 1; i = beichengshu.length(); i+) int k;char buwei = new chari;for (k = 0; k i; k+)buweik = 0;stri = new String(buwei)+ stri.substring(0, stri.length() - i);temp = new String(c) + new String(c);char result = temp.toCharArray();for (int i = 1; i = 0; i-) if (a1i = 0 & a2i = 0 & ac = 0) a2i = 0;ac = 0; else if (a1i = 0 & a2i = 0 & ac = 1) a2i = 1;ac = 0; else if (a1i = 0 & a2i = 1 & ac = 0) a2i = 1;ac = 0; else if (a1i = 1 & a2i = 0 & ac = 0) a2i = 1;ac = 0; else if (a1i = 0 & a2i = 1 & ac = 1) a2i = 0;ac = 1; else if (a1i = 1 & a2i = 1 & ac = 0) a2i = 0;ac = 1; else if (a1i = 1 & a2i = 0 & ac = 1) a2i = 0;ac = 1; else if (a1i = 1 & a2i = 1 & ac = 1) a2i = 1;ac = 1; return new String(a2);public String jiemaQiubu(String s)if (s.startsWith(0) | s.startsWith(1) s = 00 + s;if (s.startsWith(+) s = 00 + s.substring(1)if (s.startsWith(-) String temp = s.substring(1, s.lastIndexOf(1);char c = temp.toCharArray();for (int i = 0; i c.length; i+) if (ci = 0)ci = 1;elseci = 0;temp = new String(c);s = 11 + temp + s.substring(s.lastIndexOf(1);return s;public String weishuQiubu(String s) if (s.startsWith(0) String str = s.substring(2).replaceAll(1, 0);s = 00 + s.substring(2) + str;if (s.startsWith(+) String str = s.substring(3).replaceAll(1, 0);s = 00 + s.substring(3) + str;if (s.startsWith(-) String temp = null, str = s.substring(3).replaceAll(1, 0);temp = s.substring(3, s.lastIndexOf(1);char c = temp.toCharArray();for (int i = 0; i c.length; i+) if (ci = 0)ci = 1;elseci = 0;temp = new String(c);s = 11 + temp + s.substring(s.lastIndexOf(1) + str;return s;public int toSubstract(String sj1, String sj2)int sum = 0, signal = 0;char cj2 = sj2.substring(0, sj2.lastIndexOf(1).toCharArray();for (int i = 0; i cj2.length; i+) if (cj2i = 0)cj2i = 1;elsecj2i = 0;sj2 = new String(cj2) + sj2.substring(sj2.lastIndexOf(1);String temp = calculate(sj1, sj2);if (temp.startsWith(00)signal = 1;temp = temp.substring(2);if (temp.startsWith(11)signal = -1;String str = temp.substring(2, temp.lastIndexOf(1);char c = str.toCharArray();for (int i = 0; i c.length; i+) if (ci = 0)ci = 1;elseci = 0;temp = new String(c) + temp.substring(temp.lastIndexOf(1); else JOptionPane.showMessageDialog(this, 对阶时溢出!, 错误,JOptionPane.ERROR_MESSAGE);int n = new inttemp.length();for (int i = 0; i = 0; i-) for (int j = i; j = i; j-) ni = ni * 2;for (int i = 0; i n.length; i+) sum = sum + ni;sum = sum * signal;return sum;public String bumaHuanyuan(String s)if (s.startsWith(00) s = + + s.substring(2); else if (s.startsWith(11) String temp = s.substring(2, s.lastIndexOf(1);char c = temp.toCharArray();for (int i = 0; i c.length; i+) if (ci = 0)ci = 1;Else ci = 0;temp = new String(c);s = - + temp + s.substring(s.lastIndexOf(1);return s;public String myAdd(String sj1, String sj2, String st1, String st2) String s = new String2;int n = 0, count = 0, len = (st1.length() - 2) / 2;n = toSubstract(sj1, sj2);if (n 0)for (int i = n; i 0)for (int i = 1; i 0)String temp = sj1.replaceAll(0, 1);temp = temp.substring(1) + 1;sj1 = calculate(sj1, temp);count-;while (count 0) String temp = sj1.replaceAll(1, 0);temp = temp.substring(1) + 1;sj1 = calculate(sj1, temp);count+;sj1 = bumaHuanyuan(sj
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板表格


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

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


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