微机实验 两个多位十进制数相加的实验
- 格式:pdf
- 大小:698.74 KB
- 文档页数:5
深圳大学实验报告课程名称:微机原理及应用实验实验项目名称:多位十进制数加法器设计学院:物理科学与技术学院专业:应用物理指导教师:报告人:学号:班级:应用物理班实验时间:2015-10-19实验报告提交时间:2015-11-02教务处制五、程序说明(预习)七、实验源程序清单(实验后以电子报告形式存储到指定位置)1.源程序路径及文件名:ADD2.ASM ADD1.ASM2.可执行程序路径及文件名:八、上机调试情况说明EMU8086:一:没有键盘录入1.结果显示如下:2.程序运行时的各段地址:3.两个子程序IP入口:4.改变两个加数数值5.子程序格式及其调用方法和宏汇编区别子程序格式:子程序名称PROC NEAR ; 子程序定义; …子程序内容RET ;子程序返回子程序名称ENDP ;子程序结束调用格式:CALL 子程序名称注意事项:1、子程序不能直接传递参数,需要自行定义变量。
2、注意保护现场和恢复现场。
宏汇编与子程序的区别:1、宏汇编有宏展开,子程序没有2、宏汇编可以传递参数。
二:键盘录入DOS:例如:250+250=500例如:62142+63123=125265九、实验结果与分析结果如下:十、实验总结(必备部分,评分重要依据之一)本次实验实则是对实验二的加强巩固基础上,进行更加友好的人机交互设计;通过本次实验不仅在程序中首先把两个加数固定,在实验二的基础上扩展位数,考虑到最高位进位的情况,并最终得出正确结果;后来又通过键盘录入两个加数,增加了人机交互的设计,如此一来,更加加深了对寄存器的使用,汇编语言宏定义,子程序调用以及DOS功能调用的学习。
同时,通过本次实验的学习,更加熟练了EMU8086工具的使用,也把理论课上学习到的汇编操作指令实际操作,对汇编语言的风格加深认识。
MOV DL,BLINT 21HCRLFJMP BEGINERROR:CRLFMOV AH,09H ;显示输入错误LEA DX,STRING3INT 21HCRLFJMP BEGINEXIT:CRLFMOV AH,09H ;显示成功退出LEA DX,STRING4INT 21HMOV AH,4CHINT 21HCODE ENDSEND START(2)请问你的程序能否处理加数和被加数都介于0~65535范围但计算结果超出该范围的情况?如何改进?可以,如图:主要考虑到最高位是否进位,可以设置一个进位变量加以判断。
上机作业二一.实验目的1.熟练把握汇编语言程序设计的方式及上机步骤。
2.把握算术运算指令的应用。
3.把握子程序的设计方式。
4.把握DOS功能的挪用方式。
二.实验仪器586微机一台三.实验内容编写程序求两个十进制数之和,并将和以十进制数的形式送屏幕显示。
编程要求与提示:[1] 从键盘输入两个十进制数(如与),以二进制数形式寄存在ADD1和ADD2为首址的存贮器单元,输入一个十进制数采纳子程序形式。
[2] 和以二进制数的形式存入SUM以下单元。
[3] 将和送到屏幕显示采纳子程序形式。
[4] 实验步骤如下:a. 用全屏幕编辑软件成立源程序。
b.用汇编程序对源程序进行汇编,形成目标程序。
c. 用连接程序对目标程序进行连接形成可执行文件。
d. 用DEBUG对连接通过的可执行程序进行调试。
四.源程序STACK SEGMENT STACK 'STACK'DW 100H DUP(?)TOP L ABEL WORDSTACK ENDSDATA SEGMENTFAKE DW 0KEYBUFFER DB 100DB ?DB 100 DUP(?)BUF DB 8 DUP(?),'$'ADD1 DW ?A1 DW ?ADD2 DW ?A2 DW ?SUM DW ?S1 DW ?STRING1 DB 'PLEASE input decimal data: $' DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AXMOV ES,AXMOV AX,STACK MOV SS,AXLEA SP,TOPCALL INPUT1 CALL TRANS10TO16 MOV ADD1,AX MOV A1,DXCALL DISPCR CALL INPUT1 CALL TRANS10TO16 MOV ADD2,AX MOV A2,DXCALL DISPCR MOV SUM,AX MOV S1,DXADD AX,ADD1 ADC DX,A1MOV S1,DXCALL far ptr ADISPMOV AH,4CHMOV AL,0INT 21HINPUT1 PROC NEARLEA DX,STRING1MOV AH,09HINT 21HMOV AH,0AHLEA DX,KEYBUFFERINT 21HLEA SI,KEYBUFFER+1retINPUT1 endpTRANS10TO16 PROC NEAR PUSH CXPUSH SI; PUSH BX ???XOR DX,DXXOR CX,CXMOV CL,[SI]INC SIMOV AL,[SI]INC SISUB AL,30HDEC CXJCXZ TRANSF2MOV BX,10TRANSF1: CALL MULAXI PUSH DXJO TRANSF_ERRMOV DL,[SI]INC SISUB DL,30HADD AL,DLADC AH,0JC TRANSF_ERRPOP DXLOOP TRANSF1TRANSF2: JMP TRANSF_OK TRANSF_ERR: MOV BX,-1 TRANSF_OK: P OP SIPOP CXretTRANS10TO16 endp MULAXI PROC NEAR PUSH CXPUSH AXMOV AX,DXMUL BXMOV CX,AXPOP AX ;XOR DX,DXMUL BXPUSH AXMOV AX,CXADD AL,DLADC AH,DHMOV DX,AXPOP AXPOP CXretMULAXI endp DISPCR PROC NEAR PUSH AXPUSH DXMOV AH,2MOV DL,0AHINT 21HMOV AH,2MOV DL,0DHINT 21HPOP DXPOP AXretDISPCR endp ADISP PROC FAR PUSH AXPUSH CXPUSH DXPUSH BXLEA SI,BUF+7MOV BX,10000DIV BXPUSH AXMOV AX,DXXOR DX,DXMOV BX,10MOV CX,4L1: DIV BXMOV [SI],DLXOR DL,DLADD BYTE PTR [SI],30H DEC SILOOP L1CMP SI,OFFSET BUF JC L2POP AXMOV CX,4JMP L1L2:LEA DX,BUFMOV AH,09HINT 21HPOP BXPOP DXPOP CXPOP AXretfADISP endpCODE ENDSEND START五、实验体会实验中碰到的问题和解决方式:在这几回的编程实验中,我碰到了许多问题。
多位十进制数加法实验报告实验一两个多位十进制数相加的实验实验一两个多位十进制数相加的实验一、实验目的1、学习数据传送和算术运算指令的用法。
2、熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。
二、实验内容将两个多位十进制数相加。
要求被加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图四、程序清单CRLF MACROMOV DL,0DHMOV AH,02HINT21HMOV DL,0AHMOV AH,02HINT21HENDMDATA SEGMENTDATA1DB 33H,39H,31H,37H,34HDATA2DB 36H,35H,30H,38H,32HDATA ENDSSTACKSEGMENTSTA DB20 DUP(?)TOP EQU LENGTH STASTACKENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV SI,OFFSET DATA2MOV BX,05CALL DISPLCRLFMOV SI,OFFSET DATA1MOV BX,05CALL DISPLCRLFMOV DI,OFFSET DATA2CALL ADDAMOV SI,OFFSET DATA1MOV BX,05CALL DISPLCRLFMOV AX,4C00HINT21HDISPLPROC NEARDS1: MOV AH,02MOV DL,[SI+BX-1]INT21HDEC BXJNZ DS1RETDISPLENDPADDA PROC NEARMOV DX,SIMOV BP,DIMOV BX,05AD1: SUBBYTE PTR [SI+BX-1],30HSUBBYTE PTR [DI+BX-1],30HDECBXJNZAD1MOV SI,DXMOV DI,BPMOV CX,05CLCAD2: MOV AL,[SI]MOV BL,[DI]ADC AL,BLAAAMOV [SI],ALINCSIINCDILOOP AD2MOV SI,DXMOV DI,BPMOV BX,05AD3: ADDBYTE PTR [SI+BX-1],30H ADDBYTE PTR [DI+BX-1],30HDECBXJNZ AD3RETADDA ENDPCODE ENDSEND START五、实验要求1.读懂源程序,写出源程序注释。
深圳大学实验报告课程名称:微机原理及应用实验实验项目名称:多位十进制数加法器设计学院:物理科学与技术学院专业:应用物理指导教师:报告人:学号:班级:应用物理班实验时间:2015-10-19实验报告提交时间:2015-11-02教务处制五、程序说明(预习)七、实验源程序清单(实验后以电子报告形式存储到指定位置)1.源程序路径及文件名:ADD2.ASM ADD1.ASM2.可执行程序路径及文件名:八、上机调试情况说明EMU8086:一:没有键盘录入1.结果显示如下:2.程序运行时的各段地址:3.两个子程序IP入口:4.改变两个加数数值5.子程序格式及其调用方法和宏汇编区别子程序格式:子程序名称PROC NEAR ; 子程序定义; …子程序内容RET ;子程序返回子程序名称ENDP ;子程序结束调用格式:CALL 子程序名称注意事项:1、子程序不能直接传递参数,需要自行定义变量。
2、注意保护现场和恢复现场。
宏汇编与子程序的区别:1、宏汇编有宏展开,子程序没有2、宏汇编可以传递参数。
二:键盘录入DOS:例如:250+250=500例如:62142+63123=125265九、实验结果与分析结果如下:十、实验总结(必备部分,评分重要依据之一)本次实验实则是对实验二的加强巩固基础上,进行更加友好的人机交互设计;通过本次实验不仅在程序中首先把两个加数固定,在实验二的基础上扩展位数,考虑到最高位进位的情况,并最终得出正确结果;后来又通过键盘录入两个加数,增加了人机交互的设计,如此一来,更加加深了对寄存器的使用,汇编语言宏定义,子程序调用以及DOS功能调用的学习。
同时,通过本次实验的学习,更加熟练了EMU8086工具的使用,也把理论课上学习到的汇编操作指令实际操作,对汇编语言的风格加深认识。
MOV DL,BLINT 21HCRLFJMP BEGINERROR:CRLFMOV AH,09H ;显示输入错误LEA DX,STRING3INT 21HCRLFJMP BEGINEXIT:CRLFMOV AH,09H ;显示成功退出LEA DX,STRING4INT 21HMOV AH,4CHINT 21HCODE ENDSEND START(2)请问你的程序能否处理加数和被加数都介于0~65535范围但计算结果超出该范围的情况?如何改进?可以,如图:主要考虑到最高位是否进位,可以设置一个进位变量加以判断。
标准实验报告学生姓名:指导教师:一、实验室名称:二、实验项目名称:综合课程设计——两位十进制数加减法的实现三、实验原理:1、FPGA的矩阵键盘开发板上设计了行列式矩阵编码键盘,规模为4*4,可作为外部输入。
其对应管脚分布如下:2、自由按键电路KEY1 对应P102,KEY2 对应P101。
3、拨码开关板上设计了一组8 位的拨码开关,ON为低电平,OFF为高电平。
拨码开关可供用户输入一些高低电平。
4、键盘扫描及数码显示对键盘的扫描分为三步,首先检测由于没有按键按下,然后在有按键按下的情况下,先进行行扫描找出对应按键是哪行按下,接着是对应的列扫描最终确定是哪一个按键。
给对应的按键赋上预先设定的值连接到数码管便能控制数码管显示。
我们需要如下几个信号来实现编写这一部分程序:key_code,用来控制数码管显示相应的值;row,用来控制行扫描;column,用来控制列扫描。
要利用8个数码管显示8个不同的数字,由于此为动态显示,送到每一段的值都一样,利用显示使能en,来控制亮灭,同时提高显示时钟频率,可以实现8位数码管的不同值显示。
5、去抖利用普通的CASE语句编写的程序会出现按键按下值会一直递增的现象,我们需要一个优化的能够实现对长按下的键只记一次。
需要重新自己设定一个去抖参数。
个人思想如下:设定去抖参数qudou,当没有按键按下时其自动置为0,在检测按键时如果同时检测都qudou=0才做对应键值加1的操作且同时把去抖参数置为1;如此便能够实现。
6、两位十进制加减法实现原理加数和被加数的输入由矩阵键盘扫描完成,具体实现是,利用状态机,一个状态来进行加数的输入然后跳转到另一状态,进行被加数的输入,两个数输入完成后,下一状态为显示结果。
同时需要一位来控制是做加法还是减法。
状态机设计,利用VHDL设计有限状态机分为两个定义,三个进程。
两个定义分别用来定义状态变量以及状态机的状态;三个进程分别用来描述状态寄存器状态,状态转移进程以及状态输出。
实验三两个多位数十进制数相加的实验一、实验目的学习数据传送和算术运算指令的用法。
熟悉在PC机上建立、汇编、链接、调试和运行8086汇编语言程序的过程。
二、实验内容及程序将两个多位数十进制数相加,要求被加数和加数均以ASCⅡ码形式各自顺序存放在以DATA1和DA TA2为首的5个内存单元中,且低位在前,结果送回DA TA1处。
编程要求与提示:[1] 两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。
[2] 和以压缩十进制数的形式存入SUM以下单元。
[3] 将和送到屏幕显示部分功能的实现采用子程序的形式。
[4] 实验步骤如下:a. 用全屏幕编辑软件建立源程序。
b.用masm.exe汇编程序对源程序进行汇编,形成目标程序。
c. 用link.exe连接程序对目标程序进行连接形成可执行文件。
d. 用DEBUG对连接通过的可执行程序进行调试。
三、参考流程STACK SEGMENT STACK 'STACK'DW 100H DUP(?)STACK ENDSDA TA SEGMENTADD1 DD 12678532H ;加数以组合十进制形式存放在双字单元ADD2 DD 21736543HSUM DD ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,ES:DATA,SS:STACKSTART: MOV AX,DA TAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SI,ADD1LEA DI,ADD2LEA BX,SUMMOV AL,[SI]ADD AL,[DI] ;最低位的一个字节相加DAA ;加法组合BCD码调整MOV [BX],AL ;结果存放在SUM第一个字节MOV AL,[SI+1] ;第二个字节相加ADC AL,[DI+1]DAAMOV [BX+1],ALMOV AL,[SI+2]ADC AL,[DI+2]DAAMOV [BX+2],ALMOV AL,[SI+3]ADC AL,[DI+3]DAAMOV [BX+3],ALMOV DL,00 ;最高位字节有进位则显示"01"ADC DL,00CALL DISPSUMMOV AH,4CH ;返回DOSINT 21HDISPSUM PROC NEAR ;结果显示子程序PUSH AXPUSH BXPUSH CXPUSH SIMOV SI ,4PUSH DXMOV CX,5LAB:PUSH CXPUSH BXMOV AL,DLMOV BL,DLMOV CL,4 ;显示高位字节SHR AL,CLADD AL,30HMOV AH,02MOV DL,ALINT 21H ;显示一位字符AND BL,0FH ;显示低位字节ADD BL,30HMOV AH,02MOV DL,BLINT 21HPOP BXPOP CXDEC SIMOV DL,[BX][SI] ;结果显示LOOP LABPOP DXPOP SIPOP CXPOP BXPOP AXRETDISPSUM ENDPCODE ENDSEND START。
实验一、两个多位十进制数相加的实验1、实验目的(1).学习数据传送和算术运算指令的用法。
(2).熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。
2、实验内容将两个多位十进制数相加。
要求被加数均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回DATAl处。
3、程序框图4、参考程序:DATAS SEGMENTDAT1 DB 5 DUP (0)DAT2 DB 5 DUP (0)DAT3 DB 6 DUP(0)JH DB'+','$'HX DB'_______','$';此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV DL,20H; 输入空格用以竖式对齐MOV AH,02HINT 21HLEA BX,DAT1MOV CX,5INADD1: MOV AH,01HINT 21HMOV [BX],ALINC BXLOOP INADD1MOV DL,0AH; 换行MOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HLEA DX,JH; 输出加号MOV AH,09HINT 21HLEA SI,DAT2MOV CX,5INADD2: MOV AH,01HINT 21HMOV [SI],ALINC SILOOP INADD2MOV DL,0AH;换行MOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HLEA DX,HX; 输出横线MOV AH,09HINT 21HMOV DL,0AH;换行MOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21H;以下计算结果LEA BX,DAT1+4LEA SI,DAT2+4LEA DI,DAT3+5MOV CX,5CLC ;清除CF标志位L1: MOV AL,[BX]ADC AL,[SI]AAAPUSHFOR AL,30H; 将AL转换为ASCII码POPFMOV [DI],ALDEC DIDEC BXDEC SILOOP L1MOV CL,6;6位循环6次JNC OUT1;没有进位直接输出MOV byte ptr [DI],31H;有进位给最高位赋1 ;以下输出显示OUT1:MOV DL,[DI]INC DIMOV AH,02HINT 21HLOOP OUT1MOV AH,4CHINT 21HCODES ENDSEND START。
实验一两个多位十进制数相加实验一实验目的1学习数据传送及算术运算指令的用法2 进一步熟悉汇编语言上机过程二、实验要求1 独立完成每个实验项目2 按照程序流程图编好实验程序三程序框图Array加程序四、实验所用仪器计算机电源DVCC——8086 实验箱一台五、实验步骤和方法1 独立编好程序2 在软件上调试实验程序3 写出实验结果实验二将键盘输入的小写字母转换成大写字母一实验目的了解小写字母和大写字母在计算机内的表示方法,学习如何转换二、实验要求1 独立完成每个实验项目2三程序框架加程序四、实验所用仪器计算机电源DVCC——8086 实验箱一台五、实验步骤和方法1 独立编好程序2 在软件上调试实验程序3 写出实验结果实验三输入字符一实验目的1学习数据传送及算术运算指令的用法2 进一步熟悉汇编语言上机过程加程序四、实验所用仪器计算机电源DVCC——8086 实验箱一台五、实验步骤和方法1 独立编好程序2 在软件上调试实验程序3 写出实验结果实验四8255A并行口实验一、实验目的加深理解逐次逼近法模数转换器的特征和工作原理,掌握ADC0809的接口方法以及A/D输入程序的设计和调试方法。
二、实验要求1 理解实验程序2 掌握各个芯片的原理和使用方法。
三、实验原理PC口8位接8个开关K1~ K8,PB口8位接8个发光二极管,从PC口读入8位开关量送PB口显示。
拨动K1~ K8,PB口上接的8个发光二极管L1~ L8对应显示K1~ K8的状态。
程序:CODE SEGMENTASSUME CS:CODEIOCONPT EQU 0073HIOAPT EQU 0070HIOBPT EQU 0071HIOCPT EQU 0072HIOBDATA EQU 0500HCONTPORT EQU 00DFHDATAPORT EQU 00DEHDATA1 EQU 0640HSTART: J MP IOLEDIOLED: CALL FORMATCALL LEDDISPMOV DS,AXMOV AL,82HMOV DX,IOCONPTOUT DX,ALMOV DX,IOBPTIN AL,DXMOV BYTE PTR DS:[0501H],ALMOV DX,IOCONPTMOV AL,80HOUT DX,ALMOV DX,IOBPTMOV AL,DS:[0501H]OR AL,0F0HOUT DX,ALMOV DX,IOCPTMOV AL,0F0HOUT DX,ALCALL DELAY1IOLED0: MOV AL,10100101BMOV DX,IOCPTOUT DX,ALCALL DELAY1CALL DELAY1OR AL,0F0HOUT DX,ALMOV CX,8HIOLED1: MOV DX,IOBPTMOV AL,DS:[0501H]AND AL,10101111BOUT DX,ALCALL DELAY2OR AL,01010000BOUT DX,ALCALL DELAY2LOOP IOLED1MOV DX,IOCPTMOV AL,0F0HOUT DX,ALCALL DELAY2MOV AL,01011010BOUT DX,ALCALL DELAY1CALL DELAY1OUT DX,ALMOV CX,8HIOLED2: MOV DX,IOBPTMOV AL,DS:[0501H]AND AL,01011111BOUT DX,ALCALL DELAY2OR AL,10100000BOUT DX,ALCALL DELAY2LOOP IOLED2MOV DX,IOCPTMOV AL,0F0HOUT DX,ALCALL DELAY2JMP IOLED0DELAY1: PUSH AXPUSH CXMOV CX,0030HDELY2: CALL DELAY2LOOP DELY2POP CXPOP AXRETDELAY2: PUSH CXMOV CX,8000HDELA1: LOOP DELA1POP CXRETLEDDISP:MOV AL,90HMOV DX,CONTPORTOUT DX,ALMOV BYTE PTR DS:[0600H],00 LED1: CMP BYTE PTR DS:[0600H],07H JA LED2MOV BL,DS:[0600H]MOV BH,0HMOV AL,CS:[BX+DATA1]MOV DX,DATAPORTOUT DX,ALADD BYTE PTR DS:[0600H],01HJNZ LED1LED2: RETFORMAT: MOV BX,0MOV WORD PTR DS:[BX+0640H],405BHADD BX,2MOV WORD PTR DS:[BX+0640H],4040HADD BX,2MOV WORD PTR DS:[BX+0640H],6D6DHADD BX,2MOV WORD PTR DS:[BX+0640H],7F5BHRETCODE ENDSEND START四、实验所用仪器计算机电源DVCC——8086 实验箱一台五、实验步骤和方法1 独立编好程序2 在实验机箱上连好实验线路3 观察实验现象4 分析实验结果实验五8259中断控制器实验一、实验目的1.掌握8259中断控制器的接口方法.2.掌握8259中断控制器的应用编程.二、实验要求1 理解实验程序2 掌握各个芯片的原理和使用方法。
计算机硬件实验室实验报告课程名称:微机原理及应用
三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)
源代码:
Mov AH,1
Int 21H
Mov BH, AL
Mov AH,1
AND Bh, 0fH
Int 21h
Mov BL,AL
AND Bl, 0fH
Mov DL, '+'
Mov AH, 2
Int 21h
MOV AH, 1
INT 21H
Mov CH,AL
AND CH, 0fH
Mov AH, 1
INT 21H
Mov CL,AL
AND CL, 0fH
ADD BL, CL
Mov Al,BL
Mov AH,00H 四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)
结论如上图
五.结论
本次实验完成了简单的两个两位十进制数相加。
完成了表达式的输出,将实验跟理论相结合,加深了对知识的理解。
AAA Mov Bl,Al ADC BH,CH Mov AL,BH Mov AH,00H AAA Mov CH,AH Mov CL,Al ADD BL, 30H ADD CX, 3030H Mov DL, '=' Mov AH, 2 Int 21H Mov DL,CH Mov AH, 2 Int 21H Mov DL, CL Mov AH, 2 Int 21H Mov DL,BL Mov AH, 2 INT 21H。
实验一两个多位十进制数相加的实验一、实验目的1、学习数据传送和算术运算指令的用法。
2、熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
二、实验内容将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图四、程序清单DATA SEGMENT ;定义数据段DATA1 DB 33H,39H,31H,37H,34H ;被加数DATA1END EQU $-1DATA2 DB 34H,35H,30H,38H,32H ;加数DATA2END EQU $-1SUM DB 5 DUP() ;定义5个空字节DATA ENDSSTACK SEGMENT ;定义堆栈段STA DB 20 DUP() ;取从STA开始的20个字节为堆栈段TOP EQU LENGTH STA ;将堆栈段长度存放在TOP中STACK ENDS ;堆栈段定义结束CODE SEGMENT ;定义程序代码段ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA ;表明程序代码段与段地址之间的关系START: MOV AX,DATAMOV DS,AX ;将段地址送入段地址寄存器MOV AX,STACKMOV SS,AX ;将当前堆栈段首地址送入SSMOV SP,AX ;将堆栈段首地址送入堆栈指针寄存器MOV SI,OFFSET DATA1END ;将DATA1的偏移地址送入SIMOV DI,OFFSET DATA2END ;将DATA2的偏移地址送入DICALL ADDA ;调用子程序ADDAMOV AX,4C00HINT 21H ;中断调用ADDA PROC NEAR ;子程序段MOV DX,SI ;DX=0004HMOV BP,DI ;BP=0009HMOV BX,05H ;程序调用次数AD1: SUB BYTE PTR[SI],30H ;将被加数的ASCII码转换成十六进制数SUB BYTE PTR[DI],30H ;将加数的ASCII码转换成十六进制数DEC SI ;SI中的内容自减1DEC DI ;DI中的内容自减1DEC BX ;程序调用次数自减1JNZ AD1 ;条件转移MOV SI,DX ;回到初始位置MOV DI,BPMOV CX,05H ;循环次数控制CLC ;清除CF位AD2: MOV AL,[SI]MOV BL,[DI]ADC AL,BL ;从低位开始进行带进/借位的加法运算AAA ;转换成非压缩BCD码,低位存于AL,高位存于AH MOV [SI],AL ;将AL中的内容存入SI所在地址DEC SI ;偏移地址自减DEC DI ;偏移地址自减LOOP AD2 ;循环控制指令MOV SI,DXMOV DI,BPMOV BX,05HAD3: ADD BYTE PTR[SI],30H ;将16进制数转换为ASCII码表示 ADD BYTE PTR[DI],30HDEC SI ;偏移地址自减DEC DIDEC BXJNZ AD3RET ;返回指令ADDA ENDP ;结束子程序CODE ENDS ;结束程序代码段END START五、实验结果(截屏--软件实验或者拍照---硬件实验)六、实验结果分析(预期结果与实际结果的对照)1、数据段分析用ASCII码值的形式表示被加数和加数被加数=39174;加数=450822、堆栈段分析用于存放计算过程中的过程量。
两个多字节数相加一.实验目的1.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
2.熟悉和掌握用DEBUG调试程序的方法。
二.实验内容将两个多字节数相加,要求加数和被加数分别存放在num1和num2为首的内存单元中。
结果送回num1处。
三.实验步骤1.生成可执行文件。
输入 SUM.ASM SUM.OBJ SUM.EXEedit MASM LINK DEBUG2.汇编源程序DATA SEGMENTNUM1 DB 1H,2H,3H,0NUM2 DB 4H,5H,6HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXCLCLEA BX,NUM1LEA SI,NUM2MOV CX,3LL:MOV AL,[SI]ADC [BX],ALINC BXINC SILOOP LLMOV AL,0ADC AL,0MOV [BX],ALMOV AH,4CHINT 21HCODE ENDSEND START3.在DEBUG下使用DEBUG命令调试程序。
-N SUM.EXE (指定sum.exe文件)-L (从磁盘读sum.exe)-U (反汇编)记录源程序的首地址为0BC6:0000,NUM1和NUM2的首地址分别为0BC5:0000, 0BC5:0004。
如图所示:-G=0BC6:0000 0BC6:001F (使用G命令执行程序)-D OBC5:0000 (显示内存单元的内容)四.心得体会在做实验之前,尽量把源程序看懂,结合书去看。
在实验进行时,对于一些数据作修改,进行调试能够更好的理解程序所执行的内容。
经过这次试验,自己对运用MASM软件进行简单的debug指令操作有了进一步的理解和认识。
微原实验——两个四位十进制数相加并显示结果一、实验目的1.通过上机实验,熟悉汇编语言开发环境,了解代码编译,连接,执行的相关过程。
2.熟悉汇编语言的书写与使用,在调试程序的过程中熟悉不同代码的执行效率与效果。
二、实验原理从键盘输入2个4位二进制数,相加并显示结果。
三、实验设备及软件硬件:PC软件:TPC2003+汇编集成开发环境四、实验内容(代码及注释)DATA SEGMENTX1 DB 4 DUP(0) ;第一个加数X2 DB 4 DUP(0) ;第二个加数X3 DB 5 DUP(0) ;两数之和y1db 'please input the first number:','$'y2db 'please input the second number','$'y3db 'the result is:','$'DATA ENDS ;数据段STACK SEGMENT STACKDW 100 DUP(?)STACK ENDS ;堆栈段CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKKEYIN PROC ;键盘输入函数AGAIN: MOV AH,8INT 21HCMP AL,30HJB AGAINCMP AL,39HJA AGAIN ;若不为数字,重新输入PUSH AXMOV DL,ALMOV AH,2INT 21H ;若为数字,入栈保存并显示POP AXRETKEYIN ENDPMAIN PROCMOV AX,DATAMOV DS,AXMOV DX,OFFSET Y1MOV AH,9INT 21HMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;打印y1字符串,并在结尾输出回车MOV SI,OFFSET X1MOV CX,4NEXT1: CALL KEYINAND AL,0FH ;调整ASC码数字为纯数字以便相加MOV [SI],ALINC SILOOP NEXT1MOV SI,OFFSET X2MOV CX,4 ;将第一个加数保存在变量X1中MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;输出回车MOV DX,OFFSET Y2MOV AH,9INT 21HMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;打印y2字符串,并在结尾输出回车NEXT2: CALL KEYINAND AL,0FH ;调整ASC码数字为纯数字以便相加MOV [SI],ALINC SILOOP NEXT2 ;将第二个加数保存在变量X2中MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;输出回车MOV DX,OFFSET Y3MOV AH,9INT 21HMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21H ;打印y3字符串,并在结尾输出回车MOV SI,(OFFSET X1)+3MOV DI,(OFFSET X2)+3MOV BX,(OFFSET X3)+4MOV CX,4OR CX,CX ;CF位清零PLUS: MOV AL,[SI]ADC AL,[DI]AAA ;十进制调整命令MOV [BX],ALDEC DIDEC SIDEC BXLOOP PLUSMOV AL,0ADC AL,0MOV [BX],ALMOV BX,OFFSET X1MOV CX,4NEXT4: MOV DL,[BX]ADD dl,30h ;将纯数字调整为ASC码以便打印MOV AH,2INT 21HINC BXLOOP NEXT4 ;打印加数X1MOV DL,2BHMOV AH,2INT 21H ;打印’+’号MOV BX,OFFSET X2MOV CX,4NEXT5: MOV DL,[BX]ADD DL,30HMOV AH,2INT 21HINC BXLOOP NEXT5 ;打印X2MOV DL,3DHMOV AH,2INT 21H ;打印’=’号MOV BX,OFFSET X3SUB BYTE PTR [BX],0JZ OUT1 ;判断结果最高位是否为零,若为零则跳至OUT1处MOV CX,5NEXT3: MOV DL,[BX]ADD DL,30HMOV AH,2INT 21HINC BXLOOP NEXT3 ;最高位不为零,打印五位数CMP CX,0JZ END1 ;若已经输出完毕,则跳至END1直接结束程序OUT1: MOV CX,4 ;结果最高位为零,打印四位数NEXT6: MOV DL,[BX+1]ADD DL,30HMOV AH,2INT 21HINC BXLOOP NEXT6END1: MOV AH,4CHINT 21HMAIN ENDPCODE ENDS ;结束程序END MAIN五、程序流程图从键盘输入字符或数字六、实验结果七、实验感想在本实验中,由于TPC编译平台问题,编译运行后的操作窗口过大,看不到显示的实验结果,还一直以为是代码有问题。
实验2 两个多位十进制数相加的实验一、实验目的1. 学习数据传送和算术运算指令的用法。
2. 熟悉在PC机上建立、汇编、连接、调试和运行8088汇编语言程序的过程。
二、实验内容将两个多位十进制数相加,要求被加数均以ASCII码形式各自顺序存放在以DA TA1和DA TA2为首的5个内存单元中(低位在前),结果送回DA TA1处。
附加题要求将加法过程显示与屏幕。
同学可以自己设计程序也可对代码段进行填空以及问答来完成程序。
(附加题范例在第二页);该程序完成54321+54321=108642的多位十进制加法运算,和存放与DAT3DATA SEGMENTDAT1 DB'12345';问一个多位十进制数各位是以何种顺序存放于内存的。
DAT2 DB'12345';个位存放于高地址或者为低地址。
DAT3 DB 6 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,DAT1LEA SI,DAT2LEA DI,DAT3MOV CX,5CLC ;为什么要加入这条指令L1: MOV AL[BX]ADC AL,[SI] ;BYTE PTR[BX]+[SI]+CF→AL 例‘1’+‘1’+0= 62H→AL__________;填空________________; AL=02HPUSHF;为什么要加入pushf popf这两条指令OR AL,30H;为什么要加入这条指令POPFMOV [DI],AL__________;填空__________________;填空__________________ ;填空________LOOP L1JNC L2MOV [DI],31HINC DIhltCODE ENDSEND START三、程序框图(见下页)附加题1范例;该程序完成54321+54321=108642的多位十进制加法运算,和存放与DAT3并显示于屏幕DATA SEGMENTDAT1 DB'12345';问一个多位十进制数各位是以何种顺序存放于内存的。