微机原理设计实验之两个数相乘
- 格式:doc
- 大小:39.50 KB
- 文档页数:4
3. 乘法指令MUL,IMUL,AAM乘法指令包括无符号数乘法指令MUL、有符号数乘法指令IMUL和乘法的十进制调正指令AAM。
8088/8086CPU乘法指令能实现字节乘法和字的乘法。
字节乘法的乘积为16位存放在AX中,字的乘法的乘积为32位存放在DX:AX。
指令的目的操作数采用隐含寻址方式。
(1)无符号数乘法指令MUL指令格式:MUL src功能:如果src为字节类型,累加器AL与src相乘,结果存在AX中;如果src为字类型累加器AX与src相乘,结果存在DX:AX中。
说明:两个乘数的数据类型要相同,指令影响标志位CF,OF位。
例如:MUL AH ;AL×AH 结果保存在AX中。
MUL BX ;AX×BX结果保存在DX:AX中。
MUL BYTE PTR[SI] ;AL×[SI]结果保存在AX中。
MUL WORD PTR[BX+DI] ;AX×[BX+DI]结果保存在DX:AX中。
字节相乘的乘积在AX中,如果标志位CF=OF=1,表明AH不为0;字相乘的乘积在DX:AX中,如果标志位CF=OF=1,表明乘积的高位DX不为0。
(2)有符号数乘法指令IMUL指令格式:IMUL src功能:指令的功能和用法与MUL指令相同,只是操作数为带符号数,结果也是带符号数。
说明:指令影响标志位CF、OF位。
如果标志位CF=OF=0,表明乘积的高位部分是低位的符号扩展,可以忽略。
如果标志位CF=OF=1,表明DX含有乘积的高位,不能忽略。
(3)乘法的十进制调正指令AAMAAM指令完成AL中数的调正。
使用AAM的前提是两个非压缩BCD码相乘,乘积在AL中,AH=0。
指令格式:AAM功能:把AL寄存器的内容除以0AH,商存在AH中,余数存在AL中。
例如:MOV AL, 8MOV BL, 7MUL BLAAM ;AH=5,AL=64. 除法指令DIV,IDIV,CBW,CWD,AAD除法指令包括无符号数除法指令DIV,带符号数除法指令IDIV。
计算机组成原理实验报告姓名学号、班级、实验题目运算器部件实验乘法器一、实验目的掌握乘法器以及booth乘法器的原理二、实验原理乘法计算步骤:(1)从右到左用乘数的每一位乘以被乘数,每一次乘得的中间结果比上一次的结果往左移一位。
(2)积的位数比被乘数和乘数的位数要多的多。
事实上,如果我们忽略符号位,n位的被乘数和m位的乘数相乘的结果的位数有(n+m)位。
因此,乘法必须象加法那样处理溢出问题,如果两个32位的数相乘,积也只有32位的时候,就会出现溢出。
在上面的例子中,我们把十进制数的各位限制为0或1。
因此,每一步的乘法相当简单:(1)如果乘数位是1,则简单的复制被乘数到合适的位置(1×被乘数);(2)如果乘数位是0,则在合适的位置置0因为二进制数的各位是0或1,所以与上面情况类似。
一个有效的计算有符号数乘法的是Booth算法,算法的新颖之处在于减法也可以用于计算乘积。
假定210×610,或者说00102×01102:0 0 1 0X 0 1 1 0+ 0 0 0 0 移位(乘数位为0) + 0 0 1 0 相加(乘数位为1) + 0 0 1 0 相加(乘数位为1) + 0 0 0 0 移位(乘数位为0) 0 0 0 0 1 1 0 0Booth发现加法和减法可以得到同样的结果。
例如,610=-210+ 810或者 01102=-00102+ 10002因为在当时移位比加法快得多,所以Booth发现了这个算法。
Booth算法的关键在于把1分类为开始、中间、结束三种。
当然一串0的时候加法减法都不做。
因此,总结1的分类情况有4种如表2.4所示:表2.4 1的分类当前位当前位右边的位分类1 0 1的开始1 1 1的中间0 1 1的结束0 0 0的中间Booth算法则是根据乘数的相邻2位来决定操作,第一步根据相邻2位的4种情况来进行加或减操作,第二步仍然是将积寄存器右移。
算法描述如下:(1)根据当前位和其右边的位,做如下操作:00:0的中间,无任何操作;01:1的结束,将被乘数加到积的左半部分;10:1的开始,积的左半部分减去被乘数;11:1的中间,无任何操作。
实验报告课程名称:《微机原理》实验第 3次实验实验名称:宏命令与子程序的区别实验时间: 2015 年 10 月 13 日实验地点: XXXXXX组号__________学号: XXXX姓名: XXX指导老师: XX评定成绩:___________微机原理实验4南京大学工程管理学院一、实验设备:计算机二、实验用时:4小时三、实验内容:1.单步运行实例函数 NO3_Mpy_8 ,了解单字节无符号数乘法的实现方法。
2.编写子程序 Mpy_16 ,实现双字节无符号数乘法。
自行定义变量,其中:ACCALO ; 存放乘数低8 位ACCAHI ; 存放乘数高8 位ACCBLO ; 存放被乘数低 8 位和乘积第16~ 23位ACCBHI ; 存放被乘数高8 位和乘积第24~31位ACCCLO ; 存放乘积第0~7位ACCCHI ; 存放乘积第8~ 15位编写 Main 主程序,使用乘数0x4015 和被乘数 0x3321 对编写的子程序进行测试,结果应为0x0CCC71B5。
3.编写宏命令 Mpy_16 ,实现单字节无符号数乘法。
编写 Main 主程序调用宏命令并对运算结果进行测试。
4.使用反汇编工具 Disassembly Listing 单步运行程序,观察子程序与宏命令的差异。
四、实验报告要求:1.程序框图和源程序清单。
2.分析宏扩展过程,说明宏与子程序的差别。
五、实验结果:1、程序框图(1)子程序 Mpy_16子程序调用初始化循环计数器TEMP将乘数 ACCBHI 、ACCBLO 复制到 MDHI 、MDLO中ACCBHI 、 ACCBLO 、ACCCHI 、 ACCCLO 清零MDHI 、 MDLO 算数右移一位,最低位进入CC=1?否是ACCAHI 、 ACCBHI 、ACCALO 、 ACCBLO 分别相加,结果放入ACCBHI 、 ACCBLO 中ACCCHI 、 ACCCLO 带进位位右移,最低位放入CACCBHI 、 ACCBLO 带进位位右移,最低位放入C中中TEMP=TEMP-1否TEMP=0?是子程序返回(2)宏命令 Mpy_16开始初始化循环计数器TEMP将乘数 ACCBHI 、ACCBLO 复制到 MDHI 、MDLO中ACCBHI 、 ACCBLO 、ACCCHI 、 ACCCLO 清零MDHI 、 MDLO 算数右移一位,最低位进入CC=1?否是ACCAHI 、 ACCBHI 、ACCALO 、 ACCBLO 分别相加,结果放入ACCBHI 、 ACCBLO 中ACCCHI ACCBHI 、 ACCCLO 、ACCBLO带进位位右移,最低位放入带进位位右移,最低位放入中中CC TEMP=TEMP-1否TEMP=0?是结束2、源程序清单(1)子程序 Mpy_16list p=16f877A; list directive to define processor#include <p16f877A.inc> ;processor specific variable definitions__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFFACCALO EQU0x20 ;存放加数低 8 位ACCAHI EQU0x21 ;存放加数高8 位ACCBLO EQU0x22 ;存放被加数低8 位ACCBHI EQU0x23 ;存放被加数高 8 位ACCCLO EQU 0x24;ACCCHI EQU 0x25;MDLO EQU 0x26;MDHI EQU 0x27;TEMP EQU0x28 ;临时寄存器;双字节加法子程序,入口地址 ACCB+ ACCA,出口地址 ACCORG0x0000;复位入口地址nop;兼容ICD调试工具,必须加nopgoto Main;跳转至Main函数MainMOVLW 0x15;MOVWF ACCALO;MOVLW 0x40;MOVWF ACCAHI;MOVLW 0x21;MOVWF ACCBLO;MOVLW 0x33;MOVWF ACCBHI;CALL MPY_16;NOP;GOTO $;ORG 0x0100MPY_16CALL SETUP;MLOOPBCF STATUS, C;清进位位RRF MDHI; MD右移RRF MDLO;BTFSC STATUS, C;判断是否需要相加CALL Add_16;加乘数至MB RRF ACCBHI;右移部分乘积RRF RRF RRF ACCBLO; ACCCHI; ACCCLO;DECFSZ GOTO RETURN TEMPMLOOP;;;乘法完成否?否,继续求乘积子程序返回SETUPMOVLW.16;初始化TEMP 寄存器MOVWF TEMPMOVF ACCBLO, W;乘数送MDMOVWF MDLO;MOVF ACCBHI,W;MOVWF MDHI;CLRF ACCBLO;清MBCLRF ACCBHI;CLRF ACCCLO;清MCCLRF ACCCHI;RETURN;子程序返回Add_16MOVF ACCALO, w ;ACCB和ACCA低半字节相加ADDWF ACCBLO , f ;BTFSC STATUS, C;有进位否?INCF ACCBHI;有,ACCB高字节加1,再加ACCAHIMOVF ADDWF ACCAHI, wACCBHI, f; ACCA;、ACCB高半字节相加RETURN;子程序返回END;(2)宏命令 Mpy_16list p=16f877A; list directive to define processor#include <p16f877A.inc> ;processor specific variable definitions__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFFMPY_16macro ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,MDHI1,MDLO1 ,TEMP1;SETUPACCALO1,ACCAHI1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,MDHI1,MDLO1 ,TEMP1;MLOOPBCF STATUS, C;清进位位RRF MDHI1; MD右移RRF MDLO1;BTFSS STATUS, C;判断是否需要相加GOTO LOOP;Add_16ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,MDHI1,MDLO1 ,TEMP1;加乘数至MBLOOPRRF ACCBHI1;右移部分乘积RRF ACCBLO1;RRF ACCCHI1;RRF ACCCLO1;DECFSZ TEMP1;乘法完成否?GOTO MLOOP;否,继续求乘积ENDM;子程序返回SETUP macroACCALO2,ACCAHI2,ACCBLO2,ACCBHI2,ACCCLO2,ACCCHI2,MDHI2,MDLO2 ,TEMP2;MOVLW .16;初始化TEMP寄存器MOVWF TEMP2MOVF ACCBLO2, W;乘数送MDMOVWF MDLO2;MOVF ACCBHI2,W;MOVWF MDHI2;CLRF ACCBLO2;清MBCLRF ACCBHI2;CLRF ACCCLO2;清MCCLRF ACCCHI2;ENDM;子程序返回Add_16 macroACCALO3,ACCAHI3,ACCBLO3,ACCBHI3,ACCCLO3,ACCCHI3,MDHI3,MDLO3 ,TEMP3;MOVF ADDWF ACCALO3, w ;ACCBACCBLO3 , f ;和 ACCA低半字节相加BTFSC STATUS, C;有进位否?INCF ACCBHI3;有,ACCB高字节加1,再加ACCAHIMOVF ADDWF ACCAHI3, w; ACCAACCBHI3, f ;、ACCB高半字节相加ENDM;子程序返回ACCALO EQU0x20 ;存放加数低 8 位ACCAHI EQU0x21 ;存放加数高 8 位ACCBLO EQU0x22 ;存放被加数低8 位ACCBHI EQU0x23 ;存放被加数高8 位ACCCLO EQU0x24;ACCCHI EQU0x25;MDLO EQU 0x26;MDHI EQU 0x27;TEMP EQU 0x28 ;临时寄存器;双字节加法子程序,入口地址 ACCB+ ACCA,出口地址 ACC ORG0x0000;复位入口地址nop;兼容ICD 调试工具,必须加nop goto Main;跳转至Main函数MainMOVLW 0x15;MOVWF ACCALO;MOVLW 0x40;MOVWF ACCAHI;MOVLW 0x21;MOVWF ACCBLO;MOVLW 0x33;MOVWF ACCBHI;MPY_16ACCALO,ACCAHI,ACCBLO,ACCBHI,ACCCLO,ACCCHI,MDHI,MDLO,TEMP; NOP;GOTO $;END;3、程序运行结果截图(1)子程序 Mpy_16子程序运行结果(2)宏命令 Mpy_16宏指令运行结果4、分析宏扩展过程,说明宏与子程序的差别(1)子程序 Mpy_16 的反汇编结果子程序的反汇编代码1子程序的反汇编代码2(2)宏命令 Mpy_16 的反汇编结果00000000NOP00012802GOTO 0x200023015MOVLW 0x15000300A0MOVWF 0x2000043040MOVLW 0x40000500A1MOVWF 0x2100063021MOVLW 0x21000700A2MOVWF 0x2200083033MOVLW 0x33000900A3MOVWF 0x23000A3010MOVLW 0x10000B00A8MOVWF 0x28000C0822MOVF 0x22, W000D00A6MOVWF 0x26000E0823MOVF 0x23, W000F00A7MOVWF 0x27001001A2CLRF 0x22001101A3CLRF 0x23001201A4CLRF 0x24001301A5CLRF 0x2500141003BCF 0x3, 000150CA7RRF 0x27, F00160CA6RRF 0x26, F00171C03BTFSS 0x3, 00018281F GOTO 0x1f00190820MOVF 0x20, W001A07A2ADDWF 0x22, F001B1803BTFSC 0x3, 0001C0AA3INCF 0x23, F001D0821MOVF 0x21, W001E07A3ADDWF 0x23, F001F0CA3RRF 0x23, F00200CA2RRF 0x22, F00210CA5RRF 0x25, F00220CA4RRF 0x24, F00230BA8DECFSZ 0x28, F00242814GOTO 0x1400250000NOP00262826GOTO 0x2620072394CALL 0x394(3)宏扩展过程宏扩展只是用原来宏定义中的若干条汇编指令代替程序中的“一条”宏指令插入到此宏指令位置处,进行直接替换功能。
两个数相乘的简便运算规律两个数相乘的简便运算规律是指在进行两个数的乘法运算时,可以运用一些技巧和方法来简化计算过程,提高计算效率和准确性。
这些规律包括以下几种:1.乘法分配律:乘法分配律是数学中的一个基本运算规律,它表示两个数的和与一个数相乘,等于将这两个数分别与这个数相乘后再求和。
即 (a + b) × c = a × c + b × c。
这个规律可以用于简化乘法计算,例如将一个较大的数拆分成两个较小的数,然后再与另一个数相乘。
2.乘法结合律:乘法结合律表示在三个数的乘法运算中,无论它们的顺序如何组合,其结果都是相同的。
即 (a × b) × c = a × (b × c)。
这个规律可以用于调整乘法运算的顺序,使得某些计算更易于执行。
3.乘法交换律:乘法交换律表示两个数的乘法运算不依赖于它们的顺序,即 a× b = b × a。
这个规律可以用于调整乘法运算的顺序,使得某些计算更易于执行。
4.乘法逆元:对于任何非零数a和非整数n,存在一个数b,使得a × b = n。
这个数b称为a关于n的乘法逆元。
利用乘法逆元可以快速计算出一个数的倒数与另一个数的乘积,从而简化了计算过程。
5.平方差公式:平方差公式表示两个数的平方差等于它们的和乘以它们的差。
即 a^2 - b^2 = (a + b) × (a - b)。
这个规律可以用于简化平方差计算,例如将一个较大的数的平方与另一个数的平方相减。
这些简便运算规律在数学、科学和工程等领域都有广泛的应用,可以帮助我们快速准确地计算出复杂数学表达式的值。
在实际应用中,可以根据具体问题选择合适的简便运算方法,以简化计算过程和提高效率。
深圳大学实验报告课程名称:微机计算机技术实验项目名称:运算类编程实验学院:信息工程学院专业:电子信息工程指导教师:报告人:学号:2009100000班级:<1>班实验时间:2011年5月5日实验报告提交时间:2011年5月17日教务处制一、实验目的1、掌握使用运算类指令编程及调试方法。
2、掌握运算类指令对各状态标志位影响及其测试方法。
3、学习使用软件监视变量的方法。
二、实验设备PC机一台,TD-PITE实验装置。
三、实验要求1、计算X+Y=Z,将结果Z存入某存储单元。
2、计算X-Y=Z, 其中X、Y、Z为BCD码。
3、实现十进制数的乘法运算,被乘数与乘数均以BCD码的形式存放在内存中,乘数为1位,被乘数为5位,结果为6位。
四、方法与步骤1、计算X+Y=Z本实验是双精度的加法运算,编程是可利用累加器AX,先求出低16位的和,并将运算结果存入低地址的存储单元,然后求高16位的和,将结果存入高地址存储单元中。
由于低16位运算后可能向高位产生进位,因此高16位运算时用ADC指令,这样在低16位相加运算有进位时,高位相加会加上CF中的1.实验程序如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSPUBLIC XH,XL,YH,YL,ZH,ZLDATA SEGMENTXL DW ?XH DW ?YL DW ?YH DW ?ZL DW ?ZH DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,XLADD AX,YLMOV ZL,AXMOV AX,XHADD AX,YHMOV ZH,AXJMP STARTMOV AH,4CHINT 21HCODE ENDSEND START2、计算X-Y=Z实验代码如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSPUBLIC X,Y,ZDATA SEGMENTX DW ?Y DW ?Z DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AH,00HSAHFMOV CX,0002HMOV SI,OFFSET XMOV DI,OFFSET ZA1: MOV AL,[SI]SBB AL,[SI+02H]DASPUSHFAND AL,0FHPOPFMOV [DI],ALINC DIINC SILOOP A1JMP STARTCODE ENDSEND START3、乘法运算实验部分代码:五、实验过程(1)加法运算1、编写程序,编译、链接无误后装入系统2、程序装载完成后,点击‘变量区’至变量监视窗口3、点击,将变量XH,XL,YH,YL,ZH,ZL添加到变量监视窗口,修改XH,XL,YH,YL的值,如右图:4、在JMP START语句行设置断点,运行程序5、当程序遇到断点后停止运行,查看变量监视窗口,如下图所示:6、多次次改变XH、XL、YH、YL的值,观察其变化,验证程序的功能。
两位数乘法的基本原理解析在学习数学的过程中,乘法是一个重要的基础知识点。
而对于两位数的乘法,掌握其基本原理是十分关键的。
本文将为大家详细解析两位数乘法的基本原理,以帮助孩子们更好地理解和掌握这一概念。
一、两位数乘法的基本定义在乘法运算中,两个数相乘所得的积称为乘积。
对于两位数乘法,指的是由两个两位数相乘得到的结果。
例如,12乘以34的乘积即为408。
二、分解个位数与十位数的运算两位数乘法的基本原理是将一个两位数分解为个位数和十位数,然后与另一个两位数进行乘法运算,最后将结果相加得到最终的乘积。
1. 以12乘以34为例进行分解计算:十位数:12的十位数为1,34的十位数为3,将两个十位数相乘得到结果3。
个位数:12的个位数为2,34的个位数为4,将两个个位数相乘得到结果8。
2. 计算得到的结果3和8,分别代表了十位数和个位数上的乘积。
将其放在正确的位置上,即十位数上的3放在结果的十位上,个位数上的8放在结果的个位上,得到最终的乘积408。
三、十位数与十位数的运算当两个两位数的十位数相乘时,可以先将十位数进行相乘,然后再将结果乘以10。
以26乘以28为例:1. 十位数:26的十位数是2,28的十位数是2,将两个十位数相乘得到结果4。
2. 将结果4乘以10,得到40。
四、个位数与个位数的运算当两个两位数的个位数相乘时,可以直接进行相乘,得到结果后放在最后的两位上。
以36乘以73为例:1. 个位数:36的个位数是6,73的个位数是3,将两个个位数相乘得到结果18。
2. 将结果18放在最后的两位上,即得到最终的乘积为2638。
综上所述,掌握两位数乘法的基本原理非常重要。
通过分解个位数与十位数、十位数与十位数以及个位数与个位数的运算,可以帮助孩子们更好地理解乘法的运算法则。
在实际操作时,可以通过练习习题,逐步提高计算的准确性和速度。
希望本文能对学习两位数乘法的孩子们提供帮助。
《计算机组成原理》课程设计报告课程设计题目:两个数的乘法运算小组成员:….完成日期:第十一周模型机设计实验一、实验目的综合运用所学计算机原理知识,设计并实现较为完整的模型计算机。
其功能为:输入两个数,进行两个正数(二进制4位)的乘法运算,输出结果。
二、实验内容编写程序,运行程序,观察并记录运行结果。
三、实验仪器1、ZY15CompSys12BB计算机组成原理及系统结构教学实验箱一台2、排线若干3、PC机一台四、预备知识1、数据格式8位,其格式如下:其中第7位为符号位,数值表示范围是:-1≤X<127。
2、指令格式模型机设计四大类指令共十六条,其中包括算术逻辑指令、I/O指令、访问存储器、转移指令和停机指令。
(1)算术逻辑指令规定:算术逻辑指令的名称、功能和具体格式见表2—3。
(2)访存指令及转移指令模型机设计2条访存指令,即存数(STA)、取数(LAD),2条转移指令,即无条件转移(负均可)本模型机规定变址寄存器RI指定为寄存器R2。
(3)I/O指令其中,在IN 指令中,addr=01,选中“输入”中的开关组作为输入设备,在OUT指令中,addr=10时,表示选中“输出单元”中的数码块作为输出设备。
(4)停机指令HALT指令,机器码为60H,用于实现停机操作。
3、指令系统复杂模型机共有16条基本指令,其中算术逻辑指令7条,访问内存指令和程序控制指令4条,输入输出指令2条,其它指令1条。
表2-3列出了各条指令的格式、汇编符号、指令功能。
我们依然采用复杂模型机指令系统中的部分指令。
五、实验的机器指令程序如下:地址内容助记符说明00 14 IN R0 ; 作计数器用,00000001→R001 15 IN R1 ; 输入X的值,0000xxxx→R102 05 STA R1 ; X→22H03 2204 15 IN R2 ; 输入Y→R2,0000xxxx→R205 06 STA R2 ; R2→23H06 2307 42 CLR R2 ; R2清零08 06 STA R2 ; 存入结果R2→24H09 240A 02 LAD R2 ; 提取[23H]→R20B 230C 6A RRC R2,R2 ; R2带进位右循环一位→R2 0D 06 STA R2 ; 循环结果→23H0E 230F 02 LAD R2 ; 提取结果S,[24H]→R210 2411 0C BZC [15H] ; 有进位跳转到15H12 1513 08 JMP [18H] ; 无条件跳转到[18H]14 1815 01 LAD R1 ; 提取X→R116 2217 56 ADC R1,R2 ; R1+R2→R218 6A RRC R2,R2 ; R2带进位右循环一位→R219 06 STA R2 ; 循环结果→24H1A 241B70 RLC R0,R0 ; R0带进位左循环一位→R0 1C 0C BZC [20H] ; 有进位跳转到20H1D 201E 08 JMP [0AH] ; 无条件跳转到[0AH]1F 0A20 2A OUT R2 ; 输出R2中的结果21 60 HATL ; 停机22 XX23 XX24 XX六、程序机器指令和微程序以上程序的机器指令如下:$P0014 $P0115 $P0205 $P0322$P0416 $P0506 $P0623 $P0772$P0806 $P0924 $P0A02 $P0B23$P0C6A $P0D06 $P0E23 $P0F02$P1024 $P110C $P1215 $P1308$P1418 $P1501 $P1622 $P1756$P186A $P1906 $P1A24 $P1B70$P1C0C $P1D20 $P1E08 $P1F0A$P202A $P2160微程序如下$M00018108 $M0101ED82 $M0200C050$M0300A004 $M0400E098 $M0501B406$M06959B41 $M07298838 $M0801ED8A$M0901ED8C $M0A00A01E $M0B018001$M0C00201F $M0D019801 $M0E19880F$M0F019801 $M1001ED83 $M11001001$M12030401 $M13018016 $M143D9A01$M1501A205 $M16318207 $M1731820E$M18009001 $M19028401 $M1A05DB81$M1B0180DC $M1C018001 $M1D05DB8D$M1E070A08 $M1F068A09七、复杂模型机的数据通路框图WE图2-7复杂模型机数据通路框图八、复杂模型机实验接线图接到指令单元接到开关单元九、复杂模型机实验流程图十、课程设计总结1、成员总结体会…2、遇到的问题和解决的方法等1)寄存器不够用。
实验名称:汇编语言程序设计实验日期:2023年3月10日实验地点:计算机实验室实验者:张三一、实验目的1. 熟悉汇编语言的基本语法和指令系统。
2. 掌握汇编语言程序设计的基本方法。
3. 通过实验,加深对微机原理的理解。
二、实验内容本次实验主要涉及以下内容:1. 数据传送指令的应用2. 算术运算指令的应用3. 控制转移指令的应用4. 子程序设计三、实验步骤1. 编写一个简单的程序,实现以下功能:(1)将数据0x1234存入寄存器AX;(2)将数据0x5678存入寄存器BX;(3)计算AX和BX的乘积,并将结果存入寄存器DX;(4)将乘积的高16位和低16位分别存入寄存器CX和AX。
2. 编写一个程序,实现以下功能:(1)将数据0x1A2B3C4D存入内存单元[0x1000];(2)从内存单元[0x1000]开始,读取连续4个字节的数据;3. 编写一个程序,实现以下功能:(1)定义一个子程序,实现两个整数的加法运算;(2)在主程序中调用该子程序,实现两个整数的加法运算。
四、实验结果与分析1. 数据传送指令的应用(1)将数据0x1234存入寄存器AX;MOV AX, 0x1234(2)将数据0x5678存入寄存器BX;MOV BX, 0x5678(3)计算AX和BX的乘积,并将结果存入寄存器DX;MUL BX(4)将乘积的高16位和低16位分别存入寄存器CX和AX; MOV CX, DXMOV AX, DX2. 算术运算指令的应用(1)将数据0x1A2B3C4D存入内存单元[0x1000];MOV [0x1000], 0x1A2B3C4D(2)从内存单元[0x1000]开始,读取连续4个字节的数据; MOV AX, [0x1000]MOV BX, [0x1000+2]MOV CX, [0x1000+4]MOV DX, [0x1000+6]MOV AH, 0x0EINT 0x103. 控制转移指令的应用(1)定义一个子程序,实现两个整数的加法运算;ADD procedure:ADD AX, BXRET(2)在主程序中调用该子程序,实现两个整数的加法运算;MOV AX, 0x1MOV BX, 0x2CALL ADDMOV CX, AX五、实验心得通过本次实验,我深刻理解了汇编语言的基本语法和指令系统,掌握了汇编语言程序设计的基本方法。
微机原理实验评分标准微机原理是一门实践性很强的课程,通过实验教学,一方面加强对理论教学中难点知识的理解,另一方面能有效的培养学生的操作技能和应用能力。
为了能合理评估学生实践环节的学习成绩,特制订本标准。
实验成绩以百分制计算,细分为:实验纪律,实验方案、实验过程、实验结果、实验报告五方面进行考核。
各项所占比例详见各实验评分标准。
实验一、用DEBUG调试程序1、实验纪律(15%)①进入实验室按要求签到;(3%)②按组号要求选择各自的计算机号;(3%)③向老师提交实验预习报告;(5%)④正确开启电脑,检查实验设备,并如实填写设备运行记录;(4%)⑤实验过程中若发现做与实验无关的事一次扣除全部纪律分;(15%)2、实验方案(25%)①根据实验要求议定正确的实验方案(含实验原理,实验所涉及的知识点,实验平台的使用方法,实验源程序);(10%)②根据实验方案议定详细的实验步骤和实验操作过程;(10%)③预分析实验过程中每一步的操作结果;(5%)3、实验过程(25%)①正确使用实验平台;(5%)②独立排除实验过程中的源程序中的错误;(10%)③逐条运行DEBUG命令,详细观察运行结果,掌握各命令的功能和使用方法;(10%)4、实验结果(20%)①详细记录实验过程中每一步的结果,并给出结果分析;(10%)②记录实验过程中所碰到的问题及问题解决的方法;(5%)③归纳总结DEBUG各常用命令的使用方法和使用场合;(5%)5、实验报告(15%)①实验报告内容完整充实:(10%)含实验目的,实验原理及实验中所牵涉的相关知识点,实验方案与实验步骤,实验操作方法,实验结果及结果分析,实验小结。
②实验报告书写工整,提交及时;(5%)实验二、两个多位十进制数相加1、实验纪律(15%)①进入实验室按要求签到;(3%)②按组号要求选择各自的计算机号;(3%)③向老师提交实验预习报告;(5%)④正确开启电脑,检查实验设备,并如实填写设备运行记录;(4%)⑤实验过程中若发现做与实验无关的事一次扣除全部纪律分;(15%)2、实验方案(25%)①根据实验要求议定正确的实验方案(含实验原理,实验所涉及的知识点,实验平台的使用方法,实验源程序);(10%)②根据实验方案议定详细的实验步骤和实验操作过程;(10%)③预分析实验过程中每一步的操作结果;(5%)3、实验过程(25%)①正确使用实验平台;(5%)②独立排除实验过程中的源程序中的错误;(10%)③采用断点调试,单步调试方法,观察指令的执行情况,观察FLAG寄存器的变化,仔细观察加法指令和调整指令的执行情况;(10%)4、实验结果(20%)①详细记录实验过程中每一步的结果,并给出结果分析;(10%)②记录实验过程中所碰到的问题及问题解决的方法;(5%)③归纳总结DEBUG各常用命令的使用方法和使用场合;(5%)5、实验报告(15%)①实验报告内容完整充实:(10%)含实验目的,实验原理及实验中所牵涉的相关知识点,实验方案与实验步骤,实验操作方法,实验结果及结果分析,实验小结。
模拟乘法器电路原理
乘法器电路是一种用于计算两个输入数的乘积的电子电路。
它由多个逻辑门和电子元件组成,能够将输入信号相乘得到输出信号。
在一个乘法器电路中,通常会有两个输入端和一个输出端。
输入端通常被标记为A和B,分别表示待乘数和乘数。
输出端通常被标记为P,表示乘积。
乘法器电路的工作原理是根据乘法的性质,将每一位的乘积相加得到最后的结果。
具体的实现方式可以有多种,下面介绍一种常见的实现方式。
乘法器电路通常被分为多个级别,每个级别负责计算某一位的乘积。
第一个级别接收A和B的最低位,通过逻辑门或触发器计算出对应的乘积,并将其存储为P的最低位。
然后,每个级别的输出和前一级别输出的进位信号经过逻辑门或触发器进行运算,得到当前级别的乘积和进位信号。
这个过程会一直进行,直到计算完所有位的乘积。
最后,所有级别的乘积和进位信号会被加和,得到最终的输出结果P,即A和B的乘积。
乘法器电路的实现可以使用多种逻辑门和元件,如AND门、OR门、XOR门、D触发器等。
具体的电路设计取决于要求的精度和速度。
需要注意的是,乘法器电路的设计和实现是一项复杂的任务,需要考虑多种因素,如延迟、功耗和精度等。
因此,在实际应用中,通常会使用专门的乘法器芯片,而不是自己设计和制造乘法器电路。
课程设计题目:两个数相乘
一、实验目的
1、领会汇编语言的编程思想;
2、掌握汇编语言的指令,加深乘法指令和循环指令的用法;
3、学会DOS功能的调用。
二、实验内容
实现两个十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、实验原理
本实验设计A、B两个数相乘。
巧妙地运用了数学中的乘法原理,将B的低位和A的最低位相乘得到的数的低位存到AL中,这个数的进位存到AH中,再用B的低位和A的次低位相乘,得到一个数,这个数的低位和上一次的进位相加。
循环此过程直到到B与A 的最高位相乘结束,并与上一次结果的进位相加,得到最后的结果。
四、程序设计流程图
(此处画上是实验纸上的流程图)
五、实验程序
DA TA SEGMENT ;定义数据段
DA TA1 DB 32H,39H,30H,35H,34H ;用ASCII码表示被乘数45092
DA TA2 DB 34H ;用ASCII码表示乘数4
MES1 DB '*','$'
MES2 DB '=','$'
BUF DB 'Result$'
RESULT DB 6 DUP(00H) ;定义存放结果的数据缓冲区,6个字节长,初值为0
DA TA 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,DA TA1 ;被乘数首地址送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,DA TA2 ;乘数地址送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中的数。
另外,此程序对溢出的结果无法显示,那么,我们可以修改程序,判断乘数被乘数的范围,如果溢出,屏幕显示的因溢出引起的错误,。