实验二算术运算实验一、实验目的1、掌握MASM for Windows 环境下的汇编语言编程环境使用;2、掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、BCD码的表示形式;3、掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志位的影响及测试方法;4、掌握无符号数和有符号数运算区别及编程方法;5、掌握BCD码调整指令的使用方法二、软硬件实验环境1、硬件环境:惠普 64位一体化计算机及局域网;2、软件环境:windows 8,红蜘蛛管理系统, MASM for Windows。
三、实验基本原理算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。
1)标志位在debug调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表 1 所示。
2)加减法指令ADD表示加法指令,ADC表示带进位加法指令,SUB表示减法指令,SBB表示带进位减法指令。
3)乘除法指令MUL表示无符号数乘法指令,IMUL表示带符号数乘法指令,DIV表示无符号数除法指令,IDIV 表示带符号数除法指令。
4)符号位扩展指令CBW表示从字节扩展到字的指令,CWD表示从字扩展到双字的指令。
5)BCD码的调整指令在进行十进制加减运算时,需要将数据用BCD码表示,还要考虑到是组合 BCD码还是非组合BCD码,组合BCD码是用一个字节表示两位十进制数,非组合BCD码是用一个字节表示一位十进制数,对于组合的 BCD码加减法运算其结果存放在 AL中。
组合的BCD码加法调整指令 DAA组合的BCD码减法调整指令 DAS非组合的BCD码加法调整指令 AAA非组合的BCD码减法调整指令 AAS乘法的非组合BCD码调整指令AAM除法的非组合BCD码调整指令AAD8088/8086指令系统提供了实现加、减、乘、除运算指令,可参照表2所示内容。
四、实验步骤与内容1)对于表格中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算结果对标志寄存器中状态标志位的影响:①实验分析本实验要求简单,仅对指定三组数进行基本运算。
只需使用ADD SUB MUL DIV四个运算命令,并以MOV命令作为数值转移的手段即可。
运算结果和状态标志的情况可以通过debug 调试中的T命令进行逐步查看。
需要注意的主要有以下几点:1. 在进行加法和乘法运算时,会出现对高位的进位扩展。
因此,在记录结果的时候不能仅仅记录低2位(十六进制)的结果,应记录包含高位的完整结果;2. 在使用MUL和DIV命令时,语句的写法与ADD和SUB有区别;3. 除法运算既可得到商,也可得到余数,余数存在DL中;4. 查看结果时以三个语句为一次运算,输入三个T命令后的结果才是此次运算的结果。
②流程图③程序样例1、DATAS SEGMENT;此处输入数据段代码BUF1 DB 0ABH,64H,0A2HBUF2 DB 78H,5AH,3FHBUF3 DB 10 DUP⑺DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV AH,0HMOV AL,BUF1[SI]MOV BL,ALMOV AL,BUF2[SI] ADD AX,BX ; 进行运算MOV BUF3[SI],ALADD SI,1HDEC CXJNZ Q1 ; 跳转再做一次第二组数的加法运算MOV AX,4CHINT 21HCODES ENDSEND START2、STACKS SEGMENT; 此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV AH,0HMOV AL,BUF2[SI]MOV BL,ALMOV AL,BUF1[SI]MOV BUF3[SI],ALADD SI,1H ;do the operationDEC CXJNZ Q1 ;do it again with the second group of numbersMOV AX,4CHINT 21HCODES ENDSEND START 3、DATASSEGMENT;此处输入数据段代码BUF1 DB0ABH,64H,0A2HBUF2 DB78H,5AH,3FHBUF3 DB10 DUP?)DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODES5EGMENTASSUMCS:CODES,DS:DATAS,SS:STACKSSTARTMOVXQATASMO\DS,AXMO\SI,2MOVCX,1Q1:MO\AH,0HMO\AL,BUF2[SI]MOV3L,ALMO\AL,BUF1[SI]DIV BXMOV3UF3[SI],ALADDSI,1H ;do the operationDECCXJNZ Q1 ;do it aga in with the sec ond group of nu mbers MO\AX,4CH INT 21H CODESENDS ENDSTART0ABH+78H64H+5AH0ABH-78Hkx^oGiaa HX=€Kf7a cx=oeez DX ^OOGO SP ^OQOG ar^eooo st =0000 1)1=0000 DS=a?7G ES=67t0 SS=flPFF CS=0771 [P=0915HU IIP El PL MS MA PE MC0771:001^ 89B4660O MOU [SUOOGGl^LDS :O00&-OG64H-5AH容HBOA Bx=ee» c )t=0S0i n^eeee^=0000 s 1=0091 vi=&&9&1£>(7旳0 SS-HI^K CS-^?1 IP-EW19 HW Ul 1 EL I'L MK HC FE AC3771;C0U S86HWOO MOU B[他66】,亂 »3 66^7^00A2H*3FHAX=Z7HE RX=fiflflF CX=fB01 DX=fiCMfl SP=fifiFM ST=(MfiZ DWfiflfiflDS-0770 ES-0760 SS-07bT CS-G771 IP-0015 NU UP El PL NZ HA FD PC £771^0015 G83i060t> HOU [3I*OO0®】jBL I>3;9060-060A2H/3FHX00GK BX^OCKF CX=t»01 DX=fc)tK4 时 GWW DS=O?7D ES=67EQ SS=0?bF CS-GP71 IP-001.9 U/71:f®l*J 8H84«)0a HUU L^l+WOhJ.ALBP^eeeo si^oeoz DI =OOOG )Hu UP EI PL ns HA RA HCKJ :4J0e8=002)在数据段定义了两个多精度的有符号16进制数,BUF1和BUF2求两数的和与差,并将计算值存放在BUF2为首地址的缓冲区中;同时将两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在BUF2为首地址的缓冲区中。
试编程实现上述运算BUF1 DB 92H, 98H, 45H, 64H, 78HBUF2 DB 33H , 46H, 17H, 45H, 52H①实验分析本实验的思想是把这个两个多精度数进行按精度(每两位)进行运算,考虑进位与借位,每种运算都可以使用循环和带进位加法,或循环和带进位减法进行实现。
对于十进制数运算的要求,再辅以 DAA和DAS两种十进制调整命令,将结果变为BCD码即可。
本实验中需要注意的有以下几点:1. 本实验要求就过存入以 BUF2为首地址的缓冲区。
为在运算时保护BUF2的数据,需定义另一个存储空间来存储和BUF2 一样的数据;2. 在进行不同运算的间隙应当进行清除进位标志的操作,即使用CLC命令,避免上一运算的进位影响下一位运算的结果;3. DAA和 DAS都只能对AL里的结果转换为压缩 BCD码,因此十进制加减结果必须存入AL里,且转换为压缩 BCD码的结果要靠读取 AL来获得。
②程序流程图*③程序样例1、DATASSEGMENT; 此处输入数据段代码BUF1 DB92H,98H,45H,64H,78HBUF2 DB33H,46H,17H,45H,52HBUF3 DB10 DUP( ?)DATASENDSSTACKSSEGMENT; 此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOVAX,DATASMOVDS,AXMOVSI,0MOVCX,4MOVAH,00HQ1:MOVAL,BUF2[SI]MOVBL,ALMOVAL,BUF1[SI]ADCAL,BLMOVBUF2[SI],ALINC SIDECCXJNZ Q1MOVAX,4CHINT 21HCODESENDSEND START2、DATAS SEGMENT; 此处输入数据段代码BUF1 DB92H,98H,45H,64H,78HBUF2 DB33H,46H,17H,45H,52HBUF3 DB10 DUP( ?)DATASENDSSTACKSSEGMENT; 此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOVAX,DATASMOVDS,AXMOVSI,0MOVCX,4MOVAH,00HQ1:MOVAL,BUF2[SI]MOVBL,ALMOVAL,BUF1[SI]SBBAL,BLMOVBUF2[SI],ALINC SIDECCXJNZ Q1MOVAX,4CHINT 21HCODESENDSEND START3、DATASSEGMENT; 此处输入数据段代码BUF1 DB92H,98H,45H,64H,78HBUF2 DB33H,46H,17H,45H,52HBUF3 DB10 DUP( ?)DATASENDSSTACKSSEGMENT; 此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOVAX,DATASMOVDS,AXMOVSI,0MOVCX,4MOVAH,00HQ1:MOVAL,BUF2[SI] MOVBL,ALMOVAL,BUF1[SI]ADCAL,BLDAAMOVBUF2[SI],ALINC SIDECCXJNZ Q1MOVAX,4CHINT 21HCODESENDSEND START4、DATASSEGMENT; 此处输入数据段代码BUF1 DB92H,98H,45H,64H,78HBUF2 DB33H,46H,17H,45H,52HBUF3 DB10 DUP( ?) DATASENDSSTACKSSEGMENT; 此处输入堆栈段代码 STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOVAX,DATASMOVDS,AXMOVSI,0MOVCX,4MOVAH,00HQ1:MOVAL,BUF2[SI]MOVBL,ALMOVAL,BUF1[SI]SBBAL,BLDAA。