基础汇编语言程序设计实验
【实验目的】
1. 了解教学计算机的指令格式、指令编码、选择的寻址方式和每一条指令的具体功能,为进一步学习运算器组成和控制器设计打好基础。
2. 了解汇编语言的语句与机器语言的指令之间的对应关系,了解伪指令在汇编过程中的作用。
3. 学习教学机监控程序的功能、监控命令的使用方法,体会软件系统在计算机组成中的地位和作用。
【实验内容】
1. 学习联机使用TH-UNION+教学实验系统和仿真终端软件PCEC.
2. 使用监控程序的R命令显示/修改寄存器内容、D命令显示存储器内容、E命令修改存储器内容。
3. 使用A命令写一小段汇编程序,U命令反汇编刚输入的程序,用G命令连续运行该程序,用T、P命令单步运行并观察程序单步执行情况;
【实验内容】
1. 用R命令查看寄存器内容或修改寄存器的内容
1)在命令行提示符状态下输入:
R↙ ;显示寄存器的内容
注:寄存器的内容在运行程序或执行命令后会发生变化。
2)在命令行提示符状态下输入:
R R0↙ ;修改寄存器R0的内容,被修改的寄存器与所赋值之间可以无空格,也可有一个或数个空格
2. 用D命令显示存储器内容
在命令行提示符状态下输入:
D 2000↙
3. 用E命令修改存储器内容
在命令行提示符状态下输入:
E 2000↙
4. 用D命令显示这几个单元的内容
D 2000↙
可以看到这六个地址单元的内容变为0000 1111 2222 3333 4444 5555。
5. 用A命令键入一段汇编源程序,主要是向累加器送入数据和进行运算,执行程序并观察运行结果。
1) 在命令行提示符状态下输入:
A 2000↙ ;表示该程序从2000H(内存RAM区的起始地址)地址开始
2) 用U命令反汇编刚输入的程序
在命令行提示符状态下输入:
U 2000↙
在相应的地址会得到输入的指令及其操作码
3) 用G命令运行前面键入的源程序
G 2000↙
4) 用P或T命令,单步执行这段程序,观察指令执行结果
在命令行提示符状态下输入:
T 2000↙
<1
2020:MVRD R2,00OA
2022:MVRD R0,0030
2024:OUT 80
2025:DEC R2
2026:JRZ 202E
2027:PUSH R0
2028:IN 81
2029:SHR R0
202A:JRNC 2028
202B:POP R0
202C:INC R0
202D:JR 2024
202E:RET
202F:↙
<2
(2100) MVRD R2,001A
MVRD R0,0041
(2104) OUT 80
DEC R2
JRZ 210E
PUSH R0
(2108)IN 81
SHR R0
JRNC 2108
POP R0
INC R0
JR 2104
(210E)RET
【实验结果】
<1屏幕上输出'0'到'9'十个数字符
<2屏幕上显示“A”~“Z”26个英文字母
【实验过程中遇到的问题以及解决办法】
在验证例3的实验时,输入语句“JC 2053”,执行时系统一直提示有错误,无法进行运算
查表得知语句中没有JC ,只有JRC,所以修改语句即可解决。
【实验总结】
第一次计算机组成原理上机,设备的连接调试比较麻烦,遇到各种各样的问题,比如接口不稳定,ftp下载出错,端口找错等等。但是,在老师的细心帮助下,一一解决了。在单步调试中,可以看到寄存器中的值和累加器中的值,可以很清晰的看到数据流的走向,从而对计算机的工作流程更加清晰,比理论学习更能帮助理解计算机组成原理。
脱机运算器实验
【实验目的】
脱机运算器实验,是指让运算器从教学计算机整机中脱离出来,此时,它的全部控制与操作均需通过两个12位的微型开关来完成,这就谈不上执行指令,只能通过开关、按键控制教学机的运算器完成指定的运算功能,并通过指示灯观察运算结果。深入了解AM2901运算器的功能与具体用法,2片(16位为4片)AM2901的级连方式,深化运算器部件的组成、设计、控制与使用等诸项知识。
(1)理解运算器芯片Am2901的功能和内部组成,运行中使用的控制信号及各自的控制作用;
(2)理解4片Am2901构成16位运算器的具体方案,各数据位信号、各控制位信号的连接关系;
(3)使用24位微型开关中的23位控制信号确定运算与处理功能。
【实验内容】
脱机运算器实验,在教学实验中实现如下7项操作功能。
预期功能 实现方案
R0←1234 数据开关拨1234,B地址给0,D+0,结果送B口选的R0
R9←789F 数据开关拨789F,B地址给9,D+0,结果送B口选的R9
R9←R9-R0 B地址给9,A地址给0,最低位进位给1,B—A,结果送B口选的R9
R0←R0+1 B地址给0,最低位进位给1,B+0,结果送B口算的R0
R10←R0 B地址给A,A地址给0,A+0,结果送B口选的R10
R9←R9^R9并逻辑左移 B地址给9,A地址也给9,B^A并实现逻辑左移操作
Q←R9 A地址给9,通用寄存器不接收,A+0,结果送Q寄存器
断电前的显示:
断电后的显示:
【实验结果】
预期功能 控 制 信 号
I8-6 I5-3 I2-0 SST A地址 B地址 SCI SSH
R0←1234 011 000 111 001 0 0 00 00
R9←789F 011 000 111 001 0 1001 00 00
R9←R9-R0 011 001 001 001 0 1001 01 00
R0←R0+1 011 000 101 001 0 0000 01 00
R10←R0 011 000 100 001 0 1010 00 00
R9←R9ΛR0 011 100 001 001 1001 1001 00 00
Q←R9 000 000 100 001 1001 1001 00 00
功能 按START之前 按START之后
Y15~Y0 CY F=0 OVR F15 C Z V S
R0←1234 1234 0 0 0 0 0 0 0 0
R9←789F 789F 0 0 0 0 0 0 0 0
R9←R9-R0 666B 1 0 0 0 0 0 0 0
R0←R0+1 1235 0 0 0 0 0 0 0 0
R10←R0 1235 0 0 0 0 0 0 0 0
R9←R9^R0 0221 1 0 0 0 1 0 1 0
并逻辑左移
Q←R9 0442 0 0 0 0 0 0 0 0
【实验过程中遇到的问题以及解决办法】
实验中不能理解执行R9←R9—R0时,低位进位要给1。经过学习知道了,在进行减法运算时,把被减数看做加法中的负数,需要把绝对值取反加一,机器可以自动取反,却不能自动加一,所以要把SCI拨到1。
【实验总结】
这个实验需要很仔细耐心,不然一步错步步错,把表格填错,或者在试验仪上面把开关拨弄错误,造成实验最终难以进行。但是好在小组的同学配合很好,记录数据,拨弄开关,观察指示灯都不错。而且经过自己动手操作,我们对实验机器有了更深的了解。
组合逻辑控制器部件实验过程
【实验目的】
通过理解教学计算机中已经设计好并正常运行的几条典型指令(例如,ADD、SHR、OUT、MVRD、JRC、RET、CALA等指令)的功能、格式和执行流程,然后自己设计几条
指令的功能、格式和执行流程,并在教学计算机上实现、调试正确。其最终要达到的目的是:
1. 深入理解计算机控制器的功能、组成知识,掌握教学计算机的指令格式、指令编码、寻址方式和指令功能等内容。
2. 掌握教学计算机的总体组成和各个部件的运行原理,理解控制器部件在计算机系统中的作用。
3. 理解和掌控指令执行步骤的划分方案。
4. 熟悉微程序控制器和组合逻辑控制器,学习组合逻辑控制器和微程序控制器的设计过程和相关技术。
【实验内容】
通过多种方式查看教学计算机指令的执行步骤、运行结果、各组控制信号在每一个执行步骤中的状态、指令之间的衔接等有关内容。检查与理解指令的每一个执行步骤所使用的控制信号。
依照指令的执行步骤,教学计算机的指令划为4组。
A组:通用寄存器之间的数据运算或传送,或其它几项特殊的操作,
在取指之后可一步完成。
基本指令 ADD、SUB、AND、OR、XOR、CMP、TEST、MVRR、
DEC、INC、SHL、SHR、JR、JRC、JRNC、JRZ、JRNZ
扩展指令 ADC、SBB、RCL、RCR、ASR、NOT、CLC、STC、EI、
CI、JRS、JRNS、JMPR
B组:完成的是一次内存或I/O读、写操作,在取指之后可两步完成,第
一步把要使用的地址传送到地址寄存器AR中,第二步执行内存或
I/O读、写操作。
基本指令 JMPA、LDRR、STRR、PUSH、POP、PSHF、POPF、
MVRD、IN、OUT、RET
C组:在取指之后可三步完成,其中CALR指令在用两步完成
一次写内存之后,第三步执行寄存器之间的数据传送;而其它
指令在第一步置地址寄存器AR,第二步读内存并传送到地址寄
存器AR,第三步执行另外一次读、写内存的操作。
扩展指令 CALR、LDRA、STRA、LDRX、STRX
D组:完成的是两次读、写内存操作,在取指之后可四步完成。
基本指令 CALA
扩展指令 IRET
A组:
SHR:
<1将教学计算机运行功能选择开关置为00001011(单步运行、手拨、组合逻辑、联机工作方式、16位字长、计原16系统,使其工作在单节拍下。
<2使用手拨开关SWH、SWL输入OUT80指令机器码1000 0110 1000 0000(8086H)。
<3在单节拍方式下,让计算机反复执行这一指令。
SHL:
<1将教学计算机运行功能选择开关置为00001010 (单步运行、手拨、组合逻辑、联机工作方式、16位字长、计原16系统,使其工作在单节拍下。
<2使用手拨开关SWH、SWL输入OUT80指令机器码1000 0110 1000 0000(8086H)。
<3在单节拍方式下,让计算机反复执行这一指令。
B组:
JMAP:
<1将教学计算机运行功能选择开关置为10000000 (单步运行、手拨、组合逻辑、联机工作方式、16位字长、计原16系统,使其工作在单节拍下。
<2使用手拨开关SWH、SWL输入OUT80指令机器码1000 0110 1000 0000(8086H)。
<3在单节拍方式下,让计算机反复执行这一指令。
MVRD:
<1将教学计算机运行功能选择开关置为10001000 (单步运行、手拨、组合逻辑、联机工作方式、16位字长、计原16系统,使其工作在单节拍下。
<2使用手拨开关SWH、SWL输入OUT80指令机器码1000 0110 1000 0000(8086H)。
<3在单节拍方式下,让计算机反复执行这一指令
D组:
CALA:
<1将教学计算机运行功能选择开关置为11001110 (单步运行、手拨、组合逻辑、联机工作方式、16位字长、计原16系统,使其工作在单节拍下。
<2使用手拨开关SWH、SWL输入OUT80指令机器码1000 0110 1000 0000(8086H)。
<3在单节拍方式下,让计算机反复执行这一指令
【实验结果】
【实验过程中遇到的问题以及解决办法】
在实验过程中,公共信号指示灯和执行流程表有出入,公共节拍控制信号不吻合。反复试验后,经思考,指令字不是从内存取入,是手动输入,所以信号不吻合,但是不影响执行信号指示灯。
【实验总结】
在实验中,了解到计算机硬件与软件是互相支持实现的,划分指令执行步骤并设计每一步的执行功能,设计节拍状态的取值,应参照已实现指令的处理办法来完成,特别要注意的是,读取指令的节拍只能用原来已实现的,其他节拍的节拍状态也应尽可能地与原用节拍的状态保持一致和相近。
第二篇:汇编语言程序设计实验报告一
汇编语言程序设计实验报告(一)
一、实验目的
1. 掌握顺序程序设计方法
2. 掌握分支程序的结构及分支程序的设计,调试方法
3. 学习数据传送及算术和逻辑运算指令的用法
4. 熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程
二、实验内容
1. 从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。
2. 从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的字符,按下列要求计算。
A)当输入字符为A,则计算X+Y,并以十六进制形式显示出来
B)当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来
C)当输入字符为C,则计算X*Y,并以十六进制形式显示出来
D)当输入字符为D,则计算X/Y,并以十六进制形式显示出来
三、实验结果
1、结果截图
2、结果截图
四、源代码
1、代码
DATA SEGMENT
X DB ?
TABLE DW L1,L2,L3,L4
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AH,1
INT 21H
CMP AL,33H
JB L0
CMP AL,36H
JA L0
AND AL,0FH
MOV X,AL
SUB AL,3
SHL AL,1
XOR AH,AH
MOV BX,OFFSET TABLE
ADD BX,AX
JMP [BX]
L1:MOV AL,X
MUL AL
ADD AL,X
JMP L7
L2:MOV AL,X
MUL AL
SUB AL,X
SUB AL,X
JMP L7
L3:MOV AL,X
MUL AL
JMP L7
L4:MOV AL,X
MUL AL
MOV CL,2
DIV CL
JMP L7
L7:MOV BL,AL
MOV CL,4
SHR AL,CL
CMP AL,9
JLE L5
ADD AL,7
L5:ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
AND BL,0FH
CMP BL,9
JLE L6
ADD BL,7
L6:ADD BL,30H
MOV DL,BL
MOV AH,2
INT 21H
L0:MOV AH,4CH
INT 21H
CODE ENDS
END START
2、代码
DATA SEGMENT
X DB ?
Y DB ?
Z DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV AH,1
INT 21H
MOV X,AL
MOV AH,1
INT 21H
MOV Y,AL
MOV AH,1
INT 21H
MOV Z,AL
MOV AL,X
MOV BL,Y
MOV AH,Z
CMP AL,39H
JBE M1
SUB AL,7
M1:SUB AL,30H
MOV X,AL
CMP BL,39H
JBE M2
SUB BL,7
M2:SUB BL,30H
MOV Y,BL
MOV AL,X
MOV BL,Y
CMP AH,41H
JE L1
CMP AH,42H
JE L4
CMP AH,43H
JE L6
CMP AH,44H
JE L7
L1:ADD AL,BL
JMP L5
L4:CMP AL,BL
JA L8
SUB BL,AL
MOV AL,BL
JMP L5
L8:SUB AL,BL
JMP L5
L6:MOV AL,X
MUL BL
JMP L5
L7:XOR AX,AX
MOV AL,X
DIV BL
L5:MOV BH,AL
MOV CL,4
SHR AL,CL
CMP AL,9
JLE L2
ADD AL,7
L2:ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
AND BH,0FH
CMP BH,9
JLE L3
ADD BH,7
L3:ADD BH,30H
MOV DL,BH
MOV AH,2
INT 21H
L0:MOV AH,4CH
INT 21H
CODE ENDS
END START
五、实验心得
通过本次实验,我对汇编语言程序设计的方法和特点有了一点理解,并有以下心得体会。
1. 标号并不是一个独立于主程序的代码段,它只是标明了代码行指令的符号地址,如果指令中没有跳到某个标号的指令,那么这段代码是一直按顺序执行的,即使有标号存在。
2. 对于要从键盘中键入字符的指令,写一次指令,只能输入一个字符,若想输入几个字符,就要用几次指令,并且要及时将输入时存入AL中的内容转移到相应的存储位置,否则,将会在原来的基础上覆盖,则只能留下最后一次输入的结果。
3. 程序中的数据均为十六进制,运算也为十六进制数的运算,但是输入一个字符,是将它对应的的ASCII码值存放在相应的位置,输出的时候,也是将相应的ASCII码对应的字符输出,因此,比如当运算结果为0AH时,必须在0AH的基础上+37H,转化成'A'字符对应的ASCII码值,再输出,才能显示为A,这才是对应的十六进制数。例如,输入一个十进制数5,则存入的是35H,只有将35H减去30H,转化成05H,才能继续用它进行运算。
4. 设计程序时,可以先将一种情况的程序设计出来,如x=3时的,然后经调试成功之后,再将x=4,5,6时的情况补上,这样程序设计更清晰,更易于理解设计过程。
5. 注意:补写程序时要在结束语句之前补写,否则补写的部分无法执行。补写时,要充分考虑到程序执行的顺序,注意体会标号的含义,必要时使用JMP+标号,跳脱不必要执行的代码段,避免程序出错。
6. 在程序设计中,经常使用一些巧妙的运算来达到所需的目的。如将AH与AH异或,可以将AH置零。
总之,通过这第一次的实验,我觉得对汇编语言程序设计的感觉由茫然转变为了略知一二,通过自己对题目的反复尝试,也渐渐的有了编程的感觉,以后的实验中,一定会更加认真地体会这门课程的内涵与学习方法。