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