循环程序设计课件_第1页
循环程序设计课件_第2页
循环程序设计课件_第3页
循环程序设计课件_第4页
循环程序设计课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

循环程序设计第1节.循环程序基本结构

(1)循环程序组成从以上循环程序实例中,我们看到循环程序的特点是程序中含有可以重复执行的程序段。循环程序由以下4部分组成:(1)初始化部分。程序在进入循环处理之前必须先设立初值,例如循环次数计数器、工作寄存器以及其它变量的初始值等,为进入循环做准备。(2)循环体部分。循环体也称为循环处理部分,是循环程序的核心。循环体用于处理实际的数据,是重复执行部分。(3)循环控制部分。在重复执行循环体的过程中,不断修改和判别循环变量,直到符合循环结束条件。一般情况下,循环控制有以下几种方式:

①计数循环——如果循环次数已知,用计数器计数来控制循环次数,这种控制方式用得比较多。循环次数要在初始化部分预置,在控制部分修改,每循环一次,计数器内容减1。例4.6、例4.7都属于计数循环控制方式。

②条件控制循环——在循环次数未知的情况下,一般通过设立结束条件来控制循环的结束,例4.8就是用条件A=0来控制循环结束的。

③开关量与逻辑尺控制循环——这种方法经常用在过程控制程序设计中,这里不再详述。

(4)循环结束处理。这部分程序用于存放执行循环程序所得结果以及恢复各工作单元的初值等。(2)循环程序的基本结构

循环程序通常有两种编制方法:一种是先处理再判断,另一种是先判断后处理,如图4.18所示。图4.18循环程序的两种基本结构(a)先执行后判断;(b)先判断后执行

第2节循环控制指令

循环指令和转移指令的功能基本一致,都是完成程序流程的转移,所不同的是循环指令会隐含使用CX寄存器作为记数器,每执行一次循环指令,(CX)就会自动被减1。机器指令格式:OPCODE(8位)DISP(8位)DISP和条件转移指令中的位移量解释相同,作为相对位移量,转移范围也是-128到127。执行步骤:1)CX<=(CX)-12)若循环条件满足,IP<=(IP)+DISP循环条件主要是指(CX)是否为0,如果(CX)=0则停止循环,不改变程序的执行流程,否则执行流程转移,继续循环。

有些循环指令在循环条件中还加上了对ZF标志的判断。

标志位影响:所有转移指令和循环指令都不会影响任何的标志位(虽然它们有时会对标志位的当前取值进行判断)

(1)LOOP指令

格式:LOOP目标地址

执行步骤:

1)CX<=(CX)-1

2)如果(CX)≠0,转移到目标地址,否则停止循环,顺序执行下一条指令

使用前提:在使用LOOP指令控制循环以前(进入程序的循环体以前),必须把循环次数保存到CX。

(2)LOOPZ/LOOPE指令

格式:LOOPZ/LOOPE目标地址

执行步骤:

1)CX<=(CX)-1

2)如果(CX)≠0ANDZF=1,则转移到目标地址,否则停止循环,顺序执行下一条指令。

(3)LOOPNE/LOOPNZ指令

格式:LOOPNE/LOOPNZ目标地址

执行步骤:

1)CX<=(CX)-1

2)如果(CX)≠0ANDZF=0,则转移到目标地址,否则停止循环,顺序执行下一条指令。

(4)JCXZ指令在循环程序中的作用

进入循环体之前,首先使用JCXZ指令判断(CX)是否为0,如果为0就跳转到循环体结束的位置,以免执行错误的循环过程。

第3节串操作与重复前缀指令

1.串操作指令

(1)各种串操作指令具有一些共同的特征:

a.源串必须在当前数据段DS中,目的串必须在附加数据段ES中,DS和ES可以重叠。

b.源串的偏移首地址必须在SI中,目的串的偏移首地址必须在DI中。所有串操作指令均以寄存器间接寻址方式访问操作数。

