微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.

Slides:



Advertisements
Similar presentations
第1章第1章 PC/AT 系統 1 Chapter 1 Chapter 1 PC/AT 系統 001.
Advertisements

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
汇编语言程序设计 吴 向 军 中山大学计算机科学系
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
第四章 汇编语言 程序设计 任课教师:王晓甜
第一章 计算机基础知识 第一节 计算机概述 一、计算机的基本组成和工作原理 二、有关术语 三、计算机发展简史 四、微型计算机概述
输入/输出及接口 输入/输出的传送方式 中断技术 80x86/Pentium中断系统 8259A可编程中断控制器 中断程序设计
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
本章分为四节,主要介绍: 4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 常用程序举例.
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
单片机原理与应用.
第3章 80x86汇编语言程序设计(下).
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
第7章 中断与异常.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
第6章 DMA传输 6.1 DMA传输原理 6.2 DMA控制器8237A A的编程使用 欢迎辞.
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
第2章 MCS-51单片机指令系统与汇编语言程序设计
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第8章 寻址方式与指令系统.
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
微机原理及应用 主讲:谢维成 西华大学 电气信息学院 1.
微机原理及应用 主讲:郑海春.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
第8章 PCH中的常规接口.
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第 13 章 中断系统.
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
可编程定时计数器.
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
大数据搜索挖掘实验室 第五章 子程序设计 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第8章 并行接口芯片 并行接口一般具有两个或两个以上的8位I/O接口。各个口的工作方式可由程序分别确定或改变,使用灵活,便于和各种外部设备连接。因此,又称可编程的外部接口(PPI) 目前各主要微处理器厂商都有自己的PPI产品,但它们的功能基本类似.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日

微机原理与接口技术 第4章8086汇编语言程序设计 朱华贵 2015年11月05日

主要内容: 汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计

§4.1 汇编语言源程序 了解: 计算机的三种语言 源程序的结构 汇编语言语句格式

一、计算机设计语言 机器语言 汇编语言 高级语言 面向机器 的语言 机器语言 汇编语言 高级语言

汇编程序 汇编语言源程序 用助记符编写 机器语言目标程序 汇编语言源程序 汇编程序 源程序的编译程序

汇编语言程序设计与执行过程 输入汇编语言源程序 源文件 .ASM 汇编(编译) 目标文件 .OBJ 链接 可执行文件 .EXE 调试 最终程序

二、汇编语言源程序结构 … … 数据段名 SEGMENT 数据段名 ENDS 附加段名 SEGMENT 附加段名 ENDS

三、汇编语言语句类型 指令性语句 指示性语句 CPU执行的语句,能够生成目标代码 CPU不执行,而由汇编程序执行的语句,不生成目标代码

四、汇编语言语句格式 指令性语句: [标号:] [前缀] 助记符 [操作数],[操作数] [ ;注释] 指令的符号地址,标号后要有冒号 [标号:] [前缀] 助记符 [操作数],[操作数] [ ;注释] 指令的符号地址,标号后要有冒号 注释前加分号 操作码

指示性语句格式 [名字] 伪指令助记符 操作数 [,操作数,…] [ ;注释] 变量的符号地址,其后不加冒号 指示性语句中至少有一个操作数

标号、名字 标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。 英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。

操作码 指令码 命令CPU要完成的操作 伪指令助记符 指示汇编程序要完成的操作。 用来定义变量,分配存储单元, 指示程序开始和结束等

注释 用分号作为注释的开始; 用于说明程序或语句的功能,以便于阅读和理 解

操作数 寄存器 存储器单元 常量 变量或标号 表达式

常量 数字常量 字符串常量:用引号引起的字符或字符串 例:‘A’,’ABCD’ 汇编时被译成对应的ASCII码41H,42H,43H,44H

变量 代表内存中的数据区,程序中视为存储器操作数 变量的属性: 段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之 间的位移量。 段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之 间的位移量。 类 型 字节型、字型和双字型

五、表达式 算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算

算术运算和逻辑运算符 算术运算符 +,-,*,/,MOD 逻辑运算符 AND,OR,NOT,XOR 例:MOV AL,8 AND 4

