
第三节汇编语言程序举例汇编语言程序设计方法例一、数据传送程序例二、顺序程序例三、循环程序例四、调用子程序(查找关键字)掌握DOS的装入和返回功能
第三节 汇编语言程序举例 ▲汇编语言程序设计方法 例一、数据传送程序 例二、顺序程序 例三、循环程序 例四、调用子程序(查找关键字) ▲ 掌握DOS的装入和返回功能

汇编语言程序设计方法>编制汇编程序步骤:明确任务,确定算法绘流程图根据流程图编写汇编语言程序上机调试程序>程序的基本结构:顺序结构分支结构循环结构子程序结构
汇编语言程序设计方法 ➢编制汇编程序步骤: 明确任务,确定算法 绘流程图 根据流程图编写汇编语言程序 上机调试程序 ➢程序的基本结构: 顺序结构 分支结构 循环结构 子程序结构

编写汇编语言程序步骤分析实际问题,抽象描述问题的模型确定解决模型的算法按算法画出程序流程图按流程图编写程序上机调试,运行程序
编写汇编语言程序步骤 ⚫ 分析实际问题,抽象描述问题的模型 ⚫ 确定解决模型的算法 ⚫ 按算法画出程序流程图 ⚫ 按流程图编写程序 ⚫ 上机调试, 运行程序

编辑源程序EDITABC.ASM汇编源程序MASMABC.ASM有汇编错误信息?IN形成目标程序ABC.OBJ连接目标程序LINKABC.OBJ1有连接错误信息?N形成可执行程序ABC.EXE装入可执行程序到内执行ABC运行结果正确?下一程序INN用DEBUG调试程序查错?IY用DEBUG调试可执行程序找到原因DEBUGABC.EXE
编辑源程序EDIT ABC.ASM 汇编源程序 MASM ABC.ASM 形成目标程序ABC.OBJ 连接目标程序 LINK ABC.OBJ 有连接错误信息? 形成可执行程序 ABC.EXE 装入可执行程序到内存并执行 ABC 下一程序 用DEBUG 调试可执行程序 DEBUG ABC.EXE 找到原因 Y N Y N N Y N 有汇编错误信息? 运行结果正确? Y 用DEBUG 调试程序查错?

复习DOS系统的启动过程磁盘引导程序执行用户程序后,I0.SYSDOSMSDOS.SYS若要返回DOS状态,内存COMMAND.COM1KB中断向量表即在屏幕上出现DOS提示符EDIT.EXE2引导程序等待输入新的命令,其他MASM.EXE系统IO.SYS模块LINK.EXE应在用户程序的最后安排程序DEBUG.exeMSDOS.SYS模块RAMCOMMAND.COM完成此功能的程序段3用户程序?应用程序hello.asm空郵间通常采用调用hello. objDOS系统功能完成hello.exeROMBIOSROM系统检测程序FFFF:0000H1
▲复习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, 4CHINT21H执行完4CH的功能调用,即返回DOS。例codeSEGMENTASSUME CS:code:程序主体部分start:;返回DOSMOVAH, 4CH21HINTENDScodeENDstart
调用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

例一编写完整汇编语言程序,完成内存数据块传送功能将某段中的字符串“"Hello!"传送到另一段中。开始建立传送方向源串首地址DS: SI+ES:DI ←E目的串首地址CX+串长度串传送返回DOS
例一 编写完整汇编语言程序,完成内存数据块传送功能。 将某段中的字符串“Hello!”传送到另一段中。 开始 建立传送方向 DS: SI ← 源串首地址 ES: DI ←目的串首地址 CX ← 串长度 串传送 返回 DOS

;数据段1SEGMENTaa;定义源串DB 'Hello!'XXENDSaabb;数据段2SEGMENT;定义目的缓冲区DB 6 dup(?)yybbENDS;代码段SEGMENTcc;指示指令中标号,变量所在段ASSUME CS:cc, DS:aa. ES:bbCLD;设置传送方向start :MOV;DS:SI源串首地址AX,aaMOVDS, AXLEASI,XXMOV;ES:DI←目的首地址AX, SEGyyMOVES.AXMOVDI,OFFSETyyMOVCX←串的长度CX, 6REP;串传送MOVSBMOVAH, 4CH:调用4CH系统功能,返回DOSINT21HENDSccEND;指示程序结束和程序入口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:>EDIThello.asm;汇编源程序D:I>MASM hello;Microsoft (R) Macro Assembler Version 5.10Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.49860+421241Bytessymbol spacefreeOWarning Errors0 Severe Errors;连接程序hello ;D:>LINKMicrosoft (R) Overlay Linker Version 3.61Copyright (C) Microsoft Corp 1983-1987. All rights reserved.LINK : warning L4021: no stack segment警告性错误:无堆栈段;执行程序D:l>hello此错误可忽略D:I>
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:\> 警告性错误:无堆栈段 此错误可忽略

:利用DEBUG查看结果D:l>DEBUGhellol.exe-U:查看程序代码129F:0000FCCLD129F:0001B89D12MOVAX.129DMOVDS, AX129F:00048ED8129F:00068D360000LEASI100001AX.MOV129E129F:000AB89E12MOVES,AX129F:000D8EC0DI,MOV0000129F:000FBF0000CX.MOV0006129F:0012B90600REPZ129F:0015F3129F:0016A4MOVSBMOVAH,4C129F:0017B44C21INT129F:0019CD21查看源串内容-D129D:0L20;执行程序前,129D:000048656C6C6F210000-0000000000000000Hello.......129D:00100000000000000000-0000000000000000-D129E:0L20;执行程序前,查看目的串129E:00000000000000000000-0000000000000000129E:0010FCB89D128ED88D36-0000B89E128EC0BF0
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. -