微机原理第二次实验报告
实验二:加法及判断程序调试实验实验报告
健行理工1402班 丽红 2
一、实验目的
1. 掌握编写汇编语言源程序的基本方法和基本框架。
2. 学会编写顺序结构、分支结构和循环结构的汇编程序,掌握宏定义与宏调用的方法。
3.掌握程序中数据的产生与输入输出的方法。
二、实验容
1. 用汇编语言编写一个加法程序: 1325十9839,用ASCII 码的形式将加数与被加数存放在数据区DATA1和DATA2中,并将相加结果显示输出。
2. 设有一组数据: 5,-4,0,3,100,-51,编程判断:每个数是>0、=0、还是<0 ?并输出其判断结果。
即:
??
???<-=>=0
10001x x x y 当当当 三、程序说明
3.1实验容一:
(1) 两个数据先以相反的顺序以ASCII 码的形式存放在数据段的DATA1和DATA2中,相加时从DATA1和DATA2的起始字节开始相加,也就是从数的个位数开始相加。相加后的结果存放在DATA2开始的存储单元中,同时用DL 保存进位位。
(2)对于本题来说,题目为两个四位数相加,所以定义循环数为4。
(3)程序中的加法运算是ASCII码运算,后面应加一条ASCII码加法调整指令AAA,经AAA调整的加法指令,将ASCII码的数据高4位清“0”,因此要将结果每位数高4位拼成3,变成ASCII码存到DATA2中。
(4)一位运算结束后将用于保存进位位的DL复原,进入循环,进行下一位求和计算。
(5)由于计算是从个位数相加开始,所以存入DATA2中的数据应该以相反的顺序输出,故再进行一轮循环输出,得到最终的计算结果。
3.2实验容二:
(1)首先将原始数据(5,-4,0,3,100,-51)装入起始地址为VAR的字节存储单元中。
(2)将判断结果以字符串的形式分别存放在数据区中,以便在显示输出时调用。
(3)判断部分采用CMP指令。从数据区中取出一个数送给AL,之后与0进行比较,得到分支结构,分别输出“Y=0”、“Y=+1”和“Y=-1”。
(4)程序中存在一个循环结构,对于本题,循环次数为6,调用6次分支结构后结束。
四、程序总框图
4.1实验容一程序框图
开始
将DATA1 的偏移地址SI
将DATA2 的偏移地址D I
定义循环次数CX=4
取DATA1一位数BL
进行加法运算,并调整,
将每一位运算结果拼成ASCII码
保存到DATA2 中
N
(CX)-1=0?
Y
重新定义循环次数CX为5
通过DI减1,将保存的结果以相反
的顺序输出
N
(CX)-1=0?
Y
结束
4.2实验容二程序框图
五、源程序清单与执行结果
5.1实验容一:
5.1.1程序源代码
DATA SEGMENT ;定义数据段,DATA为段名,将两个数据用相反顺序以ASCII码的DATA1 DB '5231' 形式存放在DATA1,DATA2中
DATA2 DB '9389'
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,DATA1 ;将DATA1的偏移地址给SI
LEA DI,DATA2 ;将DATA2的偏移地址给DI
MOV CX,4 ;定义循环数CX为4
MOV AH,00H ;初始化AH,DL
MOV DL,00H
NEXT: MOV BL,[SI]
MOV AL,[DI]
ADD AL,DL ;将进位位与AL中的数相加后存储到AL
ADD AL,BL ;将AL,BL相加
AAA ;AAA调整
ADD AL,30H ;将结果每位数高4位拼成3,变成ASCII码
MOV [DI],AL ;将ASCII码存在DATA2
MOV DL,AH ;DL用于存储进位位
INC SI ;将SI,DI加1
INC DI
MOV AH,00H ;将进位位复原置0
LOOP NEXT ;循环,进行下一位的计算求和
MOV AH,DL ;该部分代码用于保存最后一个进位位
ADD AH,30H
MOV [DI],AH
MOV CX,5
NEXT1:MOV AH,02H ;之前的代码输出结果顺序为相反的,通过再一次的循环输出得到计 MOV BL,[DI] 结果
MOV DL,BL
INT 21H
DEC DI ;DI减1
LOOP NEXT1
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.1.2实验结果截图
5.2实验容二:
5.2.1程序源代码
DATA SEGMENT ;定义数据段
VAR DB 5,-4,0,3,100,-51
D1 DB 'Y=+1',0DH,0AH,'$' ;以字符串形式存储
D2 DB 'Y=0',0DH,0AH,'$'
D3 DB 'Y=-1',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:CODE
START:MOV AX,DATA
MOV DS,AX ;给DS段赋值
MOV AX,00H ;初始化AX置0
MOV CX,6 ;定义循环数CX为6
LEA DI,VAR ;将VAR的开始地址给DI NEXT1:MOV AL,[DI]
CMP AL,0 ;将DI指向的数与0进行比较 JGE NEXT2 ;当AL>=0时跳转至NEXT2
MOV DX,OFFSET D3 ;将D3的偏移值送给DX
JMP OPT
NEXT2:JE NEXT3 ;AL=0时跳转至NEXT3
MOV DX,OFFSET D1 ;将D1的偏移值送给DX
JMP OPT
NEXT3:MOV DX,OFFSET D2 ;将D2的偏移值送给DX
JMP OPT
OPT:MOV AH,09H ;输出判断结果
INT 21H
INC DI ;DI加1,跳转至判断下一个数值 LOOP NEXT1
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.2.2实验结果截图