关系运算符 参与关系运算的必须是两个数值 关系不成立,结果为0; 关系成立,结果为FFFFH。 EQ NE LT GT LE GE

取值运算符 取值运算符 用于分析存储器操作数的属性 OFFSET 取得其后变量或标号的偏移地址 SEG 取得其后变量或标号的段地址 TYPE 取变量的类型 LENGTH 取所定义存储区的长度 SIZE 取所定义存储区的字节数

取值运算符例 MOV AX,SEG DATA MOV DS,AX MOV BX,OFFSET DATA LEA BX,DATA 等价于

取值运算符例 若BUFFER存储区是用如下伪指令定义: BUFFER DW 200 DUP(0) 则: TYPE BUFFER 等于2 LENGTH BUFFER 等于200 SIZE BUFFER 等于400

属性运算符 属性运算符PTR 用于指定其后存储器操作数的类型 例: MOV BYTR PTR[BX],12H

其它运算符 方括号: [ ] 方括号中内容为操作数的偏移地址 段重设符 段寄存器名:[ ] 用于修改默认的段基地址

§4.2 伪指令 掌握: 伪指令的格式及实现的操作 伪指令的应用

伪指令 由汇编程序执行的“指令系统” 用于定义变量、分配存储区、定义逻辑段、指示程序开始和结束等 常用伪指令: 数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 结束伪指令

一、数据定义伪指令 用于定义数据区中变量的类型 格式: 变量名 伪指令助记符 操作数,… ;注释 某些情况下可省略 可选

数据定义伪指令 伪指令助记符 DB 定义的变量为字节型 DW 定义的变量为字类型(双字节) DD 定义的变量为双字型(4字节) DQ 定义的变量为4字型(8字节) DT 定义的变量为10字节型

数据定义伪指令例 DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H 以上变量在内存中的存放形式

数据定义伪指令 伪指令的性质决定所定义变量的属性; 定义字符串必须用DB伪指令 例: DATA1 DB ‘ABCD’,66H ‘A’ 41H

重复操作符 为一个数据区的各单元设置相同的初值 格式: [变量名] 伪指令助记符 n DUP(初值,…) 例: DW 20 DUP(0) DB 3 DUP(22H,11H,?) 随机数

用?预留存储空间 MEM1 DB 34H,’A’,?,?,? DW 20 DUP(?) 预留40个字节单元

二、符号定义伪指令 格式: 符号名 EQU 表达式 操作: 用符号名取代后边的表达式,不可重新定义 例: CONSTANT EQU 100 VAR EQU 30H+99H EQU说明的表达式不占用内存空间

优 先 级 操 作 符 高 低 (),[] LENGTH,SIZE,WIDTH,MASK SEG、OFFSET、TYPE、PTR、THIS、段操作符 LOW、HIGH *、/、MOD、SHR、SHL +、- EQ、NE、LT、GT、LT、LE、GE NOT AND OR、XOR SHORT

三、段定义伪指令 说明逻辑段的起始和结束; 说明不同程序模块中同类逻辑段之间的联系形态 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS 说明逻辑段的起点 说明不同模块中同名段的组和连接方式

定位类型 PARA: 段的起点从节边界开始(16个字节为 1节) BYTE: 段的起点从存储器任何地址开始 WORD:段的起点从偶地址开始 PAGE: 段的起点从页边界开始(256个字节 为1页)

组合类型 与其它模块中的同名段在满足定位类型的前提下 具有的组合方式: NONE: 不组合 PUBLIC: 依次连接(顺序由LINK程序确定) COMMON: 覆盖连接 STACK: 堆栈段的依次连接 AT 表达式:段定义在表达式值为段基的节边界 MEMORY: 相应段在同名段的最高地址处。

类别 不同模块连接时将相同类别的段放在连续的内存区域中

段定义伪指令例 DATA SEGMENT PUBLIC ‘CODE’ MEM1 DB 11H,22H DATA ENDS

四、设定段寄存器伪指令 说明所定义逻辑段的性质 格式 ASSUME 段寄存器名:段名 [,段寄存器名:段名,…]

五、结束伪指令 表示源程序结束 格式: END [标号]

