1、综合性汇编语言程序设计实验湘潭大学实 验 报 告课 程: 80X86汇编语言程序设计 实验题目: 综合性的汇编语言程序设计 学 院: 信息工程学院 专 业: 14级计算机科学与技术二班 学 号: 2014551418 姓 名: 周 宇 指导教师: 匡林爱 完成日期: 2016.5.12 1、实验内容开发一个总源代码行数不低于300行(或新代码行数不少于200行)的汇编语言程序以解决一个相对独立的局部应用问题。2、实验环境硬件环境:一台微型计算机软件环境:Window7系统、debug环境、masm3、实验代码设计DATAS SEGMENT ;此处输入数据段代码 STRING1 DB 0: EX
2、IT, 1: A+B, 2: A-B, 3: A*B, 4: A/B ,$ STRING2 DB Please enter a number to have a choice :,$ STRING3 DB Please enter A:,$ STRING4 DB Please enter B:,$ STRING5 DB You have chosed the A+B,$ STRING6 DB You have chosed the A-B,$ STRING7 DB You have chosed the A*B,$ STRING8 DB You have chosed the A/B,$ ST
3、RING9 DB Thanks for using U !,$ STRING10 DB You enter the error number ! Please enter again.,$ STRING11 DB -,$ NUM1 DW 0 NUM2 DW 0DATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS HUANHANG PROC NEAR ;换行子程序 可用 STR_CRLF DB 0AH,0DH,$ MOV AH,02H MOV DL,0DH IN
4、T 21H MOV DL,0AH INT 21H RETHUANHANG ENDPJIAFA PROC NEAR ;加法子程序 MOV DX,NUM1 CALL PRINT ;调用数据以十进制输出子程序,把NUM1以十进制形式输出 MOV DL,+ CALL STDOUT ;调用输出子程序,把+号输出 MOV DX,NUM2 CALL PRINT MOV DL,= ;调用输出子程序,把=号输出 CALL STDOUT MOV AX,NUM1 ADD AX,NUM2 MOV DX,AX CALL PRINT RETJIAFA ENDPJIANFA PROC NEAR ;减法子程序 MOV DX,
5、NUM1 CALL PRINT MOV DL,- CALL STDOUT MOV DX,NUM2 CALL PRINT MOV DL,= CALL STDOUT MOV AX,NUM1 MOV BX,NUM2 SUB AX,BX MOV DX,AX CALL PRINT RETJIANFA ENDPCHENGFA PROC NEAR ;乘法子程序 MOV DX,NUM1 CALL PRINT MOV DL,* CALL STDOUT MOV DX,NUM2 CALL PRINT MOV DL,= CALL STDOUT MOV AX,NUM1 MOV DX,0 MUL NUM2 MOV DX,
6、AX CALL PRINT RETCHENGFA ENDPCHUFA PROC NEAR ;除法子程序 MOV DX,NUM1 CALL PRINT MOV DL,/ CALL STDOUT MOV DX,NUM2 CALL PRINT MOV DL,= CALL STDOUT MOV DX,0 MOV AX,NUM1 DIV NUM2 MOV DX,AX CALL PRINT RETCHUFA ENDPPRINT PROC NEAR ;数据以十进制输出子程序 PUSH DX PUSH AX PUSH CX PUSH BX MOV CX,0DO: MOV AX,DX MOV DX,0 MOV
7、BX,10 DIV BX XCHG AX,DX ADD AL,30H PUSH AX INC CX CMP DX,0 JNZ DODO1:POP AX MOV DL,AL CALL STDOUT LOOP DO1 POP BX POP CX POP AX POP DX RETPRINT ENDPSTDOUT PROC NEAR ;输出子程序 MOV AH,2 INT 21H RETSTDOUT ENDPSTART: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码ONEAGAIN:;输入选择继续执行程序 XOR AX,AX XOR BX,BX MOV NUM1,0;很重要的两
8、步 MOV NUM2,0; CALL HUANHANG CALL HUANHANG LEA DX,STRING11 MOV AH,9 INT 21H CALL HUANHANG LEA DX,STRING1 ;显示菜单 MOV AH,9 INT 21H CALL HUANHANG CALL HUANHANG LEA DX,STRING2 ;提示菜单的选择 MOV AH,9 INT 21H CALL HUANHANG CALL HUANHANG MOV AH,1 ;输入选择 INT 21H ;菜单选择。 ;CALL HUANHANG ;此换行千万不能加,加了后AX的值就变了!,导 ;致不能正确的
9、选择菜单 CMP AL,0 ;选择退出 JZ END_OF_CODE CMP AL,1 ;选择加法 JZ NEXT_OF_JIAFA CMP AL,2 ;选择减法 JZ NEXT_OF_JIANFA CMP AL,3 ;选择乘法 JZ NEXT_OF_CHENGFA CMP AL,4 ;选择乘法 JZ NEXT_OF_CHUFA CALL HUANHANG LEA DX,STRING10 MOV AH,9 INT 21H JMP ONEAGAIN CALL HUANHANG ;菜单选择。 ;加法NEXT_OF_JIAFA: CALL HUANHANG LEA DX,STRING5 MOV AH
10、,09H INT 21H CALL HUANHANG LEA DX,STRING3 ;输入A MOV AH,09H INT 21H CALL HUANHANG LP1: MOV AH,1 INT 21H CMP AL,0DH ;当输入的字符为回车结束数据输入 JZ NEXT1 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM1 MUL BX ADD AX,CX MOV NUM1,AX JMP LP1 NEXT1: LEA DX,STRING4 ;输入B MOV AH,09H INT 21H CALL HUANHANG LP11: MOV AH
11、,1 INT 21H CMP AL,0DH JZ NEXT11 ;当输入的字符为回车结束数据输入 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM2 MUL BX ADD AX,CX MOV NUM2,AX JMP LP11 NEXT11: CALL HUANHANG ;调用换行子程序 CALL JIAFA ;调用加法子程序 JMP ONEAGAIN ;执行完后跳到最上面 ;减法NEXT_OF_JIANFA: CALL HUANHANG LEA DX,STRING6 MOV AH,09H INT 21H CALL HUANHANG LEA D
12、X,STRING3 ;输入A MOV AH,09H INT 21H CALL HUANHANG LP2: MOV AH,1 INT 21H CMP AL,0DH ;当输入的字符为回车结束数据输入 JZ NEXT2 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM1 MUL BX ADD AX,CX MOV NUM1,AX JMP LP2 NEXT2: LEA DX,STRING4 ;输入B MOV AH,09H INT 21H CALL HUANHANG LP22: MOV AH,1 INT 21H CMP AL,0DH JZ NEXT22
13、;当输入的字符为回车结束数据输入 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM2 MUL BX ADD AX,CX MOV NUM2,AX JMP LP22 NEXT22: CALL HUANHANG CALL JIANFA ;调用减法子程序 JMP ONEAGAIN ;执行完后跳到最上面 ;乘法NEXT_OF_CHENGFA: CALL HUANHANG LEA DX,STRING7 MOV AH,09H INT 21H CALL HUANHANG LEA DX,STRING3 ;输入A MOV AH,09H INT 21H CALL
14、HUANHANG LP4: MOV AH,1 INT 21H CMP AL,0DH ;当输入的字符为回车结束数据输入 JZ NEXT4 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM1 MUL BX ADD AX,CX MOV NUM1,AX JMP LP4 NEXT4: LEA DX,STRING4 ;输入B MOV AH,09H INT 21H CALL HUANHANG LP44: MOV AH,1 INT 21H CMP AL,0DH JZ NEXT44 ;当输入的字符为回车结束数据输入 SUB AL,30H MOV AH,0 MO
15、V CX,AX MOV BX,10 MOV AX,NUM2 MUL BX ADD AX,CX MOV NUM2,AX JMP LP44 NEXT44: CALL HUANHANG CALL CHENGFA ;调用换行子程序 JMP ONEAGAIN ;除法NEXT_OF_CHUFA: CALL HUANHANG LEA DX,STRING8 MOV AH,09H INT 21H CALL HUANHANG LEA DX,STRING3 ;输入A MOV AH,09H INT 21H CALL HUANHANG LP3: MOV AH,1 INT 21H CMP AL,0DH ;当输入的字符为回
16、车结束数据输入 JZ NEXT3 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM1 MUL BX ADD AX,CX MOV NUM1,AX JMP LP3 NEXT3: LEA DX,STRING4 ;输入B MOV AH,09H INT 21H CALL HUANHANG LP33: MOV AH,1 INT 21H CMP AL,0DH JZ NEXT33 ;当输入的字符为回车结束数据输入 SUB AL,30H MOV AH,0 MOV CX,AX MOV BX,10 MOV AX,NUM2 MUL BX ADD AX,CX MOV
17、NUM2,AX JMP LP33 NEXT33: ;CALL HUANHANG ; CALL C ;调用乘法子程序 CALL HUANHANG CALL CHUFA ;调用换行子程序 JMP ONEAGAINEND_OF_CODE:; CALL HUANHANG LEA DX,STRING9 MOV AH,9 INT 21H MOV AH,4CH INT 21H CODES ENDS END START该程序是一个简单的汇编语言计算器,能进行加减乘除简单运算,程序运行后有一个选择菜单,选择相应的功能后输入操作数就能执行相应的操作。该程序过于简陋,其中有很多地方没有优化,对于除法计算(不能整除的
18、情况)的精度不高,只能显示整数部分,减法中对于以小减大的计算不能进行;由于位数的限制,运算时中间有溢出的结果显示为错误的。4、实验结果与截图实验截图如下:程序运行后的开始界面测试退出操作测试加法功能 测试加法功能 测试减法功能测试减法功能测试乘法功能测试乘法功能测试除法功能测试除法功能测试不合法输入调试截图调试截图调试截图 调试截图调试截图5、心得体会该实验是对自己所学知识的汇总了,这个实验编写了一个汇编简易计算器,其中很多地方没有优化,在整个编写过程中花了很多时间和精力,其中主要都是在找错误。代码中很多地方用了子程序,所以在用到相应的功能时就直接CALL即可。由于本次实验难度最大,代码量很大
19、,所以代码中多次用到各种寄存器,会导致寄存器的使用过程中数据被修改而导致结果不对,出现错误。在完成整个实验中,最耗费时间就是找错误,在输入相应的菜单选项后程序不能按照正确的方向进行,出现了流程错误,在找了好几个小时后,发现寄存器AX的值被修改了,开始调用1号功能输入一个数字存入AH中,在该指令的下一条CALL HUANHANG 用了换行调用,而换行子程序中有改变AX的值,所以导致后面的功能选择不成功,所以,一个很细小的问题就能导致整个程序错误的执行,再次提醒自己要仔细和谨慎,思路要严谨,不仅仅在这里,在生活中,在工作中也要做到细心和严谨。通过这个实验,让我再次复习和掌握了汇编中指令和相应知识点,是一个很好的复习、掌握和熟悉汇编编程的机会,对汇编语言的了解更加深入。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1