计算机组成原理实验.docx
- 文档编号:26909196
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:26
- 大小:110.09KB
计算机组成原理实验.docx
《计算机组成原理实验.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验.docx(26页珍藏版)》请在冰豆网上搜索。
计算机组成原理实验
课程设计说明书
计算机组成原理算法实现〔五〕
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]反+1
d〕移码:
是符号位取反的补码,一般用做浮点数的阶码,引入的目的是为了保证浮点数的机器码为全0。
3.2.3定点整数的单符号位补码加减运算
进展定点整数单符号位补码加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进展具体操作。
操作时首先选择“输入〞按扭输入参与运算的数据,然后再选操作按扭。
如图3-6
图3-6定点整数补码加减
定点整数单符号位补码加减法的实现,输入按钮,删除所有数据并将光标移到第一个输入窗口里面,开始输入,注意是补码输入,实现定点整数加减法时,定义了一个carry[]数组记录每位的进位,carry[]最后一位初值为‘0’,carry[]长度比输入大1位,用多重选择语句嵌套使用,罗列两数第i位与上位进位的状况,输出结果记录在out[i]中,第i位进位记录在carry[i]中,当最高数值位进位与符号位进位不同时表溢出。
值得一提的是,加一个负数和减一正数时,都转化为加一个数的补码,由之前的算法保证,进展运算,其他保持不变。
注意的是,输入第二个数时,要注意字符串长度与第一个字符串长度保持一致,否如此将产生中断提醒请输入数值位长度相等的数字:
接下来的返回键与之前界面功能一样,回到主界面。
算法的原理:
〔1〕参加运算操作的数都用补码表示。
〔2〕数据的符号与数据一样参加运算。
〔3〕求差时将负减数求补,用求和代替求差,将减法运算转化为补码的加法运算。
〔4〕运算结果为补码。
如果符号位为0,明确运算结果为正;如果符号位为1,如此明确结果为负。
5〕符号位的进位为模值,应该去掉。
补码减法运算公式为:
[X]补–[Y]补=[X–Y]补(3.2)通过[Y]补求得[–Y]补可以将减法运算转化为补码的加法运算。
[Y]补求[–Y]补的法如此是:
对[Y]补各位〔包括符号位〕取反,末位加1,就可以得到[–Y]补例[Y]补=1.1011如此[–Y]补=0.0101[Y]补=0.1011如此[–Y]补=1.0101例4X=0.1100Y=0.0110求[X]补–[Y]补=?
解:
[X]补=0·1100[Y]补=0·0110[–Y]补=1·1010
溢出:
在定点数机器中,数的大小超出了定点数能表示的X围,叫溢出。
a〕在定点小数机中数的表示X围是-1 b〕在定点整数机〔8位〕中数的表示X围是-128 双符号位法: 将符号位扩展为2位,具体说就是对于正数两个符号位是“00〞,对于负数两个符号位是“11〞。 两个符号位都看作数码一样参加运算。 两个数相加后,其结果的符号位出现“01〞或“10〞两种组合时,表示发生溢出。 ①符号位“01〞,上溢出 ②符号位“10〞,下溢出 ③符号位“00〞或者“11〞,未溢出从[y]补求[-y]补的法如此是: 对[y]补“包括符号位求反且最末位加1〞,即可得到[-y]补。 3.2.4定点整数的一位原码乘法运算 进展定点整数原码乘法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进展具体操作。 操作时首先选择“输入〞按扭输入参与运算的数据,然后再选操作按扭。 如图3-7 图3-7定点整数原码乘法 设置输出数组out[]与进位标志数组carry[],carry[]最后一位初值为‘0’,carry[]长度比输入大1位。 对输入的两个字符串仿照并行乘法器的工作原理,将乘法转化为加法。 使用循环语句,按位相乘,再做原码加法。 由于是带一位符号位的原码乘法,要得到运算结果的符号位,就要对in1[0]和in2[0]进展判断: if((in1[0]=='0'&&in2[0]=='0')||(in1[0]=='1'&&in2[0]=='1'))signal="+";if((in1[0]=='0'&&in2[0]=='1')||(in1[0]=='1'&&in2[0]=='0'))signal="-";返回按钮。 算法的原理: 在定点计算机中,两个原码表示的数相乘的运算规如此是: 乘积的符号位由两数的符号位按异或运算得到,而乘积的数值局部如此是两个正数相乘之积。 设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个与门并行产生。 第二步: 列和的产生: 利用全加器 3.2.5浮点数的加减运算 进展定点整数单符号位补码加减法、定点整数原码乘法、浮点加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进展具体操作。 操作时首先选择“输入〞按扭输入参与运算的数据,然后再选操作按扭。 如图3-8 图3-8浮点加减法运算 数据输入分为阶码和尾数,将两个数的阶码和尾数对应的变形补码表示出来,比拟价码大小并完成对阶即小阶向大阶看齐,假如对阶时发生溢出如此发出提醒,统一阶码后,采用规格化进展尾数求和,对尾数进展舍入处理,判断尾数最末尾情况,用Replace语句实现粗略舍入处理。 最后进展变形补码复原。 算法的原理: 浮点数的加减法运算分为六个步骤: a〕0操作数检查 浮点加减运算过程比定点运算过程复杂。 如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进展后续的一系列操作以节省运算时间。 0操作数检查步骤如此用来完成这一功能。 参加加法运算的数据都是非零,进入下一步。 b〕比拟价码大小并完成对阶 为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。 两浮点数进展加减,首先要看两数的阶码是否一样,假如二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码一样,这个过程叫作对阶。 对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。 c〕尾数进展加减运算 对阶完毕后,即可进展尾数的求和运算。 不论加法运算还是减法运算,都按加法进展操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。 d〕结果规格化 ①采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1〔叫“右规〞〕。 ②如果尾数最高数值位与符号位一样,应将尾数左移,阶码减1,直至数值位最高位与符号位相反〔叫“左规〞〕。 e〕舍入运算 在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位局部会被丢掉,从而造成一定误差,要进展舍入处理。 简单的舍入方法有两种: 一种是“0舍1入〞法,即如果右移时被丢掉数位的最高位为0如此舍去,为1如此将尾数的末位做加加1运算。 另一种是“恒置1〞法,即只要数位被移掉,就在尾数的末尾恒置1。 f〕判断结果是否溢出 阶码为00011,阶码的符号位为00,根据补码的双符号检测溢出的方法确定阶码不溢出。 4、设计小结 通过这次的计算机组成原理的课程设计,把我很多不懂的内容又学习了一遍,又巩固了很多。 使我对计算机的认识有了更进一步的加深和认知。 在这为期一周的课程设计的期间内,在进展课程设计的过程中,我不仅巩固了以往所学过的知识,还学到了许多在课堂上所学不到的东西,比如动手能力,实际问题的解决能力和与团队中成员的团队协作与配合的能力,这都使我受益匪浅。 但是我自己有很多不会的知识点,有很大一局部是同学们告诉我的。 也有很多是自己在书本上学习到得当初在学习的时候并没有好好的学习所 在做这个的时候比拟困难。 经过了这次的课程设计,我想,对于我日后的计算机的相关的学习肯定会有诸多助益与影响,为将来的学习生活打下了坚实的根底。 以后在遇到这些就不会无从下手了。 参考文献 [1]白中英.计算机组成原理〔第五版〕[M].: 科学,2010. [2]吴萍.java程序设计(第一版)[M].: 清华大学2006. 附录 NewClass.java publicstaticvoidmain(Stringargs[]){ newNewclass("计算机组成原理");} publicvoidactionPerformed(ActionEvente) {Strings=newString("000");if(e.getSource()==button1) {while(i==0&&m<=3&&(! (text1.getText().equals("")))){if(text1.getText().equals(s)) {i=1; JOptionPane.showMessageDialog(this,"口令正确,请选择菜单栏的操作", "正确",JOptionPane.INFORMATION_MESSAGE); text1.setEnabled(false); text1.setVisible(false); a22.setVisible(true); a2.setVisible(false);}else{m++; JOptionPane.showMessageDialog(this,"您输入的口令不正确","警告", JOptionPane.WARNING_MESSAGE);text1.setText(null);}} if(m>3){ JOptionPane.showMessageDialog(this,"您三次口令错误,确定后退出! ","警告", JOptionPane.ERROR_MESSAGE);System.exit(0);}} if(i==1){if(e.getSource()==m1){Form2s1=newForm2(); s1.setVisible(true);}elseif(e.getSource()==m2){ Form3f1=newForm3();f1.setTitle("定点整数单符号位补码加减");f1.setVisible(true);}elseif(e.getSource()==m3){Form4f2=newForm4();f2.setTitle("定点整数补乘法");f2.setVisible(true);}elseif(e.getSource()==m4){Form5f5=newForm5();f5.setVisible(true);}}}} Form2.java publicvoidmouseClicked(MouseEvente){ ponent=null; if(e.getSource()==button2){ =(ponent)e.getSource(); e=SwingUtilities.convertMouseEvent(,e,this); Strings=text1.getText(); booleanboo=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);} }elseif(e.getSource()==button1){text1.setText("");} if(e.getSource()==button3){s=text1.getText(); booleanboo=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); chara[]=s1.toCharArray(); for(i=0;i<=a.length-1;i++){if(a[i]=='0') a[i]='1'; elseif(a[i]=='1') a[i]='0';} for(i=0;i<=a.length-1;i++){s1=String.valueOf(a);} text2.setText("-"+s1);}} if(e.getSource()==button4){ s=text1.getText(); booleanboo=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); chara[]=s1.toCharArray(); for(i=0;i<=a.length-1;i++){if(a[i]=='0') a[i]='1'; elseif(a[i]=='1') a[i]='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){=(ponent)e.getSource(); e=SwingUtilities.convertMouseEvent(,e,this); Strings=text1.getText(); booleanboo=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); chara[]=s1.toCharArray(); for(i=0;i<=a.length-1;i++){if(a[i]=='0') a[i]='1'; elseif(a[i]=='1') a[i]='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){=(ponent)e.getSource(); e=SwingUtilities.convertMouseEvent(,e,this); Newclasspp=newNewclass(null); setVisible(false); pp.setVisible(true);}}} For3.java publicvoidwindowClosing(WindowEvente){setVisible(false);}}); validate();} char[]bu(char[]in){ charc=in[0]; if(c=='1'){ charcarry='0'; inti; chartemp[]=in; for(i=1;i<=temp.length-1;i++){ if(temp[i]=='0') temp[i]='1'; elseif(temp[i]=='1') temp[i]='0';} if(temp[temp.length-1]=='0'){ temp[temp.length-1]='1'; carry='0';} elseif(temp[temp.length-1]=='1'){ temp[temp.length-1]='0';carry='1';} for(i=temp.length-2;i>=0;i--){ if(temp[i]=='0'&&carry=='0'){ temp[i]='0';carry='0'; }elseif(temp[i]=='0'&&carry=='1'){ temp[i]='1';carry='0'; }elseif(temp[i]=='1'&&carry=='0'){ temp[i]='1';carry='0'; }elseif(temp[i]=='1'&&carry=='1'){ temp[i]='0';carry='1';}} in=temp;} returnin;} char[]jia(char[]in1,char[]in2){ char[]out; charcarry[]=newchar[in1.length+1];inti=0; out=in1; carry[carry.length-1]='0';for(i=in1.length-1;i>=0;i--){if(in1[i]=='0'&&in2[i]=='0'&&carry[i+1]=='0'){ out[i]='0';carry[i]='0';} elseif(in1[i]=='0'&&in2[i]=='1'&&carry[i+1]=='0'){out[i]='1';carry[i]='0'; }elseif(in1[i]=='1'&&in2[i]=='0'&&carry[i+1]=='0'){out[i]='1';carry[i]='0'; }elseif(in1[i]=='1'&&in2[i]=='1'&&carry[i+1]=='0'){out[i]='0';carry[i]='1'; }elseif(in1[i]=='0'&&in2[i]=='0'&&carry[i+1]=='1'){out[i]='1';carry[i]='0'; }elseif(in1[i]=='0'&&in2[i]=='1'&&carry[i+1]=='1'){out[i]='0';carry[i]='1'; }elseif(in1[i]=='1'&&in2[i]=='0'&&carry[i+1]=='1'){out[i]='0';carry[i]='1'; }elseif(in1[i]=='1'&&in2[i]=='1'&&carry[i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 组成 原理 实验