淮海工学院计算机工程学院
实验报告书
课 程 名:《计算机组成原理》
题 目:实验二移位运算实验
班 级:^ ^
学 号:^ ^
姓 名:^ ^
1、目的与要求
验证移位运算控制的组合功能。
2、实验设备
ZYE1601B计算机组成原理教学实验箱一台,排线若干。
3、实验步骤与源程序
移位运算实验原理图如图5所示, 74LS299功能表如表1所示
1、移位操作:
(1)置数,具体步骤如图6所示。
2、移位,参照功能表改变S0 S1 T4 299-B的状态,按动微动开关KK2,观察移位的结果。
4、结果分析与实验体会
本次实验目的在于验证移位运算控制的组合功能。通过改变S0 S1 T4 299-B M的状态来观察在不同状态下数据的情况。实验由于脉冲按钮的缘故导致结果不太明显,但是经过仔细的推理,在得到的相邻两个结果加上所有实验应有的中间值就很容易 得到结果验证。
循环移位区别于一般移位的是移位时没有数位的丢失。
循环左移时,用从左边移出的位填充字的右端,而循环右移时,用从右边移出的位填充字的左侧。例如:11010101
循环左移:11010101——10101011——01010111——10101110——01011101——10111010——01110101——11101010——11010101
循环右移:11010101——11101010——01110101——10111010——01011101——10101110——01010111——10101011——11010101
带进位的就是把C位一起循环移动,把你想要的位(1或0)送进C,然后经过移位送到你想要的地方.(c=0)
带进位的循环左移:
C=0, 11010101——c=1,10101010——c=1,01010101——c=0,10101011——c=1,01010110——c=0,10101101——c=1,01011010——c=0,10110101——c=1,01101010——c=0,11010101
带进位的循环右移:
C=0, 11010101——c=1,01101010——c=0,10110101——c=1,01011010——c=0,10101101——c=1,01010110——c=0,10101011——c=1,01010101——c=1,10101010——c=0,11010101
试验体会:
由于实验设备的问题,本次实验很难做出来,不过大概的实验结果就是以上,自己感觉实验比较简单,就是仪器不太好,通过本次实验,我基本掌握了移位控制的实验原理。
第二篇:计算机系统组成与体系结构 实验二实验报告
HUNAN UNIVERSITY
课程实习报告
题 目寻找80x86指令格式中寻址方式字段的编码规律
学生姓名冯玉萍
学生学号20090830102
专业班级信息安全一班
完 成 日 期3月16日
一,实验步骤及分析
实验任务:
如前所述,8086/8088每条指令长1~6个字节,指令第1个字节为操作码主体加D位W位,第2个字节为寻址方式字段。在基本实验过程中,我们将第2~6字节全部固定为00。实际上,除单字节指令外,其余指令在寻址方式字段变化时,指令功能应该有变化。
一、当第2字节变化时,指令功能有何不同?应该如何研究?怎样才能形成一张包含寻址方式字段的完整指令表?请你自行设计实验方案并完成实验,并提交简洁明了,条例清晰的实验报告。
1、分析总结寻址方式字段的规律;
2、在你得到的指令全集中,有哪些是无意义的信息?
3、找出源操作数为立即寻址方式时的指令编码规律;
(1),分析总结寻址方式字段的规律
1380:0100 0000 ADD [BX+SI],AL //存储器寻址,没有位移量
1380:0100 004000 ADD [BX+SI+00],AL //存储器寻址,有8位位移量
1380:0100 00800000 ADD [BX+SI+0000],AL //存储器寻址,有16位位移量
1380:0100 00C0 ADD AL,AL //寄存器寻址
有这四个汇编语言可以知道,第二字节的高两位是用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址)。
1380:0100 0000 ADD [BX+SI],AL //存储器寻址,没有位移量
1380:0100 0008 ADD [BX+SI],CL
1380:0100 0010 ADD [BX+SI],DL
1380:0100 0028 ADD [BX+SI],CH
1380:0100 0020 ADD [BX+SI],AH
1380:0100 0030 ADD [BX+SI],DH
1380:0100 0038 ADD [BX+SI],BH
1380:0100 0018 ADD [BX+SI],BL
由上面的八个汇编语言可以看出,第二字节的3,4,5位是规定一个寄存器操作数。
1380:0100 0000 ADD [BX+SI],AL
1380:0100 0001 ADD [BX+DI],AL
1380:0100 0005 ADD [DI],AL
由上面可以看出第二字节的0,1,2位。R/M 字段受MOD 字段控制。若MOD=11,为寄存器方式,R/M 字段将指出第二操作数所在寄存器编号。MOD=00,01,10 为存储器方式,R/M 则指出如何计算存储器中操作数地址。
综上所述,得第二字节的格式如下:
(2),在你得到的指令全集中,有哪些是无意义的信息?
在得到的指令中当第一字节为FF,寻址方式字段由FC开使得到的指令是无意义的。
二、为了得到寻址方式字段的完整指令表,你一定使用了DOS的输入输出重定向功能,该输入文件的内容是完全人工输入的,其实这个.txt文件的内容是一些很有规律的debug命令,你能尝试编程序自动生成这个文件吗?(用任何你熟悉的语言编程)
算术运算指令:
ADD ADC INC AAA DAA .
SUB SBB DEC NEC CMP AAS DAS MUL IMUL AAM DIV IDIV AAD CBW CWD CWDE CDQ
数据传送指令:
MOV MOVSX MOVZX PUSH POP BSWAP
XCHG XADD XLAT IN OUT LEA
LDS LES LFS LGS LSS LAHF
SAHF
逻辑运算指令:
AND OR . XOR NOT TEST SHL SAL SHR SAR ROL ROR RCL RCR .
程序控制指令:
JMP CALL RET/RETF JAE/JNB. JB/JNAE JBE/JNA JG/JNLE JGE/JNL JL/JNGE JLE/JNG
JE/JZ JNE/JNZ JC JNC JNO
JNP/JPO JNS JO JP/JPE. JS LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ JCXZ JECXZ INT INTO IRET HLT . WAIT .
ESC LOCK NOP STC CLC
CMC STD CLD STI CLI
C语言程序如下所示:
#include
#include
main()
{
FILE *fp; //fp为指向文件的指针
fp=fopen("in1.txt","w"); //表示以写的方式打开文件
if(fp==NULL)
printf("file open error\n");
else
{
char ch[60]="e 100 00 00 00 00 00 00";
fprintf(fp,"%s\n",ch);
char ch1[20]="e 101 ";
char ch3[20]="u 100 105";
char b='q';
int i=0,n=0;
while(n<256)
{
fprintf(fp,"%s%x\n",ch1,n); //向文件中写入e 101 十六进制数
fprintf(fp,"%s\n",ch3); //向文件中写入u 100 105,表示反汇编100至105
n++;
}
fprintf(fp,"%c\n",b); //在文件末尾写入q,表示退出debug
fclose(fp); //关闭文件
}
}
在debug中利用重定向输入和输出将生成in1.txt和out1.txt,使得生成的out1.txt文件中是经过反汇编语言的代码。通过观察这些代码,我们也可以得到关于8086指令集的一些构成规律。
生成的两个文件如下所示:
三,实验日志
20##年4月16日 星期六
1,在完成基本要求之后,开始做了第一个较高要求,这个较高要求并不难,只是考察我们的分析和对8086汇编语言指令格式的掌握程度,我通过找到几组汇编语言指令,分析了第二字节寻址方式字段的规律,并且根据要求在汇编语言集中找到了一些无意义的指令和立即寻址的指令格式,便于我们今后的计算机组成的学习,通过亲自操作增加对8086格式的理解,增强对编码的熟悉。
2,做第二较高要求时,因为对C语言中文件部分掌握不扎实,一开始看题目是对文件的操作编C语言有些害怕了,但是后来随着自己一边看以前的C语言的书一边编程实现一些功能,最后终于用C语言实现了较高实验的要求。