c.每执行一条串操作指令只能完成串中一个字或一个字节的操作,同时自动修改SI和DI的内容,以指向串中下一个元素。

d.标志位DF决定串操作的方向,是按增量还是按减量修改。若DF=0,则按增量修改,字节操作时加1,字操作时加2;若DF=I,则按减量修改,字节操作时减1,字操作时减2。

下面依次介绍MOVS、LODS、STOS、CMPS、SCAS等串操作指令。MOVS、LODS、STOS三类指令不影响标志位,CMPS、SCAS两类指令影响标志位。(2)串传送指令

格式:

一、MOVSDOPD,SOPD

二、MOVSB

三、MOVSW

功能:将以SI为指针的源串中的一个字节或字数据传送到以DI为指针的目的串中。

说明:

a.格式一带有两个操作数,它们是目的串和源串的符号地址,由串定义隐含指出了串的传送类型。

对格式二、三,明确地指定了串的传送类型为字节与字,不能带操作数,后面的指令是类似的情况。

b.与MOV指令不同,串传送指令允许目的串和源串都是存储器操作数。

(3)串装入指令

格式:

—、LODSSOPD

二、LODSB

三、LODSW

功能:将SI所指源串的一个字节或字数据送寄存器AL或AX中。

说明:格式一含有一个源操作数,它隐含说明了源串的类型

(4)串存储指令

格式:

—、STOSDOPD

二、STOSB

三、STOSW

功能:将寄存器AL或AX中内容存入DI所指目的串中的字节或字单元中。

说明:与LODS指令相似,只不过这里的操作数是目的操作数罢了。

(5)串比较指令

格式:

—、CMPSDOPD,SOPD

二、CMPSB

三、CMPSW

功能:将SI所指源串中的一个字节或字数据与DI所指目的串中相应字节或字数据进行比较。

说明:

a.对标志位的影响与CMP指令相同。

b.串比较指令与一般比较指令有一个重要区别,比较时用源操作数减目的操作数。

(6)串扫描指令

格式:

—、SCASDOPD

二、SCASB

三、SCASW

功能:在目的串中扫描AL或AX的内容,通过标志位的变化描述AL或AX的内容是否在目的串中出现。

说明:对字节扫描,以AL-[DI]影响标志位;对字扫描,以AX--[DI]影响标志位。

2.重复前缀指令

重复前缀指令包括无条件重复前缀指令REP、条件重复前缀指令REPZ/REPE与REPNZ/RPNE,它们必须被置于串操作指令之前,其间用空格做分隔,不能独立使用。

使用重复前缀指令时,还必须先将重复次数送入寄存器CX。每执行一次串操作指令,CX

自动减1,直到CX等于O时终止重复。

(1)无条件重复前缀指令REP

(2)条件重复前缀指令REPz,REPE

(3)条件重复前缀指令REPNz,REPNE

最后有三点说明:

(1)循环控制指令和重复前缀指令乍一看很像,但仔细分析两者差别很大。首先从功能上

看,循环控制指令用于循环执行某一程序段若干次,而重复前缀指令是重复执行某一串操作指

令若干次。其次从控制上看,循环控制指令是先将cx的内容减l,然后再判断cx是否等于0,

若不等于0,则循环执行;而重复前缀指令是首先判断Cx是否等于0,若不等于0,则重复执

行要重复的串操作指令。

(2)重复前缀和串操作指令只能写在一行中,但在用DEBUG调试程序反汇编调试时,两

者却是各占一行。

(3)重复前缀指令可以用循环控制指令实现。

第4节.循环程序控制方法

1、用计数器控制循环在循环初始化时设置循环次数→CX。循环体每工作一次,(CX)-1→CX进行调整。当(CX)=0,满足结束条件,退出循环。例5:存储在BLOCK为首地址内存中100个16bit带符号数,找出最大值后存在MAX单元中。取一次比较99次交换(待定)NAME

FOUND;定义程序名

DATA

SEGMENT;数据段说明开始

BLOCK

