微机原理实验报告两个数相乘Word格式.docx
《微机原理实验报告两个数相乘Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告两个数相乘Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
MOV
LEA
L1:
INT
DEC
JNZ
AND
LOOP1:
MOV
INC
MUL
AAM
ADD
AAA
INCAX,STACKSS,AXSP,TOPSI,DATA1BX,05HAH,02H
DL,[SI+BX-1]21HBXL1AH,09HDX,MES121HSI,DATA2
AH,02HDL,[SI]21HAH,09HDX,MES221HSI,OFFSETDATA2;
显示算式BL,[SI];
乘数DATA2?
BLBL,00001111B;
屏蔽高4位,ASCII码转化为十六进制数SI,OFFSETDATA1DI,OFFSETRESULT
CX,05AL,[SI]AL,00001111B;
取被乘数DATA1,ASCII变十六进制数SI;
指向被乘数1的下一字符单元BL;
相乘;
AAM调整
AL,[DI];
结果低位与前次计算的进位相加;
AAA调整[DI],ALDI;
结果送存到下一单元
MOV[DI],AH
LOOPLOOP1;
计算结果高位进位送存MOVCX,06
MOVSI,DI
DISPL:
MOVAH,02
MOVDL,[SI]
ADDDL,30H
INT21H
DECSI
L
OOPDISPL
MOVAX,4C00H
CODEENDS
ENDSTART
;
显示结果;
结束
篇二:
微机原理设计实验之两个数相乘
课程设计题目:
两个数相乘
一、实验目的
1、领会汇编语言的编程思想;
2、掌握汇编语言的指令,加深乘法指令和循环指令的用法;
3、学会DOS功能的调用。
二、实验内容
实现两个十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、实验原理
本实验设计A、B两个数相乘。
巧妙地运用了数学中的乘法原理,将B的低位和A的最低位相乘得到的数的低位存到AL中,这个数的进位存到AH中,再用B的低位和A的次低位相乘,得到一个数,这个数的低位和上一次的进位相加。
循环此过程直到到B与A的最高位相乘结束,并与上一次结果的进位相加,得到最后的结果。
四、程序设计流程图
(此处画上是实验纸上的流程图)
五、实验程序
DATASEGMENT;
定义数据段
DATA1DB32H,39H,30H,35H,34H;
用ASCII码表示被乘数45092
DATA2DB34H;
用ASCII码表示乘数4
BUFDB&
Result$&
RESULTDB6DUP(00H);
定义存放结果的数据缓冲区,6个字节长,初值为0
DATAENDS;
数据段结束
STACKSEGMENT;
定义堆栈段
STADB20DUP(?
);
为变量STA分配20个字节的空间
返回利用DUP定义的数组元素的个数到TOP,TOP=20
STACKENDS;
堆栈段结束
CODESEGMENT;
定义代码段
CODE,DS:
MOVDS,AX;
DS?
AX
MOVAX,STACK
MOVSS,AX;
SS?
STACK
MOVSP,TOP;
栈顶指针指向TOP
MOVDX,OFFESETBUF
MOVAH,9;
DOS功能号09H送AH
INT21H;
显示字符串‘pleaseinput’LEASI,DATA1;
被乘数首地址送SI
MOVBX,05H
MOVAH,02H;
DOS功能号02H送AH
MOVDL,[SI+BX-1];
被乘数送DL
INT21H;
DOS功能号调用(显示器输出)
DECBX
JNZL1
MOVAH,09H;
DOS功能号09H送AH
LEADX,MES1;
MES1的偏移地址送DX
DOS功能号调用(显示字符串)LEASI,DATA2;
乘数地址
送SI
MOVAH,02H
MOVDL,[SI];
乘数送DL
INT21H;
显示乘数
MOVAH,09H
LEADX,MES2;
MES2的偏移地址送DX
INT21H
MOVSI,OFFSETDATA2
MOVBL,[SI];
DATA2中的乘数送BL
ANDBL,00001111B;
屏蔽乘数高4位,ASCII码转换为十六进制
MOVSI,OFFSETDATA1;
被乘数偏移地址送SI
MOVDI,OFFSETRESULT;
运算结果偏移地址送DI
MOVCX,05;
设置循环次数
MOVAL,[SI];
被乘数送AL
ANDAL,00001111B;
屏蔽被乘数高4位,ASCII码转换为十六进
制
INCSI
MULBL;
AL*BL送AX
AAM;
乘法十进制调整
ADDAL,[DI];
结果低位与前次计算的进位相加
AAA;
BCD码加法十进制调整指令
MOV[DI],AL;
计算结果低位送DI
INCDI
MOV[DI],AH;
计算结果高位进位送DI+1
循环
MOVCX,06
MOVSI,DI;
计算结果送SI
MOVAH,02H;
调用DOS功能号02H送AH
MOVDL,[SI]
ADDDL,30H;
结果转换为ASCII码
显示一位数据
DECSI;
地址减一,继续后面的数据显示
LOOPDISPL;
显示运算结果
MOVAX,4C00H;
返回DOS
ENDSTART
六、DOS功能调用
在DOS软中断指令中最常用的是系统功能调用(INT21H),主
要完成文件管理,输入/输出设备控制,系统参数操作等等。
它本
身包含80多个子程序,每个字程序对应一个功能号,其编号为0,62H。
此次课程设计用到的几个常用DOS系统功能调用。
1)键盘显示并回显(01H号功能)。
此功能程序将扫描键盘并等待输入一个字符,直到按下一个键(输入一个字符),先检查是否有Ctrl+Break键,若是则退出,否则把字符的ASC?
码送入寄存器AL,并在屏幕上显示该字符。
2)在屏幕显示一个字符(02H号功能)。
该功能要求的入口参数为:
将将要显示的字符的ASC?
码存入DL,功能号存入AH。
在执行INT21H时,会把DL寄存器中的ASC?
码字符送到屏幕显示。
02H号功能可显示任意字符,如果DL。
09H号功能不能显示‘,’符号,所以02H号功能可作为09H号功能的补充。
3)字符串显示(09H号功能)。
09H号功能子程序将指定的内存缓冲区中的字符串送屏幕显示。
要现实的字符串必须事先存放在内存数据区中,且字符串以‘,’作为结束标志,除此之外,还需要把存放待显示字符串的内存首地址分别存入DS和DX中。
也可以将非显示字符(如:
回车,换行)的ASC?
码(如:
0AH,0DH)插入字符串中。
4)读入字符串操作(0AH号功能)。
这个功能子程序入口参数是DS:
DX=输入缓冲区首地址。
5)返回操作系统(4CH号功能)。
这个功能子程序无入口参数,结束当前正在执行的程序,并返回操作系统,屏幕上显示操作系统提示符。
七、部分指令介绍
1、AAA是对BCD码的加法十进制进行调整,用于对两个非组合的BCD码相加的结果进行调整,产生一个非组合的BCD码。
2、AAM指令总是跟在乘法指令之后,对两个非组合BCD码相乘结果进行调整,最后得到一个正确的非组合BCD码结果。
3、EQU:
标号赋值伪指令,代表数据、数据地址或程序地址。
4、DB:
伪指令,是用来定义字节类型的伪变量
八、实验结果
九、实验总结及体会
通过此次实验,我查阅了相关资料,学习汇编语言,了解了汇编语言的编程思路,同时还学到一些DOS功能以及其调用方式。
从汇编语言的编程思路上来看,汇编的编程思路一般是基于最基础的原理,易理解,这样就会产生较清晰的编程思路,但是在编程上还是有些吃力。
一方面与自身编程经历少有关外,还有一方面就是没有很系统地掌握这门计算机语言,对计算机内部运行机制的理解还不到位,感觉很简单,却不知道从何下手,知道如何实现部分功能,却不能系统地联系起来,可以说,只能写程序段,不熟悉怎么写程序。
此次实验最大的收获就是了解并学习了DOS功能。
这是我们上课没有涉及到的,感觉很新鲜,觉得这是汇编很关键的地方,可以大大减轻用户的编程负担,使用起来也很简单方便。
有了这些调用这些DOS功能号可使编写的程序简单,易读,代码紧凑,调
试也方便。
而且,我们可以利用DOS的这些功能实现更便捷更广泛的功能。
例如,我们可以适当修改程序,增加一个键盘输入字符并显示的功能号,使得我们可以从键盘输入两个十进制数来实现这两个数的乘积,而不是每次要计算就要修改DARA1和DATA2中的数。
另外,此程序对溢出的结果无法显示,那么,我们可以修改程序,判断乘数被乘数的范围,如果溢出,屏幕显示的因溢出引起的错误,
篇三:
微机原理实验报告
实验报告
课程名称:
实验名称:
班级
学号
姓名
指导教师李北明
实验一两个多位十进制数相加实验
1、学习数据传送和算术运算指令的用法。
2、熟悉在pc机上建立、汇编、链接、调试和运行汇编语言程序的过程。
1、将两个五位十进制相加。
要求加数和被加数均以ASCII码形
式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低
位在前),结果送回DATA1处。
2,改变程序手动输入2个数相加
三、实验程序
原程序
CRLFMACRO;
建立宏指令CRLF
MOVDL,0DH
MOVAH,02H
MOVDL,0AH
ENDM
DATA1DB32H,33H,34H,35H,36H;
第一个数据(作为被加数)
DATA2DB31H,32H,33H,34H,34H;
第二个数据(作为加数)DATA
ENDS
堆栈段
STADB20DUP(?
TOPEQULENGTHSTA
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2
MOVBX,05
CALLDISPL;
显示被加数
CRLF
MOVSI,OFFSETDATA1
显示加数
MOVDI,OFFSETDATA2
CALLADDA;
加法运算
MOVBX,05;
显示结果
CALLDISPL
DISPLPROCNEAR;
显示子功能
DS1:
MOVDL,[SI+BX-1];
显示字符串中一字符
DECBX;
修改偏移量
JNZDS1
RET
DISPLENDP
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
AD1:
SUBBYTEPTR[SI+BX-1],30H
SUBBYTEPTR[DI+BX-1],30H
DECBX
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,05;
包括进位,共五位
CLC;
清位进位
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL;
带进位相加
AAA;
非组合BCD码的加法调整
MOV[SI],AL;
结果送被加数区
INCSI
INCDI;
指向下一位
LOOPAD2;
AD3:
ADDBYTEPTR[SI+BX-1],30H
ADDBYTEPTR[DI+BX-1],30H
JNZAD3
ADDAENDP
手动输入相加
CRLFMACRO
MOVDL,0DH
MOVDL,0AH
DATASEGMENT
DATA1DB20DUP(?
DATA2DB20DUP(?
DATAENDS
TOPEQULENGTHSTA
CODESEGMENT
ASSUMECS:
CALLINPUT
MOVSI,OFFSETDATA2MOVBX,06CALLDISPL
MOVSI,OFFSETDATA1MOVBX,06
MOVDI,OFFSETDATA2CALLADDAMOVSI,OFFSET
DATA1MOVBX,06
MOVAX,4C00HINT21H
DISPLPROCNEARDSI:
MOVDL,[SI+BX-1]INT21HDECBX
JNZDSI
MOVBX,06
SUBBYTEPTR[SI+BX-1],30HSUBBYTEPTR[DI+BX-1],30H