实验6 模块化程序设计一.实验目的:(1)熟悉子程序库的建立步骤。
(2)熟悉对库文件的修改(添加、删除)。
二.实验内容:主模块A编程:设计一个能实现加、减、乘、除计算的程序,要求该程序接受从键盘输入的两个十六进制数,调用相应的程序模块执行相应的计算后,计算结果以十六进制数输出。
模块B编程:实现两个十六进制数相加。
模块C编程:实现两个十六进制数相减。
模块D编程:实现两个十六进制数相乘。
模块E编程:实现两个十六进制数相除。
(1)将各模块分别汇编为.OBJ文件;(2)应用LIB命令建立子程序库TST.LIB,里面包含BINHEX.OBJ和HEXD.OBJ。
(3)将各模块ZHSY2_3_A.OBJ、ADDOPT.OBJ、SUBOPT.OBJ、MULOPT.OBJ、DIVOPT.OBJ、INNUM.OBJ、OUTNUM.OBJ和子程序库TST.LIB相连接为一个可执行程序ZHSY2_3_A.EXE。
(4)应用DEBUG命令调试ZHSY2_3_A.EXE,注意调试时T命令和P命令的应用。
1、编译: c:\masm .asm2、链接: c:\link .obj3、调试: c:\debug .exe4、运行: c:\ .exe(1)1、编译:子程序 C:\masm .asmc:\masm>masm 6-1Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-1.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50352 + 415152 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-2Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-2.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-3Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-3.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-4Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-4.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-5Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-5.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50432 + 415072 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-6Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-6.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-7Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-7.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-8Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-8.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-9Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-9.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errors2、建立子程序库: c:\libc:\masm>libMicrosoft (R) Library Manager Version 3.02Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved.Library name: tst.libOperations: +6-4+6-5error 2000: Stack overflow出现栈溢出错误,不知如何改正。
3、链接:C:\link .objc:\masm>linkMicrosoft (R) Overlay Linker Version 3.65Copyright (C) Microsoft Corp 1983-1988. All rights reserved.Object Modules [.OBJ]: 6-1+6-2+6-3+6-6+6-7+6-8+6-9/pauseRun File [6-1.EXE]:List File [NUL.MAP]:Libraries [.LIB]:LINK : warning L4021: no stack segmentLINK : error L2029: Unresolved externals:ERROR in file(s):6-2.OBJ(6-2.ASM)BINHEX in file(s):6-3.OBJ(6-3.ASM)There were 2 errors detected链接子程序的.obj 文件时,出现无法解析的外部命令,经几番研究,还是无法找出其原因。
4、调试: c:\debug 6-1.exe1)、先用命令U反汇编整个程序,查看每条指令的物理地址C:\masm>debug 6-1.exe-u142E代码段的首地址是:1443 1443:0003 8ED8 MOV DS,AX1443:0005 B90900 MOV CX,00091443:0008 BB0000 MOV BX,00001443:000B 8BD3 MOV DX,BX1443:000D B409 MOV AH,091443:000F CD21 INT 211443:0011 83C314 ADD BX,+141443:0014 E2F5 LOOP 000B1443:0016 B401 MOV AH,011443:0018 CD21 INT 211443:001A 3C31 CMP AL,311443:001C 741D JZ 003B1443:001E 3C32 CMP AL,322)、从上一步结果中找到数据段的首地址142E,查看里面存储的数据:-d 142E:0000142E:0000 41 72 69 74 68 6D 65 74-69 63 20 50 72 6F 72 61 Arithmetic Prora 142E:0010 6D 0D 0A 24 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A m..$************ 142E:0020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 0D 0A 24 20 20 ***********..$ 142E:0030 31 2E 20 20 41 64 64 69-74 69 6F 6E 20 20 20 20 1. Addition142E:0040 20 09 0D 0A 24 20 20 32-2E 20 20 53 75 62 74 72 ...$ 2. Subtr 142E:0050 61 74 69 6F 6E 20 20 20-20 0D 0A 24 20 20 33 2E ation ..$ 3. 142E:0060 20 20 4D 75 6C 74 69 70-6C 69 63 61 74 69 6F 6E Multiplication 142E:0070 20 09 0D 0A 24 20 20 34-2E 20 20 44 69 76 69 73 ...$ 4. Divis --d 142E:0080142E:0080 69 6F 6E 20 20 20 20 20-09 0D 0A 24 20 20 30 2E ion ...$ 0. 142E:0090 20 20 45 78 69 74 20 20-20 20 20 20 20 20 20 09 Exit . 142E:00A0 0D 0A 24 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A ..$************* 142E:00B0 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 0D 0A 24 20 20 20 **********..$ 142E:00C0 20 49 6E 70 75 74 20 79-6F 75 72 20 63 68 6F 69 Input your choi 142E:00D0 63 65 3A 20 24 0D 0A 49-6E 70 75 74 20 65 72 72 ce: $..Input err 142E:00E0 6F 72 2C 20 61 67 61 69-6E 20 65 6E 74 65 72 3A or, again enter: 142E:00F0 20 24 0D 0A 49 6E 70 75-74 20 61 20 68 65 78 20 $..Input a hex -d 142E:00f0142E:00F0 20 24 0D 0A 49 6E 70 75-74 20 61 20 68 65 78 20 $..Input a hex 142E:0100 6E 75 6D 62 65 72 3A 20-24 0D 0A 49 6E 70 75 74 number: $..Input 142E:0110 20 61 20 68 65 78 20 6E-75 6D 62 65 72 20 61 67 a hex number ag 142E:0120 61 69 6E 3A 20 24 0D 0A-54 68 65 20 6F 70 65 72 ain: $..The oper 142E:0130 61 74 69 6F 6E 20 72 65-73 75 6C 74 20 69 73 3A ation result is: 142E:0140 20 24 00 00 00 00 00 00-00 00 0D 0A 24 00 00 00 $..........$... 142E:0150 B8 2E 14 8E D8 B9 09 00-BB 00 00 8B D3 B4 09 CD ................ 142E:0160 21 83 C3 14 E2 F5 B4 01-CD 21 3C 31 74 1D 3C 32 !........!<1t.<2 3)、用T命令单步执行,看寄存器AX,DS,ES的内容的变化-t1443:0003 8ED8 MOV DS,AX-tAX=142E BX=0000 CX=02AD DX=0000 SP=0000 BP=0000 SI=0000 DI=00001443:0005 B90900 MOV CX,0009-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=0008 NV UP EI PL NZ NA PO NC 1443:0008 BB0000 MOV BX,0000-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=000B NV UP EI PL NZ NA PO NC 1443:000B 8BD3 MOV DX,BX-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=000D NV UP EI PL NZ NA PO NC 1443:000D B409 MOV AH,09-tDS=142E ES=141E SS=142E CS=1443 IP=000F NV UP EI PL NZ NA PO NC 1443:000F CD21 INT 21-tAX=092E BX=0000 CX=0009 DX=0000 SP=FFFA BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=00A7 IP=107C NV UP DI PL NZ NA PO NC 00A7:107C 90 NOP4)然后直接G命令运行完毕-gArithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:1 ;验证加法Input a hex number: 2Input a hex number again:2The operation result is:4Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:2 ;验证减法Input a hex number: 4Input a hex number again:2The operation result is:2Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:3 ;验证乘法Input a hex number: 2Input a hex number again:2The operation result is:4Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:4 ;验证除法Input a hex number: 6Input a hex number again:2The operation result is:3Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:0 ;退出系统Program terminated normally三.实验代码:1)模块6-1程序(主程序); 程序名:6-1.ASM; 功能:显示菜单,接受从键盘输入的两个十六进制数,; 调用相应的程序模块执行相应的计算,计算结果以十六进制数输出。