一个完整源程序结构例 DSEG SEGMENT DATA1 DB 1,2 DATA2 DW 1234H DSEG ENDS ESEG SEGMENT DB 20 DUP(?) ESEG ENDS SSEG SEGMENT STACK ‘STACK’ DB 200 DUP(?) SSEG ENDS

一个完整源程序结构例 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX ┇ CSEG ENDS END START 源程序 代码

六、过程定义伪指令 用于定义一个过程体 格式: 过程名 PROC [ NEAR / FAR ] ┇ 过程名 ENDP 过程入口的符号地址 RET 过程名 ENDP 过程入口的符号地址

七、宏命令伪指令 宏命令--------源程序中由汇编程序识别的具有 独立功能的一段程序代码 格式: 宏命令名 MACRO <形式参数> ┇ ENDM 宏体

八、其它伪指令 ORG ------- 段内程序代码或变量的起始偏移地址 格式: ORG 表达式 例: ORG 2000H 计算值为非负常数

其它伪指令 NAME-------为目标程序设定一个名字 格式: NAME 模块名 TITLE-------为程序清单指定打印标题 可以缺省

§4.3 功能调用 DOS 功能调用 高级调用,操作系统提供 BIOS功能调用 低级调用

DOS 功能调用 包含多个子功能的功能包,用软中断指令调用,中断类型码固定为21H; 各子功能采用功能号来区分: 设备管理 目录管理 文件管理 其它

DOS 功能调用 调用格式: MOV AH,功能号 <置相应参数> INT 21H

1.从键盘输入单字符并显示 调用方法: MOV AH,01 INT 21H 输入的字符在AL中

单字符输入例 GET_KEY: MOV AH,1 INT 21H CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY YES: ┇ NO: ┇ 交互式应 答程序

2. 从键盘输入字符串 AH 功能号OAH DS:DX 字符串在内存中的存放地址 INT 21H

定义字符缓冲区 用户自定义缓冲区格式: N1 N2 0DH 整个缓冲区 实际键入字符数 最大键入字符数

输入字符串程序段 DAT1 DB 20,?,20 DUP(?) LEA DX,DAT1 MOV AH,0AH INT 21H 在数据段中定义

输入缓冲区 定义后的输入缓冲区初始状态: 14H ? 20个字节

3. 单字符显示输出 AH 功能号O2H DL 待输出字符 INT 21H

单字符显示输出例 MOV AH,02 MOV DL,41H INT 21H 执行结果: 屏幕显示A

4. 字符串输出显示 AH 功能号O9H DS:DX 待输出字符串的偏移地址 INT 21H 被显示的字符串必须以‘$’结束,且所显示的内容不应出现非可见的ASCII码

字符串输出显示例 DATA SEGMENT MESS1 DB ‘Input String:’ 0DH,0AH,’$’ DATA ENDS CODE SEGMENT ┇ MOV AH,09 MOV DX,OFFSET MESS1 INT 21H

§4.4 汇编语言程序设计 设计步骤: 根据实际问题抽象出数学模型 确定算法 画程序流程图 分配内存工作单元和寄存器 程序编码 调试

程序流程图符号 起始: 判断: 子过程: 功能:

在计算机上进行程序设计过程 D:\masm>EDIT 输入源程序 D:\masm>MASM 汇编 D:\masm>LINK 链接 D:\masm>DEBUG 调试

2. 判断程序质量的标准 程序的正确性 程序的可读性 程序的执行时间 程序所占内存大小

3.几种程序结构 顺序结构 分支结构 循环结构 子程结构

顺序结构

、、、 分支结构 CMP AL, BL JG great Y JMP exit great: AL≤BL处理 exit: 、、、 N 两个分支 Y N

分支结构 CMP AL, 0 JG great JL less JMP exit less: N AL=0处理 great: Y 、、、 CMP AL, 0 JG great JL less JMP exit less: great: exit: 、、、 AL=0处理 AL>0处理 AL<0处理 三个分支 Y N

循环结构 循环初始设置 循环初始设置 N 循环条件判断? 循环体 Y 循环体 N 循环条件判断? Y 直到型循环 当型循环 (直到条件成立退出循环) 当型循环 (当条件成立进入循环)

