微机原理设计实验之两个数相乘
课程设计题目:两个数相乘
一、实验目的
1、领会汇编语言的编程思想;
2、掌握汇编语言的指令,加深乘法指令和循环指令的用法;
3、学会DOS功能的调用。
二、实验内容
实现两个十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、实验原理
本实验设计A、B两个数相乘。
巧妙地运用了数学中的乘法原理,将B的低位和A的最低位相乘得到的数的低位存到AL中,这个数的进位存到AH中,再用B的低位和A的次低位相乘,得到一个数,这个数的低位和上一次的进位相加。
循环此过程直到到B与A的最高位相乘结束,并与上一次结果的进位相加,得到最后的结果。
四、程序设计流程图
(此处画上是实验纸上的流程图)
五、实验程序
DATA SEGMENT ;定义数据段
DATA1 DB 32H,39H,30H,35H,34H ;用ASCII码表示被乘数45092
DATA2 DB 34H ;用ASCII码表示乘数4
MES1 DB '*','$'
MES2 DB '=','$'
BUF DB 'Result$'
RESULT DB 6 DUP(00H) ;定义存放结果的数据缓冲区,6个字节长,初值为0
DATA ENDS ;数据段结束
STACK SEGMENT ;定义堆栈段
STA DB 20 DUP(?) ;为变量STA分配20个字节的空间TOP EQU LENGTH STA
;返回利用DUP定义的数组元素的个数到TOP,TOP=20
STACK ENDS ;堆栈段结束
CODE SEGMENT ;定义代码段
ASSUME CS: CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA
MOV DS,AX ;DS→AX
MOV AX,STACK
MOV SS,AX ;SS→STACK
MOV SP,TOP ;栈顶指针指向TOP
MOV DX,OFFESET BUF
MOV AH,9 ;DOS功能号09H送AH
INT 21H ;显示字符串‘please input ’
LEA SI,DATA1 ;被乘数首地址送SI
MOV BX,05H
L1: MOV AH,02H ;DOS功能号02H送AH
MOV DL,[SI+BX-1] ;被乘数送DL
INT 21H ; DOS功能号调用(显示器输出)
DEC BX
JNZ L1
MOV AH,09H ; DOS功能号09H送AH
LEA DX,MES1 ;MES1的偏移地址送DX
INT 21H ; DOS功能号调用(显示字符串)
LEA SI,DATA2 ;乘数地址送SI
MOV AH,02H
MOV DL,[SI] ;乘数送DL
INT 21H ;显示乘数
MOV AH,09H
LEA DX,MES2 ; MES2的偏移地址送DX
INT 21H
MOV SI,OFFSET DATA2
MOV BL,[SI] ;DATA2中的乘数送BL
AND BL,00001111B ;屏蔽乘数高4位,ASCII码转换为十六进制
MOV SI,OFFSET DATA1 ;被乘数偏移地址送SI
MOV DI,OFFSET RESULT ;运算结果偏移地址送DI
MOV CX,05 ;设置循环次数
LOOP1: MOV AL,[SI] ;被乘数送AL
AND AL,00001111B ;屏蔽被乘数高4位,ASCII码转换为十六进制 INC SI
MUL BL ;AL * BL送AX
AAM ;乘法十进制调整
ADD AL,[DI] ;结果低位与前次计算的进位相加
AAA ;BCD码加法十进制调整指令
MOV [DI],AL ;计算结果低位送DI
INC DI
MOV [DI],AH ;计算结果高位进位送DI+1
LOOP LOOP1 ;循环
MOV CX,06
MOV SI, DI ;计算结果送SI
DISPL:MOV AH,02H ;调用DOS功能号02H送AH
MOV DL,[SI]
ADD DL,30H ;结果转换为ASCII码
INT 21H ;显示一位数据
DEC SI ;地址减一,继续后面的数据显示
LOOP DISPL ;显示运算结果
MOV AX,4C00H ;返回DOS
INT 21H ;结束
CODE ENDS
END START
六、DOS功能调用
在DOS软中断指令中最常用的是系统功能调用(INT 21H),主要完成文件管理,输入/输出设备控制,系统参数操作等等。
它本身包含80多个子程序,每个字程序对应一个功能号,其编号为0~62H。
此次课程设计用到的几个常用DOS系统功能调用。
1)键盘显示并回显(01H号功能)。
此功能程序将扫描键盘并等待输入一个字符,直到按下一个键(输入一个字符),先检查是否有Ctrl+Break键,若是则退出,否则把字符的ASCⅡ码送入寄存器AL,并在屏幕上显示该字符。
2)在屏幕显示一个字符(02H号功能)。
该功能要求的入口参数为:将将要显示的字符的ASCⅡ码存入DL,功能号存入AH。
在执行INT 21H时,会把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中的数。
另外,此程序对溢出的结果无法显示,那么,我们可以修改程序,判断乘数被乘数的范围,如果溢出,屏幕显示的因溢出引起的错误,。