实验二 四则运算 实验报告
2011011429 自16 马嘉利
一、实验目的
1. 巩固DEBUG及宏汇编的使用。
2. 加深对运算指令的理解。
3. 注意标志寄存器的变化。
二、实验内容
(一) 加减运算
1. 在数据区中定义两个16位的二进制数(16位的二进制数在内存中存放时占2个字节,低位字节数据存在较低地址单元;高位字节数据存在高地址单元。这一原则简称为“低字节在前、高字节在后”)。用8位加减运算指令分别计算这这两个数的和、差(计算时应先算低字节、后算高字节,计算高字节时还应考虑低字节的进位),并将结果也存入数据区原始数据的后面。程序结束后返回DOS。
为了使程序便于改成BCD码运算,要求在程序中不要直接用16位运算指令。
NAME MY_PROG
DATA SEGMENT
STRING1 DB 0B1H,0DAH
STRING2 DB 4AH,81H
SUM DB 10H DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,STRING1;获取地址
LEA DI,STRING2
LEA BX,SUM
MOV CX,2;循环次数
CLC;请标志位
NEXT1: MOV AL,[SI]
ADC AL,[DI];带进位加法
MOV [BX],AL
INC SI
INC DI
INC BX
DEC CX
JNZ NEXT1;循环
RCL [BX],1;循环移位,将最高位进位移入[BX]
INC BX
SUB SI,2;还原SI指向地址
SUB DI,2
MOV CX,2
CLC
NEXT2: MOV AL,[SI];减法开始
SBB AL,[DI];带进位减法
MOV [BX],AL
INC SI
INC DI
INC BX
DEC CX
JNZ NEXT2
RCL [BX],1;循环移位,将最高位进位移入[BX]
INT 3
CODE ENDS
END START
2. 修改程序实现16位的压缩BCD码的加减运算。
NAME MY_PROG
DATA SEGMENT
STRING1 DB 00H,01H
STRING2 DB 00H,10H
SUM DB 10H DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,STRING1
LEA DI,STRING2
LEA BX,SUM
MOV CX,2
CLC
NEXT1: MOV AL,[SI]
ADC AL,[DI]
DAA;修改,压缩BCD码加法调整
MOV [BX],AL
INC SI
INC DI
INC BX
DEC CX
JNZ NEXT1
RCL [BX],1
INC BX
SUB SI,2
SUB DI,2
MOV CX,2
CLC
NEXT2: MOV AL,[SI]
SBB AL,[DI]
DAS;修改,压缩BCD码减法调整
MOV [BX],AL
INC SI
INC DI
INC BX
DEC CX
JNZ NEXT2
JNC IFN1;修改,如果是正数就不调整
RCL [BX],1
MOV AX,9999H
SUB AX,[BX-2];修改,求负数补码
ADD AL,01H;修改,求负数原码
DAA
MOV [BX-2],AL
MOV AL,AH
ADC AL,0
DAA
MOV [BX-1],AL
IFN1: INT 3
CODE ENDS
END START
(二) 乘法运算
1. 用重复累加的方法计算两位BCD码数乘以两位BCD码数的积(参看流程图1)。被乘数和乘数都用压缩的BCD码形式存放于数据区,各占一单元。乘积顺序存放在后两个单元中(低位在前,高位在后)。
NAME MY_PROG
DATA SEGMENT
STRING1 DB 99H
STRING2 DB 99H
SUM DB 10H DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BL,STRING1[0];取内容
MOV BH,STRING2[0]
LEA SI,SUM
CLC
MOV CX,0000;CX置零
CMP BL,0;BL==0?
JZ SUCCESS;=0跳转
NEXT1: CMP BH,0;BH==0?
JZ SUCCESS;=0跳转
ADC CL,BL;带进位加法求低位
MOV AL,CL
DAA;压缩BCD码加法调整
MOV CL,AL
ADC CH,0;高位加低位进位
MOV AL,CH
DAA;压缩BCD码加法调整
MOV CH,AL
DEC BH;BH-1
MOV AL,BH
DAS;压缩BCD码减法调整
MOV BH,AL
JMP NEXT1
SUCCESS:MOV [SI],CL;输出低位
MOV [SI+1],CH;输出高位
INT 3
CODE ENDS
END START
2. (选作内容)用乘法指令计算十进制数乘法2754×3。被乘数和乘数都用ASCⅡ码形式存放在内存中(低位在前),乘积以ASCⅡ码存入后续单元(低位在前)。
NAME MY_PROG
DATA SEGMENT
STRING1 DB 33H
STRING2 DB 34H,35H,37H,32H
SUM DB 10H DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BL,STRING1[0]
SUB BL,30H;减30H得数值
LEA SI,STRING2
LEA DI,SUM
MOV CX,4;被乘数位数
CLC
NEXT1: MOV AL,BL
MOV AH,00H;清零
MOV DL,[SI]
SUB DL,30H;减30H得数值
MUL DL;DL乘以AL,结果存AX
AAM;压缩BCD码乘法调整
INC SI
ADD AL,[DI];本位积和前次进位相加
AAA;不压缩BCD码加法调整
ADD AL,30H;加30H得ASCII码
MOV [DI],AL;保存结果
INC DI
MOV [DI],AH;保存进位于[DI+1]
DEC CX
JNZ NEXT1
ADD [DI],30H;加30H得ASCII码
INT 3
CODE ENDS
END START
四、实验收获
1. 巩固DEBUG及宏汇编的使用。
2. 加深对运算指令的理解,尤其是DAA,AAA,DAS,AAM等ASCII调整指令的使用
3. 学会了-e指令的使用
第二篇:计组实验二报告
实验五 微程序控制器部件教学实验
一、实验目的:
1、全面掌握计算机各部件组成及相互联接关系。
2、深入理解计算机微程序控制器的功能、组成知识。
3、深入地学习计算机各类典型指令的执行流程。
4、对指令格式、寻址方式、指令系统、指令分类等建立具体的总体概念。
5、学习微程序控制器的设计过程和相关技术。
二、实验设备与器材:
TEC-XP16机
三、实验内容:
1、完成控制器部件的教学实验,主要内容是自己设计几条指令的功能、格式和执行流程,并在教学计算机上实现、调试正确。
2、首先是看懂TEC-XP教学计算机的功能部件组成和线路逻辑关系,然后分析教学计算机中已经设计好并正常运行的几条典型指令(例如,ADD、MVRR、OUT、MVRD、JRC、CALA、
RET等指令)的功能、格式和执行流程,注意各操作功能所对应的控制信号的作用。
3、设计几条指令的功能、格式和执行流程,并在教学计算机上实现、调试正确。例如ADC、
JRS、JRNS、LDRA、STAR、CALR等指令,可以从给出的19条扩展指令中任意选择,当然
也可以设计与实现其它的指令,包括原来已经实现的基本指令(要变换为另外一个指令操作
码)或自己确定的指令。
4、单条运行指令,查看指令的功能、格式和执行流程。
5、用监控程序的A、E(扩展指令必须用E 命令置入)命令编写一段小程序,观察运行结果。
四、实验步骤(和说明):
1、(1)选择基本指令的B组指令中的MVRD指令,观察其节拍流程
1) 置拨动开关SW=10001000 00010000;(表示指令MVRD DR,DATA )
2) 按RESET按键; 指示灯Microp亮(只要选择微程序,该灯在指令执行过程中一直亮),
其它灯全灭;
3) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址和下址的指示灯全灭;
(本拍完成公共操作0→PC、DI#=0)
4) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0000 0001,下址的指示灯全灭;(本拍完成公共操作PC→AR、PC+1→PC)
5) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0000 0010,下址的指示灯全灭;(本拍完成公共操作MEM→IR)
6) 以上三步为公共操作,其它指令同;
7) 按START按键; 指示灯CI3~0、SCC3~0显示0010 0000,微址指示灯显示0000 0011,下址的指示灯显示0001 1101;(本拍完成/MAP操作功能)
8) 按START按键; 指示灯CI3~0、SCC3~0显示0011 0000,微址指示灯显示0001 1101,下址的指示灯显示0001 1100 (本拍执行MVRD指令,DR←DATA 操作)。
9) 按START按键; 指示灯CI3~0、SCC3~0显示0011 0000,微址指示灯显示0001 1100,下址的指示灯显示0011 0000;(本拍完成STR→Q、CC#=INT#公共操作功能)
10) 按START按键; 指示灯CI3~0、SCC3~0 显示0011 0010,微址指示灯显示0011 0000,
下址的指示灯显示0011 1010;(本拍完成PC→AR、PC+1→PC、CC#=0的公共操作)
(2)选择基本指令的D组指令中的CALA指令,观察其节拍流程
1) 置拨动开关SW=11001110 00000000;(表示指令CALA ADR )
2) 按RESET按键; 指示灯Microp亮(只要选择微程序,该灯在指令执行过程中一直亮),
其它灯全灭;
3) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址和下址的指示灯全灭;
(本拍完成公共操作0→PC、DI#=0)
4) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0000 0001,下址的指示灯全灭;(本拍完成公共操作PC→AR、PC+1→PC)
5) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0000 0010,下址的指示灯全灭;(本拍完成公共操作MEM→IR)
6) 以上三步为公共操作,其它指令同;
7) 按START按键; 指示灯CI3~0、SCC3~0显示0010 0000,微址指示灯显示0000 0011,下址的指示灯显示0001 1111;(本拍完成/MAP操作功能)
8) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0001 1111,下址的指示灯显示0000 0000 (本拍执行CALA指令,调用首地址为ADR的子程序)。
9) 按START按键; 指示灯CI3~0、SCC3~0显示1110 0000,微址指示灯显示0010 0000,下址的指示灯显示0000 0000;(本拍完成STR→Q、CC#=INT#公共操作功能)
10) 按START按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0010 0001,
下址的指示灯显示0000 0000;(本拍完成PC→AR、PC+1→PC、CC#=0的公共操作)
2、(1)选择扩展指令的C 组指令中的LDRA指令,观察其节拍流程
1) 置拨动开关SW=11100100 00010000;(表示指令LDRA )
2) 按RESET 按键; 指示灯Microp 亮(只要选择微程序,该灯在指令执行过程中一直
亮),其它灯全灭;
3) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址和下址的指示灯全灭;
4) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0000 0001,
下址的指示灯全灭;
5) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0000 0010,
下址的指示灯全灭;
6) 以上三步为公共操作,其它指令同。
7) 按START 按键; 指示灯CI3~0、SCC3~0 显示0010 0000,微址指示灯显示0000 0011,
下址的指示灯显示0101 1011;
8) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0101 1011,
下址的指示灯显示0000 0000;(本拍完成DR←[ADR]操作)
9) 按START 按键; 指示灯CI3~0、SCC3~0 显示0011 0000,微址指示灯显示0101 1100,
下址的指示灯显示0001 1100;(本拍完成STR→Q、CC#=INT#操作)
10) 按START 按键; 指示灯CI3~0、SCC3~0 显示0011 0000,微址指示灯显示0001 1100,下址的指示灯显示0011 0000;(本拍完成PC→AR、PC+1→PC 操作)
(2)选择扩展指令的C 组指令中的CALR指令,观察其节拍流程
1) 置拨动开关SW=11100000 00000001;(表示指令CALR )
2) 按RESET 按键; 指示灯Microp 亮(只要选择微程序,该灯在指令执行过程中一直
亮),其它灯全灭;
3) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址和下址的指示灯全灭;
4) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0000 0001,
下址的指示灯全灭;
5) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0000 0010,
下址的指示灯全灭;
6) 以上三步为公共操作,其它指令同。
7) 按START 按键; 指示灯CI3~0、SCC3~0 显示0000 0011,微址指示灯显示0000 0011,
下址的指示灯显示0110 0100;
8) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0110 0100,
下址的指示灯显示0000 0000;(本拍完成调用SR指向的子程序)
9) 按START 按键; 指示灯CI3~0、SCC3~0 显示1110 0000,微址指示灯显示0110 0101,
下址的指示灯显示0000 0000;(本拍完成STR→Q、CC#=INT#操作)
10) 按START 按键; 指示灯CI3~0、SCC3~0 显示0011 0000,微址指示灯显示0110 0110,下址的指示灯显示0011 0000;(本拍完成PC→AR、PC+1→PC 操作)
3、用A、E键入程序连续运行(扩展指令用E命令键入)
(1) 测试ADC 指令。运行结果应为R0=1112 R1=1010。
(2) 测试CALR 指令
1) 将被显示的6个字符‘A’~‘F’送入到内存20F0H开始的存储区域中。
2)用A键输入,错误
3) 从地址2100H 开始输入程序
(3) 测试指令LDRA
1) 将要输出的字符存放在地址单元2100
2) 用A、E 命令键入程序
A错误
E成功
五、思考题:
在“A”命令下能否直接输入新指令?为什么?
不能。因为监控程序的A命令只支持基本指令,扩展指令应用E命令将指令代码写入到相应的存储单元中。
六、实验心得:
本次实验对单步执行指令和连续执行指令分别进行了测试,分别观察其节拍流程;分别用监控程序的A、E命令编写一段小程序,观察运行结果;应了解监控程序的A命令只支持基本指令,扩展指令应用E命令将指令代码写入到相应的存储单元中;不能用T、P命令单步调试扩展指令,只能用G命令执行扩展指令。经过实践测试,E命令可对指令进行扩展,增加原有基本指令功能。