子程结构 注意返回DOS语句位置 1.多处调用完成同一功能的子程: 2.模块化程序设计: code SEGMENT code SEGMENT start: 、、 CALL sub 、、 MOV AH, 4CH INT 21H sub PROC RET sub ENDP code ENDS END start 2.模块化程序设计: code SEGMENT begin: CALL sub1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21H sub1 PROC 、、 RET sub1 ENDP sub2 PROC sub2 ENDP sub3 PROC sub3 ENDP code ENDS END begin 注意返回DOS语句位置

4.4.3 顺序结构程序设计 顺序结构程序又称简单程序。 采用这种结构的程序,按照指令书写的顺序逐条执行,程序的执行路径没有分支和循环。

顺序结构程序设计举例 【例4-1】编程将内存数据段字节单元INDAT存放的一个数n(假设0≤ n ≤9 ),以十进制形式在屏幕上显示出来。 例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。

【例4-1】程序代码 DATA SEGMENT ;数据段定义 INDAT DB 8 DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化DS

【例4-1】程序代码(续) MOV DL,INDAT OR DL,30H MOV AH 2 INT 21H MOV DL,'D' MOV AH,2 MOV AH,4CH CODE ENDS END START

4.4.4 分支结构程序设计 分支结构程序利用条件转移指令或跳转表,使程序执行完某条指令后,根据指令执行后状态标志的情况选择要执行哪个程序段。 分支结构程序的指令执行顺序与指令的存储顺序不一致。 转移指令JMP和Jcc可以实现分支结构。

分支结构的三种形式

单分支结构程序设计举例 【例4-2】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。 … CMP AX,0 JGE ISPOSITIVE NEG AX ISPOSITIVE: MOV RES,AX 本例采用的是单分支结构。特点是:条件成立时程序跳转;否则,顺序执行。

双分支结构程序设计举例 【例4-3】 编程判断DAT单元存放的带符号数的正负。 如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。

【例4-3】(续) DATA SEGMENT ;数据段定义 N DB 'DAT is a negative number!','$' NN DB 'DAT is a nonnegative number!', '$' DAT DW -3 DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;设置DS

【例4-3】(续) MOV AX,DAT CMP AX,0 JGE ISNN LEA DX,N MOV AH,9 INT 21H JMP FINISH

【例4-3】(续) ISNN:LEA DX,NN MOV AH,9 INT 21H FINISH: MOV AH,4CH CODE ENDS END START

【例4-3】(续) 【例4-4】采用的是双分支结构。 采用这种结构时,特别要注意第一个分支后要利用JMP指令(程序第16行)使程序跳转到第二个分支的后面。

多分支结构程序设计举例 【例4-4】 编程求分段函数Y的值。已知变量X为16位带符号数,分段函数的值要求保存到字单元Y中。函数定义如下:

【例4-4】(续) DATA SEGMENT ;数据段定义 X DW -128 Y DW ? DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

【例4-4】(续) MOV AX,X CMP AX,0 JG ISPN JZ ISZN MOV Y,-1 JMP FINISH ISPN:MOV Y,1 ISZN:MOV Y,0

【例4-4】(续) FINISH: MOV AH,4CH INT 21H CODE ENDS END START 本例实现的是多分支结构。 设计多分支结构程序时,应注意: 要为每个分支安排出口; 各分支的公共部分尽量集中,以减少程序代码; 无条件转移没有范围的限制,但条件转移指令只能在-128~+127字节范围内转移; 调试程序时,要对每个分支进行调试。

4.4.5 循环结构程序设计 当程序处理的问题需要包含多次重复执行某些相同的操作时,在程序中可使用循环结构来实现,即用同一组指令,每次替换不同的数据,反复执行这一组指令。 使用循环结构,可以缩短程序代码,提高编程效率。

循环结构程序的组成 循环程序由以下3个部分组成。 (1)初始化部分 (2)循环体 初始化部分是循环的准备部分,在这部分应完成地址指针、循环计数、结束条件等初值的设置。 (2)循环体 循环体包括以下3个部分。 循环工作部分:是循环程序的主体。完成程序的基本操作,循环多少次,这部分语句就执行多少次。 循环修改部分:修改循环工作部分的变量地址等,保证每次循环参加执行的数据能发生有规律的变化。

