计组-实验
实验1
1.实验目的
信息的二进制表示
使用C语言,依次输出以下几个变量在内存中存放的二进制形式,数字自行设置(注意不要和“将数字转换成二进制”的算法搞混,要求的是输出变量自身在计算机中存储的二进制形式)
(1)一个int型的正数
(2)一个int型的负数
(3)一个float型的正数
(4)一个float型的负数
(5)一个char型的字符
输出变量的二进制形式后,请结合课本内容分析,为何输出的是该结果。
2.实验背景知识与原理
相关知识点:补码、浮点数、ASCII码
3.实验过程与实验结果分析
简要用自己的话说明实验过程,提供实验结果并作出说明
#include<stdio.h>
#include<string.h>
void printBinaryDigitInt(int n)
{
printf("%d的储存形式是:", n);
for (int i = 0; i < 32; i++)
printf("%d", (n & (1u << (31 - i))) != 0 ? 1 : 0);
putchar('\n');
}
void printBinaryDigitFloat(float* pf)
{
printf("%f的储存形式是:", *pf);
int n = *(int*)pf;
int sizeOfBits = sizeof(int) * 8;
for (int i = sizeOfBits - 1; i >= 0; i--)
printf("%d", n & (1 << i) ? 1 : 0);
printf("\n");
}
void printBinaryDigitChar(char ch)
{
printf("%c的储存形式是:", ch);
for (int i = 0; i < 8; i++)
printf("%d", (ch & (1u << (7 - i))) != 0 ? 1 : 0);
putchar('\n');
}
int main()
{
int a = 1, b = -1;
float c = 1, d = -1;
char e = 'a';
printBinaryDigitInt(a);
printBinaryDigitInt(b);
printBinaryDigitFloat(&c);
printBinaryDigitFloat(&d);
printBinaryDigitChar(e);
}
实验结果
1的储存形式是:00000000000000000000000000000001
-1的储存形式是:11111111111111111111111111111111
1.000000的储存形式是:00111111100000000000000000000000
-1.000000的储存形式是:10111111100000000000000000000000
a的储存形式是:01100001
4.实验心得体会与建议
整数的原码 = 整数的补码
负数的补码:(原码)->(反码)->(反码+1)
负数的原码:(补码-1)->最高位符号位别动其余均转反码
浮点数的二进制表示:
1.符号部分(S) 0正1负
2、阶码部分(E)(指数部分):
对于float型浮点数,指数部分8位,考虑可正可负,因此可以表示的指数范围为-127 ~ 128
对于double型浮点数,指数部分11位,考虑可正可负,因此可以表示的指数范围为-1023 ~ 1024
3、尾数部分(M):
浮点数的精度就是由尾数部分决定的,对于float型浮点数,尾数部分23位,换算成十进制就是 2^23=8388608,所以十进制精度只有6 ~ 7位;
对于double型浮点数,尾数部分52位,换算成十进制就是 2^52 = 4503599627370496,所以十进制精度只有15 ~ 16位
实验2
1.实验目的
- 了解运算器的组成结构
(2)掌握运算器的工作原理
2.实验背景知识与原理
本实验的原理如图1-1-1所示。
运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A和B的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM),各部件对操作数进行何种运算由控制信号S3...S0和CN来决定,任何时候,多路选择开关只选择三部件中一个部件的结果作为ALU的输出。如果是影响进位的运算,还将置进位标志FC,在运算结果输出前,置ALU零标志。ALU中所有模块集成在一片CPLD中。
逻辑运算部件由逻辑门构成,较为简单,而后面又有专门的算术运算部件设计实验,在此对这两个部件不再述。移位运算采用的是桶形移位器,一般采用交叉开关矩阵来实现,交叉开关的原理如图1-1-2所示。图中显示的是一个4X4的矩阵(系统中是一个8X8的矩阵)。每一个输入都通过开关与一个输出相连,把沿对角线的开关导通,就可实现移位功能,即:
-
对于逻辑左移或逻辑右移功能,将一条对角线的开关导通,这将所有的输入位与所使用的输出分别相连,而没有同任何输入相连的则输出连接0。
-
对于循环右移功能,右移对角线同互补的左移对角线一起激活。例如,在4位矩阵中便用"右1和"左3对角线来实现右循环1位。
-
对于未连接的输出位,移位时使用符号扩展或是0填充,具体由相应的指令控制。使用另外的逻辑进行移位总量译码和符号判别。
运算器部件由一片 CPLD 实现。ALU 的输入和输出通过三态门74LS245 连到 JCPU
内总线上,另外还有指示灯标明进位标志FC 和零标志 FZ。 请注意:
实验箱上凡丝印标注有马蹄形标记
,表示这两根排针之间是连通的。图中除T4和CLR,其余信号均来自于
ALU单元的排线座,实验箱中所有单元的T1、T2、T3、T4
都连接至控制总线单元的T1、T2、T3、T4,CLR 都连接至CON 单元的CLR 按钮。T4
由时序单元的 TS4 提供 (时序单元的介绍见附录二),其余控制信号均由CON
单元的二进制数据开关模拟给出。 控制信号中除
T4为脉冲信号外,其余均为电平信号,其中 ALUB为低有效,其余为高有效。
暂存器A和暂存器B 的数据能在LED灯上实时显示, 原理如图 1-1-3所示
(以A0为例,其它相同) 进位标志FC、 零标志FZ和数据总线D7..1
DO的显示原理也是如此
ALU和外围电路的连接如图1-1-4所示,图中的小方框代表排针座。
运算器的逻辑功能表如表1-1-1所示,其中S3S2S1S0CN为控制信号,FC为进位标志,FZ为运算器零标志,表中功能栏内的FC、FZ表示当前运算会影响到该标志。
3.实验过程与实验结果分析
-
按图1-1-5连接实验电路,并检查无误。图中将用户需要连接的信号用圆圈标明(其它实验相同)。

