32程序设计的基本结构
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环程序设计
•循环程序分类 •按循环控制条件分类
计数循环——重复次数已知,用计数值控制循环的开始与终止。 条件控制循环——重复次数未知或不确定,需找出循环控制的条件。 •按循环体内结构分类 单重循环——循环体内只是顺序程序或分支程序,不再有循环程序。
多重循环——循环体内再套有循环程序。
•循环程序设计要点 (1)怎样把求解的问题变为循环结构的程序类型——怎样实现重复。循环工作 部分的设计尤为重要,因为这是多次重复的部分,注意程序的精练,以及循 环体头部的确定。 (2)怎样使循环准确地执行完毕,注意循环控制部分的设计。特别是对条件控 制的循环,注意设置循环结束标志。
由多个标志的状态决定的转移,分为有符号数和无符号数转移 •无符号数转移指令 比较两个无符号数,并根据比较结果转移 JA 标号 ;两数比较,高于则转移 (JNBE) JNA 标号 ;两数比较,不高于则转移(JBE) JB 标号 ;两数比较,低于则转移 (JNAE) JNB 标号 ;两数比较,不低于则转移(JAE) •有符号数转移指令 比较两个带符号数,并根据比较结果转移 JG 标号 ;两数比较,大于则转移 (JNLE) JNG 标号 ;两数比较,不大于则转移(JLE) JL 标号 ;两数比较,小于则转移 (JNGE) JNL 标号 ;两数比较,不小于则转移(JGE)
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,BUF1 ;入口参数 INC SI ;指向数据开始 MOV CX,N1 ;入口参数 CALL SUBROT MOV [BUF1],AL LEA SI,BUF2 INC SI ;指向数据开始 MOV CX,N2 CALL SUBROT MOV [BUF2],AL MOV AH,04CH INT 21H
例如:DI=200H 双字(DS:0200H)=12345678H JMP DWORD PTR [DI] 指令执行: 低位字:(IP)=5678H 高位字(CS)=1234H
Part1 JMP DWORD PTR [DI]
CS:0100H
Part2 XXX Part3
1234H:5678H
程序转移指令—条件转移 复杂转移:
例如: (SI)=0100H JMP SI 指令跳转到 CS:0100H执行。 34H 12H
Part1 JMP [BX] 例如,(BX)=100H,DS:0100H=1234H JMP [BX] 指令跳转到 CS:1234H执行。 Part2 1234H XXX Part3
CS:0100H
跳过1134H CS:1234H DS:0100H
IP=1234H
五、程序转移指令—无条件转移 •段间转移: •直接转移 : JMP DEST
例如:
JMP 12345678H 指令跳转到 1234:5678H执行
32位立即数 32内存操作数
FAR 标号
(IP)←低16位
(CS)←高16位
78H 56H 34H 12H
DS:0200H
IP=5678H CS=1234H
2组8位无符号数,每组中有N个无符号数,分别找出每一组中的最大数,并将最 大数存放在每组数的开绐地址。
DATA SEGMENT BUF1 DB ?,12H,45H……… N1=$-BUF1 BUF2 DB ?,65H,ACH…… N2=$-BUF2 ENDS ;子程序的入口参数: ;SI=数据区的首地址,CX=数据个数 ;出口参数:AL为最大的数 ;用到的寄存器:AX,CX,SI SUBROT PROC PUSH CX ;子程序开始 PUSH SI DEC CX ;循环次数为N-1 MOV AL,[SI] ;取第一个数 LOOP1:INC SI ;指向被比较的数 CMP AL,[SI] JA NEXT MOV AL,[SI] NEXT:DEC CX JNZ LOOP1 POP SI POP CX RET SUBROT ENDP CODE ENDS END START
循环程序设计
循环程序的几种结构形式
起 始
起 始
初始化部分 完
起 始
初始化部分
循环工作部分 循环修改部分 未完 循环控制 完 终 止
初始化部分
循环修改部分 完
循环控制 未完
循环控制 终 止 未完 循环工作部分
循环工作部分
循环修改部分
终 止
基本结构形式
工作部分放在循环控制部分之后,这样 可以允许循环次数为零的循环程序或不 需要循环时不进入循环工作部分。
调用 CALL 过程名 (子程序地址) 功能: (1)下条指令的地址压入堆栈。 对于段内调用只将IP的值压入堆栈 对于段间调用先将CS的值压入堆栈,再将IP的值压入堆栈。 (2)子程序的地址送入CS:IP从而转入子程序运行。 返回指令 RET 子程序的最后一条指令,用于返回CALL指令的下条指令继续执行。 无论对那一种调用方式其返回指令都相同。 功能: (1) 对于段内调用只将当前[SP]弹进IP,从而使程序正常返回。 (2)对于段间调用则先弹IP,再弹CS。
条件转移指令 转移跳过的地址
XXXX
Part2 XXX Part3
下一条执行指令
程序转移指令—无条件转移
1、JMP 指令 格式:JMP dest 功能:无条件转移到操作数(dest)所指示的地址,不影响标志。 •段内转移: •直接转移 : JMP START
NERA 标号 16位立即数
(IP)←START
4.2 汇编语言程序设计
AX,3578H CL,0 AX,AX ;当AX=0时OR操作为0 EXIT ;AX=0结束 AX,1 ;算术左移最高位进CF L ;无进位转移到L CL L 21H
起 始 AX=3578H,CL=0 Y N 左移AX 1位 N 终 止
AX=0?
CF=1?
Y CL=CL+1
DEBUG演示
循环程序设计
计数循环的控制方法 :当循环次数已知时常用该方法。 减1循环 L: 循环指令LOOP 短标号 CX,N
MOV …… DEC JNZ
CX,N
CX L L:
MOV ……
LOOP L
加1循环 L: MOV …… INC JNZ CX,-N CX L
循环程序设计
循环程序举例:
例如,统计AX中1 的个数 MOV MOV L: OR JZ SAL JNC INC JMP EXIT:INT
子程序设计
一般是有公用性、重复性或有相对独立性的程序应设计成子程序
子程序结构:
过程名 NAME PROC PUSH PUSH …… …… 程序部分 …… POP POP RET NAME ENDP 过程类型 NEAR (FAR) AX BX 现场保护 BX AX 必须RET结束
子程序设计
调用与返回:
子程序设计 子程序的设计与应用应注意的问题
(1)现场的保护 PUSH AX PUSH BX PUSH SI ………… ………… POP SI POP BX POP AX RET
(2)参数的传递 主调用子程序必须传递入口参数, 子程序返回必须传递出口参数。 常用的方法有: 寄存器——适用于参数少的情况。 约定单元——适用于参数多的情况。要事先建立参数数据缓冲区。 堆栈——适用于参数较多,且子程序嵌套,递归调用的情况。
3.2程序设计的基本结构
• 顺序程序设计
• 分支程序设计
• 循环程序设计
• 顺序程序设计 • P85例3.6
•分支结构程序
3.1 汇编语言程序设计
分支程序是利用条件转移指令,使程序执行 到某一指令后,根据运算状态标志条件是否 满足,来改变程序执行的次序。分支程序的 结构如图所示。
Y
条件
N
程序段1
Part1 JMP1234H
CS:0100H 跳过1134H CS:1234H
例如: JMP 1234H 指令跳转到 CS:1234H执行。
Part2
1234H XXX Part3
程序转移指令—无条件转移
•段内转移: •间接转移 :JMP DEST——DEST为 16寄存器或内存操作数 •执行操作:(IP)←DEST
循环程序设计
循环程序举例:
例2、BUF中有N个有符号数,分离其中的正负数,分别送入BUF1和BUF2中。 这是一个循环次数已知的程序设计,用计数循环完成。 DATA SEGMENT BUF DB 12H, 34H, -56H, -98H, 096H, 68H, 56H, 80H N=$-BUF BUF1 DB N DUP(0) INC BX BUF2 DB N DUP(?) JMP CC DATA ENDS BB: MOV [DI],AL CODE SEGMENT INC DI ASSUME CS:CODE,DS:DATA START:MOV DX,DATA CC: DEC CX MOV DS,AX JNZ AA LEA SI,BUF MOV AH,4CH LEA DI,BUF1 INT 21H LEA BX,BUF2 MOV CX,N CODE ENDS AA: MOV AL,[SI] END START INC SI CMP AL,0 (1)若DW定义BUF怎样修改? JGE BB (2)能改为条件控制循环吗? MOV [BX],AL 汇编连接演示X42
程序段2
二、分支程序设计
Part1
无条件转移:
转移发生不需要状态信息, 执行到JMP处则发生转移。
JMP AA
Part2 AA XXXX Part3
无条件转移指令 转移跳过的地址 下一条执行指令
条件转移:
当条件满足ቤተ መጻሕፍቲ ባይዱ发生转移, 否则顺序执行下一条指 令。
条件 成立? Yes No AA Part1 JCC AA
汇编连接X43
循环程序设计
重复执行某一段程序的程序结构称为循环程序。用来处理带重复性 的问题。
循环程序由五部分组成:
初始化部分——为程序操作、地址指针、循环计数、结束 条件等设置初始值。
循 环 体 循环工作部分——循环程序主体,完成基本操作。 循环修改部分——修改循环工作部分的变量地址等, 为重复操作作准备。 循环控制部分——修改计数器或判断循环结束条件, 决定是否终止循环。 循环结束部分——循环终止后,对循环结果的处理部分。