哈尔滨工程大学实验报告实验名称:熟悉实验环境及简单程序设计班级:06-521学号:06052122姓名:张禹实验时间:2009-7-3成绩:指导教师:王向红实验室名称:水声电子信息实验中心_哈尔滨工程大学实验室与资产管理处制1.实验名称:熟悉实验环境及简单程序设计2.实验目的:1. 熟悉实验环境。
2.掌握基本DEBUG命令。
3.熟练掌握汇编语言编写、调试和运行的基本方法。
4.掌握数据在寄存器、内存中的存放方式和寻址方式。
3.实验仪器:pc机一台4.实验内容与实验步骤:1.编写程序,移位相加指令实现将AL寄存器中的无符号数乘以10。
思考题:若(AL)*10的结果较大,超过了一个字节的表示范围,编程时如何处理?请编程调试。
2.多字节加法程序:编程实现两个32位二进制数据的加法程序3.给出一组数据:1234H,3456H,3455H,1111H,0FFFFH,0001H编程分别实现:1、将以上数据视为无符号数找出其中最大值。
2、将以上数据视为带符号数找出其中最大值。
思考:若要分别求出以上两种情况的最小值,程序将要做何改动?5.实验原理:实验1用移位相加实现乘以10,乘以10即是(2+8),左移一位相当于乘以2,所以先将AL的数左移一位后存入BL中,然后再将AL的数再左移两位,此时的AL存储的值左移了三位相当于乘以8,BL的值是左移了一位的数即乘以2,因此将AL的值加上BL 的值便可以的到乘以10的结果。
如果AL*10的值较大,则可以将寄存器换用AX和BX,将原来的值存入AX的低八位,高八位添0,利用上面同样的方法可得到乘以10的结果。
实验2要实现两个32字节的数相加,则必须采用分布相加的方法。
应为所有的寄存器最多为16位,所以得先将32位的低16位相加,让后两高16位和低16相加的进位三者相加,注意此时仍可能得到一进位。
实验3要找出一组数据的最大或者最小值,采用逐个比较的方法,即首地址的数放入AX寄存器然后逐个与后面的数比较,如果AX寄存器的数大于所比较的数则继续与接下来的比较,如果小于后的数则将后面的大数存放到AX寄存器,一直比到最后一个数后该组数据的最大值就存放再AX中了。
框图如下:六、试验程序及结果分析实验一:较小的数乘以10(1)程序:DATA SEGMENTBUF1 DB 02HBUF2 DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AL,BUF1SAL AL,1SAL AL,1SAL AL,1ADD AL,BLMOV BUF2,ALMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验一:较大的数乘以10(1)程序:DATA SEGMENTBUF1 DB 8FHBUF2 DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AH,00HMOV CX,BUF1MOV BX,AXSAL CX,1SAL CX,1ADD CX,BXMOV BUF2,CXMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验二:多字节加法(1)程序:DATA SEGMENTX DD ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AX,1234HMOV BX,5678HMOV CX,8765HMOV DX,4321HADD AX,CXADC BX,DXMOV WORD PTR[X],AXMOV WORD PTR[X+2],AXMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验三:最大值最小值比较(1)程序:DATA SEGMENTBUF1 DW 1234H,7745H,00FFH, 0E234H,9031H,0003H,4567H,2BA3H BUF2 DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,BUF1MOV CX,7MOV AX,[SI]L1: MOV BX,[SI+2]CMP AX,BXJA L2 ;无符号最大值,JB无符号最小值;JG有符号最大值,JL有符号最小值MOV AX,BXL2: INC SIINC SIDEC CXJNZ L1MOV BUF2,AXMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:1、无符号最大值的结果图:2、有符号最大值结果图:3、无符号最小值的结果图:4、有符号最小值的结果图:7.实验体会:通过本次实验,使我熟悉了实验运行环境,也掌握了一些基本的DEBUG 命令,熟悉了汇编语言的编写过程、调试过程和最后的运行。
另外,通过实验将所学知识加以巩固,在实验中理解寄存器、各种指令等。
在实验过程中,让我体会到一种逻辑分析,而且所有程序必须经过上机调试才能确定是否正确,一个问题可以用不同的方法去进行分析,编程,所以我觉得我们可以采用不同的指令完成相同的实验。
这样,可以将我们所学的知识都应用到,对我们理解和掌握课本知识有很大的帮助。
哈尔滨工程大学实验报告实验名称:_ 分支循环程序设计及实现班级:06-521学号:06052122姓名:张禹实验时间:2009-7-3成绩:指导教师:王向红实验室名称:水声电子信息实验中心_哈尔滨工程大学实验室与资产管理处制1.实验名称:分支循环程序设计及实现2.实验目的:1.学习分支程序、循环结构程序的设计和调试方法;2.掌握分支、循环等程序的基本结构。
3.通过循环指令、条件转移指令等完成较复杂程序的设计。
3.实验仪器:电脑一台4.实验内容与实验步骤:1.数据串搬家程序:BUF1开始的8个以字为单位的数据搬移到BUF2。
选做题:将BUF1开始的8个以字为单位的数据中的正数搬移到BUF2。
2.已知数据区STRING1开始的存储单元中,存有26个大写英文字母,将其转换成小写字母后,放到STRING2开始的存储单元中。
3.在题2的基础上继续编程,实现当从键盘输入’1’时,在屏幕上显示26个大写英文字母,当输入’2’时,在屏幕上显示26个小写英文字母。
5.实验原理及流程图:实验1要将BUF1的8个以字为单位的数移动到BUF2中,先将BUF2的偏移地址放入SI,BUF2的偏移地址放入DI,再将[SI]放入寄存器AX中,再将AX 中的值存放到[DI]中,接下来[SI+2],[DI+2],计数器寄存器的值自减1,当计数寄存器的值不等于零时循环执行以上过程。
要将BUF1中的正数搬移到BUF2,首先要判断BUF1中的数据是否大于0,如果大于0,送入BUF2,不是则不送入。
用TEST命令测试最高位是否为0或者1,如果为0,则判断的数为正数,为1则判断的数为负数。
实验2要将STRING1的26个大写字母转换成小写字母放入STRING2中,首先的将大写字母换成小写字母,即将大写字母的ASCII码加上20H即可,因为26个字母的小写ASCII码为61H到7AH,而大写字母的ASCII的为41H到5AH。
让后按照实验1的方法将其放入STRING2中。
实验3在实验2的基础上,如果输入1,则输出STRING1中的大写字母,如果输入2,则输出STRING2中的小写字母,如果输入的既不是1又不是2,则返回DOS系统。
因此需要调用1号命令屏幕输入命令和09号屏幕输出命令。
1号命令输入后,输入的值存入AL,让后将其与1和2的ASCII码与31H和32H比较,根据比较结果执行相应的命令。
6.实验程序及结果分析:实验一:数据搬移(1)程序:DATA SEGMENTBUF1 DW 0234H,4321H,0FE44H,5647H,0E447H,7650H,5555H,0E345HBUF2 DW 8 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1LEA DI,BUF2MOV CX,7AGAIN:MOV AX,[SI]INC SIINC SIMOV [DI],AXINC DIINC DILOOP AGAINMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验一:正数搬移(1)程序:DATA SEGMENTBUF1 DW 0234H,4321H,0FE44H,5647H,0E447H,7650H,5555H,0E345H BUF2 DW 8 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1LEA DI,BUF2MOV CX,7AGAIN:MOV AX,[SI]INC SIINC SITEST AX,8000HJNZ AGAINMOV [DI],AXINC DIINC DILOOP AGAINMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验二:大小写字母转换(1)程序:DATA SEGMENTSTRING1 DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','$'STRING2 DB 27 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,STRING1LEA DI,STRING2MOV CX,26DONE1: MOV AL,[SI]ADD AL,20HMOV [DI],ALINC SIINC DIDEC CXJNZ DONE1MOV AL,'$'MOV [DI],ALMOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:实验三:大小写字母输出(1)程序:DATA SEGMENTSTRING1 DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','$'STRING2 DB 27 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,STRING1LEA DI,STRING2MOV CX,26DONE1: MOV AL,[SI]ADD AL,20HMOV [DI],ALINC SIINC DIDEC CXJNZ DONE1MOV AL,'$'MOV [DI],ALMOV AH,01HINT 21HCMP AL,31HJNZ DONE2LEA DX,STRING1MOV AH,09HINT 21HJMP DONE3DONE2: CMP AL,32HJNZ DONE3LEA DX,STRING2MOV AH,09HINT 21HDONE3: MOV AH,4CHINT 21HCODE ENDSEND START(2)结果分析:7.实验体会:通过本次实验,使我熟悉了实验运行环境,也掌握了一些基本的DEBUG 命令,熟悉了汇编语言的编写过程、调试过程和最后的运行。