-
将时序与操作台单元的开关KK2置为'单拍'档,开关KK1、KK3置为'运行'档。
-
打开电源开关,如果听到有'嘀'报警声,说明有总线竞争现象,应立即关闭电源,重新检查接线,直到错误排除。然后按动CON单元的CLR按钮,将运算器的A、B和FC、FZ清零。
-
用输入开关向暂存器A置数。
①拨动CON单元的SD27.SD20数据开关,形成二进制数01100101(或其它数值),数据显示亮为'1',灭为'0'。
②置LDA=1,LDB=0,连续按动时序单元的ST按钮,产生一个T4上沿,则将二进制数01100101置入暂存器A中,暂存器A的值通过ALU单元的A7..A0八位LED灯显示。 -
用输入开关向暂存器B置数。
①拨动CON单元的SD27..SD20数据开关,形成二进制数10100111(或其它数值)。
②置LDA=O,LDB=1,连续按动时序单元的ST按钮,产生一个T4上沿,则将二进制数10100111置入暂存器B中,暂存器B的值通过ALU单元的B7.B0八位LED灯显示。 -
改变运算器的功能设置,观察运算器的输出。置ALUB=O、LDA=O、LDB=O,然后按表1-1-1置S3、S2、S1、S0和Cn的数值,并观察数据总线LED显示灯显示的结果。如置S3、S2、S1、S0为0010,运算器作逻辑与运算,置S3、S2、S1、S0为1001,运算器作加法运算。如果实验箱和P℃联机操作,则可通过软件中的数据通路图来观测实验结果(软件使用说明请看附录一),方法是:打开软件,选择联机软件的"【实验】一【运算器实验",打开运算器实验的数据通路图,如图1-1-6所示。进行上面的手动操作,每按动一次ST按钮,数据通路图会有数据的流动,反映当前运算器所做的操作,或在软件中选择"【调试】一【单节拍",其作用相当于将时序单元的状态开关KK2置为'单拍'档后按动了一次ST按钮,数据通路图也会反映当前运算器所做的操作。
重复上述操作,并完成表1-1-2。然后改变A、B的值,验证FC、FZ的锁存功能。

实验结果:

4.实验心得体会与建议
本实验使我更加了解运算器的组成结构,也让我掌握了运算器的工作原理。
实验3
1.实验目的
汇编语言实验
-
分别使用串处理指令和循环指令,完成字符串比对汇编程序,比对结果存入变量result。若两个字符串相同,result
= 1,否则result = 0; -
使用反汇编指令,显示两个程序代码段在内存中的存放方法。说明两个程序在内存的长度有何区别
-
程序执行完成后,显示数据段中的存储情况,并标注两个字符串与结果的存放位置。
2.实验背景知识与原理
相关知识点:汇编语言,反汇编指令。
3.实验过程与实验结果分析
;分别使用串处理指令和循环指令,完成字符串比对汇编程序
;比对结果存入变量result。若两个字符串相同,result = 1,否则result = 0;
DATAS SEGMENT
BUF1 DB 20,?,20 DUP('$')
BUF2 DB 20,?,20 DUP('$')
LEN1 DW 20
LEN2 DW 20
RESULT DB '0'
INPUTA DB 'PLEASE ENTER BUF1 $'
INPUTB DB 'PLEASE ENTER BUF2 $'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
;-------------------------------------------- input1
MOV DX,OFFSET INPUTA
MOV AH,09H
INT 21H
mov dl,0ah ;换行
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
;-------------------------------------------- 输入
LEA DX,BUF1
MOV AH,10 ;输入
INT 21H
mov dl,0ah ;换行
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
;-------------------------------------------- inputb
MOV DX,OFFSET INPUTB
MOV AH,09H
INT 21H
mov dl,0ah ;换行
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
;-------------------------------------------- 输入
LEA DX,BUF2 ;输入
MOV AH,10
INT 21H
mov dl,0ah ;换行
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
;--------------------------------------------
MOV CX,LEN1 ;将长度存入CX 中
CMP CX,LEN2 ;比较字符串长度
JNZ NO
MOV SI,OFFSET BUF1
MOV DI, OFFSET BUF2
REPE CMPSB ;逐个比较
JZ YES ;CX为零时跳出循环,说明两字符串相等
NO: MOV RESULT,'0' ;CX不为零时跳出循环
JMP L
YES:MOV RESULT,'1'
;--------------------------------------------
L:
MOV DL,RESULT;显示比较结果
MOV AH,02
INT 21H
;--------------------------------------------
MOV AH,4CH
INT 21H
CODES ENDS
END START
实验结果:
4.实验心得体会与建议
配置了实验环境,并学会了使用汇编语言软件进行运行与调试。
实验4
1.实验目的
使用两个子程序,完成进制转换实验,实验要求如下
定义一个变量a=156,一个8字节的DB型数组变量Bin_Arr,一个2字节的DB型数组Hex_Arr.
-
子程序1:将a转换为8位二进制数10011100,并存入Bin_Arr中(每个字节单元存1位'1'或'0')。
-
子程序2:将Bin_Arr中的二进制数转换为两位16进制数9CH,以ASCII码'9'与'C'的形式分别存到Hex_Arr的两个字节中
2.实验背景知识与原理
相关知识点:汇编语言
3.实验过程与实验结果分析
;使用两个子程序,完成进制转换实验,实验要求如下
;定义一个变量a=156,一个8字节的DB型数组变量Bin_Arr,一个2字节的DB型数组Hex_Arr.
;(1)子程序1:将a转换为8位二进制数10011100,并存入Bin_Arr中(每个字节单元存1位‘1’或‘0’)。
;(2)子程序2:将Bin_Arr中的二进制数转换为两位16进制数9CH,以ASCII码‘9’与‘C’的形式分别存到Hex_Arr的两个字节中
DATAS SEGMENT
A DB 156
BIN_ARR DB 8 DUP (0)
HEX_ARR DB 0,0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,A
CALL PRO1 ;子程序1
MOV AL,A
CALL PRO2 ;子程序B
MOV AH,4CH
INT 21H
;-------------------------------------------- 子程序1
PRO1 PROC ;入口参数AL
LEA SI,BIN_ARR ;SI指向BIN
MOV CX,8 ;八次
L1:
MOV DL,0 ;清零DL
SHR AL,1 ;右移一次
ADC DL,30H ;DL加30H转ASCII,再加CF的值
MOV [SI],DL
INC SI
LOOP L1
RET
PRO1 ENDP
;-------------------------------------------- 子程序2
PRO2 PROC ;入口参数AL
MOV BL,AL ;
AND BL,0FH ;高四位清零了
CMP BL,9 ;
JBE L2 ;<=
ADD BL,07H ;
L2:
;"A"的ASCII码是41H,它和0AH差了37h,因此要加7,再加30h。
;小于10的数字变成字符只要加30h就行了,大于等于10h的数字要加37h
ADD BL,30H ;
MOV HEX_ARR,BL ;送数据
MOV CL,4 ;
SHR AL,CL ;高四位挪入低四位
CMP AL,9 ;
JBE L3 ;
ADD AL,07H
L3:
ADD AL,30H
MOV HEX_ARR+1,AL
RET
PRO2 ENDP
CODES ENDS
END START
;使用两个子程序,完成进制转换实验,实验要求如下
;定义一个变量a=156,一个8字节的DB型数组变量Bin_Arr,一个2字节的DB型数组Hex_Arr.
;(1)子程序1:将a转换为8位二进制数10011100,并存入Bin_Arr中(每个字节单元存1位‘1’或‘0’)。
;(2)子程序2:将Bin_Arr中的二进制数转换为两位16进制数9CH,以ASCII码‘9’与‘C’的形式分别存到Hex_Arr的两个字节中
DATAS SEGMENT
A DB 156
BIN_ARR DB 8 DUP (0)
HEX_ARR DB 0,0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,A
CALL PRO1 ;子程序1
MOV AL,A
CALL PRO2 ;子程序B
MOV AH,4CH
INT 21H
;-------------------------------------------- 子程序1
PRO1 PROC ;入口参数AL
LEA SI,BIN_ARR ;SI指向BIN
MOV CX,8 ;八次
L1:
MOV DL,0 ;清零DL
SHR AL,1 ;右移一次
ADC DL,30H ;DL加30H转ASCII,再加CF的值
MOV [SI],DL
INC SI
LOOP L1
RET
PRO1 ENDP
;-------------------------------------------- 子程序2
PRO2 PROC ;入口参数AL
MOV BL,AL ;
AND BL,0FH ;高四位清零了
CMP BL,9 ;
JBE L2 ;<=
ADD BL,07H ;
L2:
;"A"的ASCII码是41H,它和0AH差了37h,因此要加7,再加30h。
;小于10的数字变成字符只要加30h就行了,大于等于10h的数字要加37h
ADD BL,30H ;
MOV HEX_ARR,BL ;送数据
MOV CL,4 ;
SHR AL,CL ;高四位挪入低四位
CMP AL,9 ;
JBE L3 ;
ADD AL,07H
L3:
ADD AL,30H
MOV HEX_ARR+1,AL
RET
PRO2 ENDP
CODES ENDS
END START
4.实验心得体会与建议
无
实验5
1.实验目的
内存由16个页组成,Cache由8个页组成4-2组相联模式(即4个组,组长为2),可用数组结构表示。通过对Cache赋值代表该cache页中存放内存某一页,如cache[0]=8代表Cache第1个页中存放内存第8个页面。初始时Cache中不包含任何内存页面。
要求:随机生成一串长度为64、范围为1~16之间的随机数,代表对内存16个页面的64个随机访问请求。每个访问请求发生时,处理如下:
-
检查Cache中是否有该内存页,如果有,输出"Hit",并输出该页所在的cache页号;
-
如果没有,将访问内存页面载入Cache中的第i个页面,输出"miss",并输出页号i。i的选择根据书上组相联映射的说明来实现。
-
若页面载入Cache时,发现对应组内没有空闲页面,使用最近最少使用算法(允许使用额外队列表示最近访问时间)选择一个页面将其替换出去,并输出"Perform
LRU:"、被替换页所在的cache页号、被替换页的页号。
2.实验背景知识与原理
相关知识点:组相连模式,最近最少使用算法
3.实验过程与实验结果分析
#include<bits/stdc++.h>
#define random(a,b) (rand()%(b-a)+a)
const int CACHE_LEN = 8;
const int MEMORY_LEN = 16;
const int REQUEST_LEN = 64;
using namespace std;
/**
* cache中的页,使用结构体,因为要排序进行淘汰
*/
typedef struct page
{
int time_index;//进入cache的时间,“最近”
int cnt; //使用次数,“最少”
page() { this->time_index = 0; this->cnt = 0; };
}page;
int Cache[CACHE_LEN];
page Cache_pages[CACHE_LEN];
int TIME = -1;
/**
* 对Cache初始化。
*/
void init()
{
for (int i = 0; i < CACHE_LEN; i++)
Cache[i] = -1;
for (int i = 0; i < CACHE_LEN; i++)
Cache_pages[i] = page();
}
/**
* 根据内存页数获得cache组别
*/
int get_group(int num)
{
int index[MEMORY_LEN + 1] = { -1,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3 };
int group = index[num];
return group;
}
/**
* 更新cache页
*/
void updata_pages(int index, int num)
{
Cache[index] = num;
Cache_pages[index].cnt++;
Cache_pages[index].time_index = TIME;
}
/**
* 获得64个访问请求
*/
void get_64number(int numbers[])
{
for (int i = 0; i < REQUEST_LEN; i++)
numbers[i] = random(1, MEMORY_LEN);
printf("=================64个访问请求====================\n");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 16; j++)
{
printf("%02d ", numbers[i * 16 + j]);
}
printf("\n");
}
printf("=================================================\n");
}
/**
* 检查Cahce中是否有该内存页面
*/
bool check_is_have_page(int num)
{
for (int i = 0; i < CACHE_LEN; i++)
{
if (Cache[i] == num)
{
updata_pages(i, num);
return true;
}
}
return false;
}
/**
* 按照组相连模式将内存也载入cache
*/
int load_memory_in_cache(int num)
{
if (num > MEMORY_LEN || num < 0)
return -1;
int group = get_group(num);
int index1 = group, index2 = group + CACHE_LEN / 2;
if (Cache[index1] == -1)
{
updata_pages(index1, num);
return index1;
}
if (Cache[index2]==-1)
{
updata_pages(index2, num);
return index2;
}
return -1;
}
/**
* 使用最近最少使用算法,选择cache一个页面替换出去。
*/
void replace(int num)
{
int group = get_group(num);
int index1 = group, index2 = group + CACHE_LEN / 2;
int cnt1 = Cache_pages[index1].cnt, cnt2 = Cache_pages[index2].cnt;
int time1 = Cache_pages[index1].time_index, time2 = Cache_pages[index2].time_index;
int replace_page;
if ( cnt1== cnt2)
{
replace_page = time1 > time2 ? index2 : index1;
}
else
{
replace_page = cnt1 > cnt2 ? index2 : index1;
}
printf("Perform LRU: %d %d\n", replace_page, Cache[replace_page]);
updata_pages(replace_page, num);
Cache_pages[replace_page].cnt = 1;
}
int main()
{
int n, i, j, k, m;
int requests[REQUEST_LEN] = {0};
init();
get_64number(requests);
for (i = 0; i < REQUEST_LEN; i++)
{
int request = requests[i];
printf("REQUEST:%02d ", request);
TIME = i;
if(check_is_have_page(request))
printf("Hit!Cache页为%d\n", request);
else
{
int index = load_memory_in_cache(request);
if (index!=-1)
{
printf("miss %d\n", index);
}
else
{
replace(request);
}
}
}
}
实验结果:
4.实验心得体会与建议
无。
实验6
1.实验目的
- 掌握中断原理及其响应流程。
(2)掌握8259中断控制器原理及其应用编程。
2.实验背景知识与原理
8259的引脚分配如图6-1-1所示:
8259芯片引脚说明如下。
-
D7~D0为双向三态数据线
-
CS片选信号线
-
A0用来选择芯片内部不同的寄存器,通常接至地址总线的A0.
-
RD读信号线,低电平有效,其有效时控制信息从8259读至CPU.
-
WR写信号线,低电平有效,其有效时控制信息从CPU写入至8259.
-
SP/EN从程序制允许缓冲
-
NTA中断响应输入
-
INT中断输出
-
IR0~IR78条外界中断请求输入线。
-
CAS2~CAS0级连信号线。
Cs、A0、RD、WR、D4、D3位的电平与8259操作关系如表6-1-1所示。
CPU必须有一个中断使能寄存器,并且可以通过指令对该寄存器进行操作,其原理如图
6-1-2所示。CPU开中断指令STI对其置1,而CPU关中断指令CLI对其置0。
8259的数据线D7.D0挂接到数据总线,地址线A0挂接到地址总线的A0上,片选信号CS
接控制总线的IOY3,IOY3由地址总线的高2位译码产生,其地址分配见表6-1-2,RD、WR(实
验箱上丝印为XIOR和XIOW)接CPU给出的读写信号,8259和系统的连接如图5-2-3所示。
本实验要求设计的模型计算机具备有类X86的中断功能,当外部中断请求有效、CPU允许
中断,且在一条指令执行完时,CPU将响应中断。当CPU响应中断时,将会向8259发送两个
连续的NTA信号,请注意,8259是在接收到第一个NTA信号后锁住向CPU的中断请求信号NTR(高电平有效),并且在第二个NTA信号到达后将其变为低电平(自动EOI方式),所以,中断请求信号R0应该维持一段时间,直到CPU发送出第一个NTA信号,这才是一个有效的中断请求。8259在收到第二个NTA信号后,就会将中断向量号发送到数据总线,CPU读取中断向量号,并转入相应的中断处理程序中。本系统的指令译码电路是在IR单元的NS
DEC(GAL20V8)中实现,如图6-1-4所示。和前面复杂模型机实验指令译码电路相比,主要增加了对中断的支持,当NTR(有中断请求)和EI(CPU允许中断)均为1,且P<4>测试有效,那么在T4节拍时,微程式序就会产生中断响应分支,从而使得CPU能响应中断。在中断过程中需要有现场保护,而且在编程的过程中也需要一些压栈或弹栈操作,所以还需设置一个堆栈,由R3做堆栈指针。系统的寄存器译码电路如图6-1-5所示,在R单元的REG
DEC(GAL16V8)中实现,和前面复杂模型机实验寄存器译码电路相比,增加一个或门和一个与门,用以支持堆栈操作。
3.实验过程与实验结果分析
1.按图6-1-7所示连接实验接线,仔细检查接线后打开实验箱电源。
2.写入实验程序,并进行校验,分两种方式,手动写入和联机写入。
1)手动写入和校验
- 手动写入微程序
①将时序与操作台单元的开关KK1置为'停止'档,KK3置为'编程'档,KK4置为'控存'档,KK5置为'置数'档。
②使用CON单元的SD05一SD00给出微地址,N单元给出低8位应写入的数据,连续两次按动时序与操作台的开关ST,将N单元的数据写到该单元的低8位。
③将时序与操作台单元的开关KK5置为'加1'档。
④N单元给出中8位应写入的数据,连续两次按动时序与操作台的开关ST,将N单元的数据写到该单元的中8位。N单元给出高8位应写入的数据,连续两次按动时序与操作台的开关ST,将N单元的数据写到该单元的高8位。
⑤重复①、②、③、④四步,将表6-1-5的微代码写入2816芯片中。
(2)手动校验微程序
①将时序与操作台单元的开关KK1置为'停止'档,KK3置为'校验'档,KK4置为'控存'档,KK5置为'置数'档。
②使用CON单元的SD05一一SDO0给出微地址,连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯M7一一M0显示该单元的低8位。
③将时序与操作台单元的开关KK5置为'加1'档。
④连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯M1S一一M8显示该单元的中8位,MC单元的指数据指示灯M23一一M16显示该单元的高8位。
⑤重复①、②、③、④四步,完成对微代码的校验。如果校验出微代码写入错误,重新写入、校验,直至确认微指令的输入无误为止。
(7)手动写入机器程序
①将时序与操作台单元的开关KK1置为'停止'档,KK3置为'编程'档,KK4置为'主存'档,KK5置为'置数'档。
②使用CON单元的SD07一一SD00给出地址,N单元给出该单元应写入的数据,连续两次按动时序与操作台的开关ST,将N单元的数据写到该存储器单元。
③将时序与操作台单元的开关KK5置为'加1'档。
④N单元给出下一地址(地址自动加1)应写入的数据,连续两次按动时序与操作台的开关ST,将N单元的数据写到该单元中。然后地址会又自加1,只需在N单元输入后续地址的数据,连续两次按动时序与操作台的开关ST,即可完成对该单元的写入。
⑤亦可重复①、②两步,将所有机器指令写入主存芯片中。
(8)手动校验机器程序
①将时序与操作台单元的开关KK1置为'停止'档,KK3置为'校验'档,KK4置为'主存'档,KK5置为'置数'档。
②使用CON单元的SD07一SD00给出地址,连续两次按动时序与操作台的开关ST,CPU内总线的指数据指示灯D7一一D0显示该单元的数据。
③将时序与操作台单元的开关KK5置为'加1'档。
④连续两次按动时序与操作台的开关ST,地址自动加1,CPU内总线的指数据指示灯D7一一D0显示该单元的数据。此后每两次按动时序与操作台的开关ST,地址自动加1,CPU内总线的指数据指示灯D7一D0显示该单元的数据,继续进行该操作,直至完成校验,如发现错误,则返回写入,然后校验,直至确认输入的所有指令准确无误。
⑤亦可重复①、②两步,完成对指令码的校验。如果校验出指令码写入错误,重新写入、校验,直至确认指令的输入无误为止。
2)联机写入和校验
联机软件提供了微程序和机器程序下载功能,以代替手动读写微程序和机器程序,但是微程序和机器程序得以指定的格式写入到以TXT为后缀的文件中,本次实验程序如下,程序中分号';'为注释符,分号后面的内容在下载时将被忽略掉:
实验结果:
4.实验心得体会与建议
无。

浙公网安备 33010602011771号