DW

65C8H,-35,694AH,……,0A398H

COUNT

EQU

($-BLOCK)/2-1;$为当前地址

MAX

DW;设置MAX的内存空间

DATA

ENDS;数据段说明结束

STACK

SEGMENT;堆栈段说明开始

DB

100

DUP(?);保留100字节堆栈空间

STACK

ENDS;堆栈段说明结束

CODE

SEGMENT;代码段说明开始

ASSUME

CS:CODE,DS:DATA,SS:STACK

FOUND

PROC

FAR;作为DOS系统的子程序说明

BEGIN:PUSH

DS;DOS的DS入栈保护

SUB

AX,AX;DOS的数据段首地址入栈保护

PUSH

AX

MOV

AX,DATA

MOV

DS,AX;设置本程序的DS

LEA

BX,BLOCK;本程序的运行程序开始MOV

AX,[BX]

INC

BX

INC

BX

MOV

CX,COUNT

AGAIN:CMP

AX,[BX]

JG

NEXT

MOV

AX,[BX]

NEXT:INC

BX

INC

BX

LOOP

AGAIN

MOV

MAX,AX;本程序运行结束

RET;调用内部中断返回DOS

FOUND

ENDP;子程序结束说明

CODE

ENDS;代码段结束说明

END

BEGIN;编译结束说明2、按条件控制循环

当循环次数不确定,则可按循环体工作后是否满足条件的判断确定是否结束循环。按条件控制循环常用于迭代运算或逼近运算。

例6:牛顿逐次逼近迭代运算16bit无符号数的平方根。迭代方程为:

Xi+1=(N/Xi+Xi)/2X1=(N/200)+2

迭代结束条件:Xi+1-Xi≤ε。

例如,N=90000,则X1=(90000/200)+2=452

X2=(90000/452+452)/2=326

X3=(90000/326+326)/2=301

X4=(90000/301+301)/2=300第5节多重循环程序设计

循环中包含另一个循环。每一循环都有各自的循环计数器和终点判断。多重循环程序的设计方法与单循环程序相同,但应注意:*各重循环的初始条件的控制;*内循环可以嵌套在外循环中,也可以几个内循环并列在外循环中,但各层循环之间不能交叉,内循环可以跳到外循环中,不可以从外循环直接跳进内层循环;*不能让循环回到初始条件,以免出现死循环。例:气泡法排序。由小到大有序排列以BUFFER为首地址的10个数据无序列,使其成为有序列

1)、排序的关键是比较和交换。2)、每次循环从数组的底部开始比较,每次循环完成一个小数的气泡升顶。3)、排序循环的结束条件是:在循环中未出现过交换。1、关于数据段初始化

DATA

SEGMENT

BUFFER

DW

22,-12,…,40

COUNT

EQU

$-BUFFER;

(COUNT=20)

DATA

ENDS

2、关于比较循环次数

对于10个字数据,比较9次

MOV

CX,COUNT

MOV

SI,CX

DEC

SI

DEC

SI;第一次取尾字的变址值

SHR

CX,1;20/2=10个字数据

DEC

CX;10-1=9次循环

3、关于取数和比较

采用变址寻址,其基地址为

BUFFER的地址。

MOV

AX,BUFFER[SI];

((SI)+OFFSETBUFFER)--AX

即Ej--AX

CMP

AX,BUFFER[SI-2];

Ej-Ej-1--PSW

4、关于交换

XCHG

AX,BUFFER[SI-2]

MOV

BUFFER[SI],AX

因为内存之间不能交换,所以必须通过AX作为过渡。第6节循环程序设计举例

例1

对数据区的30H单元开始清零64个单元

MOV

R0,#30H

MOV

R7,#64

MOV

A,#0LOOP:MOV

@R0,A

INC

R0

DJNZ

R7,LOOP例2

计算一串8位二进制无符号数之和,假定数串长度50个,排放在30H单元开始的RAM中,并假定累加和不大于8位二进制数。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论