D: EdIt hello. asm ;编写源程序 D: >MASM hello ;汇编源程序 Microsoft(R) Macro Assembler version 5.10 Copyright(C) Microsoft Corp 1981, 1988. All rights reserved. 49860+421241 Bytes symbol space free 0 Warning errors 0 Severe Errors D: pliNk hello ;连接程序 Microsoft (r) Overlay Linker Version 3.61 Copyright(C) Microsoft Corp 1983-1987. All rights reserved. LINK warning l4021: no stack segment 警告性错误:无堆栈段 D:}>heo;执行程序 少此错误可忽略
D:\>EDIT hello.asm ;编写源程序 D:\>MASM hello ; ;汇编源程序 Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. 49860 + 421241 Bytes symbol space free 0 Warning Errors 0 Severe Errors D:\>LINK hello ; ;连接程序 Microsoft (R) Overlay Linker Version 3.61 Copyright (C) Microsoft Corp 1983-1987. All rights reserved. LINK : warning L4021: no stack segment D:\>hello ;执行程序 D:\> 警告性错误:无堆栈段 此错误可忽略
D: >DEBUG hello.exe ;利用 DEBUG查看结果 ;查看程序代码 129F:0000FC 129F:0001B89D12MvAX,129D 129F:00048ED8 MOV DS, AX 129F:00068D360000 LEA SI,[0000 129F:000AB89E12 MOV AX,129E 129F:000D8EC0 MOV ES. AX 129F:000FBF0000 MOV DI,0000 129F:0012B90600 MOV CX,0006 129F:0015F3 REPZ 129F:0016A4 MOVSB 129F:0017B44C MOV AH. 4C 129F:0019CD21 INT 21 \\\\\ D129D:0L20 ;执行程序前,查看源串内容 129D:000048656C6C6F210000-0000000000000000 Hello! 129D:00100000000000000000-0000000000000000 D129E:0L20 执行程序前,查看目的串 129E:00000000000000000000-0000000000000000 129E:0010FCB89D128ED88D36-0000B89E128EC0BF6
D:\>DEBUG hello1.exe ;利用DEBUG查看结果 -U ;查看程序代码 129F:0000 FC CLD 129F:0001 B89D12 MOV AX , 129D 129F:0004 8ED8 MOV DS , AX 129F:0006 8D360000 LEA SI , [ 0000 ] 129F:000A B89E12 MOV AX , 129E 129F:000D 8EC0 MOV ES , AX 129F:000F BF0000 MOV DI , 0000 129F:0012 B90600 MOV CX, 0006 129F:0015 F3 REPZ 129F:0016 A4 MOVSB 129F:0017 B44C MOV AH, 4C 129F:0019 CD21 INT 21 、、、、、、 -D 129D:0 L20 ;执行程序前,查看源串内容 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129D:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -D 129E:0 L20 ;执行程序前,查看目的串 129E:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 129E:0010 FC B8 9D 12 8E D8 8D 36-00 00 B8 9E 12 8E C0 BF .......6........ -
G ;执行程序 Program terminated normall D129E:0L20 ;查看目的串 129E:000048656C6C6F210000-0000000000000000 Hello! 129E:0010FCB89D128ED88D36-0000B89E128EC0BF 6 D129d:0L50 ;从源串重新查看 129D:000048656C6C6F210000-0000000000000000 Hello! 129D:001048656C6C6F210000-0000000000000000 Hello 129D:0020FCB89D128ED88D36-0000B89E128EC0BF…6, 129D:00300000B90600F3A4B44CCD2109E8080003L! 129D:0040F1E803003C0DC3AC-E8ECF875043C3B75…<u.<;u 问题思考:(实验课上讨论) 1.一个段的大小为多少?一定是64K吗? 根据 DEBUG下查看的结果,画出程序各段在内存的存放情况。 2.假如将程序中的 MOV CX,6改为 MOV CX,100H 程序执行的结果会如何?试用 DEBUG观察结果
-G ; 执行程序 Program terminated normally -D 129E: 0 L20 ; 查看目的串 129E:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129E:0010 FC B8 9D 12 8E D8 8D 36-00 00 B8 9E 12 8E C0 BF .......6........ -D 129d: 0 L50 ; 从源串重新查看 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129D:0010 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129D:0020 FC B8 9D 12 8E D8 8D 36-00 00 B8 9E 12 8E C0 BF .......6........ 129D:0030 00 00 B9 06 00 F3 A4 B4-4C CD 21 09 E8 08 00 03 ........L.!..... 129D:0040 F1 E8 03 00 3C 0D C3 AC-E8 EC F8 75 04 3C 3B 75 ....<......u.<;u - 问题思考:(实验课上讨论) 1.一个段的大小为多少?一定是64K吗? 根据DEBUG下查看的结果,画出程序各段在内存的存放情况。 2. 假如将程序中的MOV CX, 6 改为 MOV CX , 100H 程序执行的结果会如何?试用DEBUG观察结果
3.假如程序中没有返回DOS的功能,程序执行的后果? aa SEGMENT ;数据段1 XX DB Hellot ;定义源串 aa ENDS SEGMENT ;数据段2 DB 6 dup(?) ;定义目的缓冲区 ENDS SEGMENT 代码段 ASSUME CS:ce,DS:a,ES:bb;指示指令中标号,变量所在段 start: CLD ;设置传送方向 MOV AX. aa ;DS:SI←源串首地址 MOV DS. AX LEA SI, XX MOV AX, SEG yy ;ES:DI←目的首地址 MOV ES AX MOV DI, OFFSET yY MOV cX. 6 ;CX←串的长度 REP MOVSB ;串传送 MOV AH. 4CH ;调用4CH系统功能返回DOS INT 21H ENDS END start ;指示程序结束和程序入口
3. 假如程序中没有返回DOS的功能,程序执行的后果? aa SEGMENT ; 数据段1 xx DB 'Hello!’ ; 定义源串 aa ENDS bb SEGMENT ;数据段2 yy DB 6 dup (?) ; 定义目的缓冲区 bb ENDS cc SEGMENT ;代码段 ASSUME CS:cc, DS:aa, ES:bb ;指示指令中标号,变量所在段 start : CLD ;设置传送方向 MOV AX , aa ;DS: SI ← 源串首地址 MOV DS , AX LEA SI , xx MOV AX , SEG yy ;ES:DI ← 目的首地址 MOV ES , AX MOV DI , OFFSET yy MOV CX , 6 ;CX ← 串的长度 REP MOVSB ;串传送 ; MOV AH , 4CH ;调用4CH系统功能,返回DOS ; INT 21H cc ENDS END start ;指示程序结束和程序入口
D: MASMDEBUG helloexe 129F:0000FC CLD 129F:0001B89D12 MOV AX. 129D 129F:00048ED8 MOV DS. AX 129F:00068D360000 LEA SI,[0000] 129F:000AB89E12 MOV AX. 129E hello.exe 129F:000D8EC0 MOV ES, AX 用户程序 129F:000FBF0000 MOV DI,0000 129F:0012B90600 MOV CX,0006 129F:0015F3 REPZ 129F:0016A4 MOVSB 129F:001746 INC SI 129F:001843 INC BX 与用户程序相连的 129F:001950 PUSH AX 内存内容被看作 129F:001AFF36C601 PUSH[01c6程序时 129F: 001E FFFF ??? 01死机
D:\MASM\DEBUG hello1.exe - U 129F:0000 FC CLD 129F:0001 B89D12 MOV AX, 129D 129F:0004 8ED8 MOV DS, AX 129F:0006 8D360000 LEA SI, [0000] 129F:000A B89E12 MOV AX, 129E 129F:000D 8EC0 MOV ES, AX 129F:000F BF0000 MOV DI, 0000 129F:0012 B90600 MOV CX, 0006 129F:0015 F3 REPZ 129F:0016 A4 MOVSB 129F:0017 46 INC SI 129F:0018 43 INC BX 129F:0019 50 PUSH AX 129F:001A FF36C601 PUSH [01C6] 129F:001E FFFF ??? DI - hello.exe 用户程序 与用户程序相连的 内存内容被看作 程序时 死机