循环结构程序的组成(续) (3)循环结束部分 循环控制部分:控制循环执行的次数,检测和修改循环控制计数器,控制循环的运行和结束。 在循环结束部分,完成循环结束后的处理,如数据分析、结果的存放等。

循环程序结构 计数循环 条件循环 for(i=0;i<100;i++) do { }while() while () do {}

设计循环结构程序时,要注意以下问题: ① 选用计数循环还是条件循环,采用直到型循环结构还是当型循环结构; ② 可以用循环次数、计数器、标志位、变量值等多种方式来作为循环的控制条件,进行选择时,要综合考虑循环执行的条件和循环退出的条件; ③ 注意不要把初始化部分放到循环体中,循环体中要有能改变循环条件的语句。

循环结构程序设计举例 【例4-6】 编程显示以“!”结尾的字符串。 如:“Welcome to MASM!”。

【例4-6】(续) DATA SEGMENT MYSTR DB 'Welcome to MASM!' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

【例4-6】(续) LEA SI,MYSTR NEXTCHAR: MOV DL,[SI] CMP DL,'!' JZ FINISH MOV AH,2 INT 21H INC SI JMP NEXTCHAR

【例4-6】(续) FINISH: MOV AH,2 INT 21H MOV AH,4CH CODE ENDS END START 由于只知道循环结束的条件是该字符串以“!”结束,不知道字符串的长度,所以,采用了条件控制的方法来控制循环的次数。

单重循环程序设计 例:将以s1为起始地址的26个字母依次传送到以s2为起始地址的连续单元中。 数据定义如下: DATA SEGMENT S1 DB ‘ABCD……XYZ’ DATA ENDS ESTRA SEGMENT S2 DB 26 DUP(?) ESTRA ENDS

方法1 采用寄存器间接寻址方式 MOV AX, SEG S1 ;初始化 MOV DS, AX MOV AX, SEG S2 MOV ES, AX MOV SI, OFFSET S1 MOV DI, OFFSET S2 MOV CX, 26 LOP1: MOV AL, [SI] ;工作部分 MOV ES:[DI], AL INC SI ;修改部分 INC DI LOOP LOP1 ;控制部分

方法2 采用变址寻址方式 MOV AX, SEG S1 ;初始化 MOV DS, AX MOV AX, SEG S2 MOV ES, AX MOV SI, 0 MOV DI, 0 MOV CX, 26 LOP1: MOV AL, S1[SI] ;工作部分 MOV ES:S2[DI], AL INC SI ;修改部分 INC DI LOOP LOP1 ;控制部分

方法3 采用基址变址寻址方式 MOV AX, SEG S1 ;初始化 MOV DS, AX MOV AX, SEG S2 MOV ES, AX MOV BX, OFFSET S1 MOV BP, OFFSET S2 MOV SI, 0 MOV DI, 0 MOV CX, 26 LOP1: MOV AL, [BX+SI] ;工作部分 MOV ES:[BP+DI], AL INC SI ;修改部分 INC DI LOOP LOP1 ;控制部分

方法4 采用串处理指令 MOV AX, SEG S1 ;初始化 MOV DS, AX MOV AX, SEG S2 MOV ES, AX LEA SI, S1 LEA DI, S2 MOV CX, 26 CLD REP MOVSB

循环结构程序设计举例(续) 【例4-7】 编程以二进制形式显示BX的值(假设为无符号数)。 如果(BX)=20,那么显示: CODE SEGMENT ASSUME CS:CODE START: MOV AX,DATA MOV DS,AX

【例4-7】(续) MOV BX,20 MOV CX,16 ; 计数器CX,置初值16 NEXTCHAR: ROL BX,1 ;显示顺序是从左往右, MOV DL,BL ;要显示的值仅占最低位D0 AND DL,01 ;清除D7~D1 OR DL,30H

【例4-7】(续) MOV AH,2 INT 21H ;利用2号DOS调用显示 LOOP NEXTCHAR ;循环执行16次 FINISH: MOV DL,'B' INT 21H ;利用2号DOS调用,显示'B'

【例4-7】(续) MOV AH,4CH INT 21H ; 返回操作系统 CODE ENDS END START 本例中,由于已知BX是16位的,因此,循环的次数就是16次,所以可以采用计数法控制循环。