第三节汇编语言程序举例 例一、数据传送程序 例二、查找关键字 ▲掌握DOS的装入和返回功能
第三节 汇编语言程序举例 例一、数据传送程序 例二、查找关键字 ▲ 掌握DOS的装入和返回功能
▲复习DOS系统的启动过程 磁盘 执行用户程序后, 引导程序 IO. SYS 若要返回DOS状态 内存 DOS MSDOS. SYS 即在屏幕上出现DOS提示符,「IKB中断向量表 COMMAND. COM 等待输入新的命令 2)引导程序 EDITEXE MASMEXE 其他 应在用户程序的最后安排 IO. SYS模块 LINK.EXE 系统 MSDOS. SYS模块 DEBUG.exe 程序 完成此功能的程序段。 3) COMMAND. COM RAM 4)程序 空间 hello. asm 通常采用调用 hello. obj DOS系统功能完成。 hello. exe ROM BIOS 应用程序 ROM 1)F:000.统检测程序
▲复习DOS系统的启动过程 执行用户程序后, 若要返回 DOS状态, 即在屏幕上出现 DOS提示符, 等待输入新的命令, 应在用户程序的最后安排 完成此功能的程序段。 FFFF:0000H 1 2 4 3 ? ROM 系统检测程序 IO.SYS 模块 COMMAND.COM MSDOS.SYS 模块 用户程序 空 间 引导程序 1KB 中断向量表 RAM 内 存 ROM BIOS DOS IO.SYS COMMAND.COM MSDOS.SYS 引导程序 磁 盘 EDIT.EXE MASM.EXE LINK.EXE DEBUG.exe 应 用 程 序 其他 系统 程序 hello.asm hello.obj hello.exe 通常采用调用 DOS 系统功能完成
调用DOS系统的4CH功能,返回DOS 方法:在要返回DOS处,安排指令: MOV AH. 4CH INT 21H 执行完4CH的功能调用,即返回DOS。 例 code SEgment ASSUME CS: code start:、 程序主体部分 MOV AH,4CH;返回DOS NT 21H code ENDs END start
调用DOS系统的4CH 功能, 返回DOS 方法: 在要返回DOS 处,安排指令: MOV AH, 4CH INT 21H 执行完4CH的功能调用,即返回DOS 。 例 code SEGMENT ASSUME CS: code start: 、、、 ;程序主体部分 、、、 、、、 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start
例一编写完整汇编语言程序,完成内存数据块传送功能。 将某段中的字符串Helo!传送到另一段中 匚开始 建立传送方向 DS:SI←源串首地址 ES:DI←目的串首地址 CX←串长度 串传送 返回DOS
例一 编写完整汇编语言程序,完成内存数据块传送功能。 将某段中的字符串“Hello!”传送到另一段中。 开始 建立传送方向 DS: SI ← 源串首地址 ES: DI ←目的串首地址 CX ← 串长度 串传送 返回 DOS
a SEGMENT ;数据段1 XX DB Hello! ;定义源串 aa ENDS bb SEGMENT ;数据段2 DB 6 dup(?) ;定义目的缓冲区 bb ENDS SEGMENT ;代码段 ASSUME CS:c,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, OFFSETyY MOV CX. 6 ;CX←串的长度 REP MOVSB ;串传送 MOV AH, 4CH ;调用4CH系统功能返回DOS INT 21H ENDS END start ;指示程序结束和程序入口
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: 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 用户程序 与用户程序相连的 内存内容被看作 程序时 死机