第四章汇编语言程序设计的基本方法 顺序、分支、循环程序和子程分析问题 序的设计是汇编语言程序设计的基 本内容。 寻找解决问题的 思路、方法、算法 在此基础上还要掌握汇编语言 程序设计的基本方法和技巧,包 描述算法 括递归子程序设计、COM和EXE 格式程序的结构和特点、多模块 编写程序实现算法 程序设计方法等 设计测试数据 和预期计算结果 程序设计的解题基本步骤如下: 上机调试程序
分析问题 寻找解决问题的 思路、方法、算法 描述算法 编写程序实现算法 设计测试数据 和预期计算结果 上机调试程序 第四章 汇编语言程序设计的基本方法 程序设计的解题基本步骤如下: 顺序、分支、循环程序和子程 序的设计是汇编语言程序设计的基 本内容。 在此基础上还要掌握汇编语言 程序设计的基本方法和技巧 ,包 括递归子程序设计、COM和EXE 格式程序的结构和特点、多模块 程序设计方法等
41程序的几种基本结构 程序的基本结构有三种:顺序结构、分支结构、循环结构 顺序结构:按语句的书写顺序依次执行 分支结构:根据不同的条件判断结果,执行不同的程序段, 实现程序分支。 <判定条件 成立 不成立 条件成立 程序段1 程序段2 程序段14程序段2 程序段n 图41·两路分支结构 图42多路分支结构
4.1 程序的几种基本结构 程序的基本结构有三种:顺序结构、分支结构、循环结构 顺序结构:按语句的书写顺序依次执行 分支结构:根据不同的条件判断结果,执行不同的程序段, 实现程序分支
循环结构:由条件是否成立,确定是否重复执行某段程序。 <条件成立? 不成立 程序段 成立 成立 程序段 条件成 不成立 (a)当型循环 (b)直到型环 42顺序程序设计 例4-1(p77)查表求2的整次幂(2",n=0,1,…,14) 分析:字节编号:0123456789 28 29 array 202 14 字编号:0 注意:地在表中(即数组aray中)的存放规律,n好是2在表中 的存放字单元的顺序号。例:(aray+2*3)=(aay+6)=23=8 ●表地址= array+2*n就是存放2的单元地址
循环结构:由条件是否成立,确定是否重复执行某段程序。 4.2 顺序程序设计 例4-1 (p 77) 查表求2的整次幂(2 n ,n=0,1,…,14) 分析: 表地址=array+2*n 就是存放2 n的单元地址 2 0 2 1 2 2 2 3 2 4 ……. 2 14 字编号: 0 1 2 3 4 14 array 字节编号: 0 1 2 3 4 5 6 7 8 9 28 29 注意:2 n在表中(即数组array中)的存放规律,n正好是2 n在表中 的存放字单元的顺序号。 例: (array+2*3)= (array+6)= 2 3 =8
43分支程序设计 程序的分支通过转移指令来实现,因此转移指令的操作 应该是能够改变程序执行顺序。△方法:修改CSP 4.3.1转移指令(不影响任何标志位) 转移指令分为两类:无条件转移指令、条件转移指令 1)无条件转移指令 指令格式:JMP标号无条件转移到标号指向的指令继续执行 无条件转移{段内转移「直接己址 段间转移间接寻址 (1)段内转移(段内直接寻址) 段内转移只需修改IP实现转移:使IP一→标号所在行的指令 即:(IP)一标号所在行指令的偏移地址 段内转移分为三种形式: o段内直接短转移格式: JMP SHORT标号 操作:(IP)←(IP)+D(8位偏移量)
4.3 分支程序设计 程序的分支通过转移指令来实现,因此转移指令的操作 应该是能够改变程序执行顺序 。 4.3.1 转移指令 转移指令分为两类:无条件转移指令、条件转移指令 1 ) 无条件转移指令 指令格式:JMP 标号 无条件转移到标号指向的指令继续执行 无条件转移 段内转移 段间转移 直接寻址 间接寻址 (不影响任何标志位 ) (1) 段内转移(段内直接寻址) 方法: 修改CS:IP 段内转移只需修改IP实现转移 : 使IP 标号所在行的指令 即: (IP)=标号所在行指令的偏移地址 段内转移分为三种形式: 段内直接短转移 格式:JMP SHORT 标号 操作:(IP)←(IP)+D(8位偏移量)
操作:(P)←(IP)+D(8位偏移量) 例 JMP SHORT NEXT NEXT: MOV AL. 4 存储器 代码段 根据JMP指令的操作 M指令汇B010 转移目的地址为: (IP)+D=0122H+30H=0152H→(IP) 30 0121H 0122H (IP) D=30H 下一条要执行的指令 MOV指令B0 0152H 段内短转移范围: 04 0153H 以MP指令为中心的-128~+127字节内 段内短转移
段内短转移 例: JMP SHORT NEXT NEXT: MOV AL, 4 MOV指令 D=3 0H (IP) B0 04 … … … 存储器 代码段 EB 30 0152H 0120H 0121H 0153H 0122H JMP指令 下一条要执行的指令 段内短转移范围: 以JMP指令为中心的-128~+127字节内 根据JMP指令的操作 转移目的地址为: (IP)+D=0122H+30H= 0152H (IP) 操作:(IP)←(IP)+D(8位偏移量)
②段内直接近转移(段内直接寻址) 格式: UMP NEAR PTR标号 操作:(P)←(IP)+D(16位偏移量)-32768~+32767字节范围 例4-3段内直接近转移举例 JMP NEAR PTR EXIT EXIT: POP AX 两种转移指令都可以写成简化形式(省略 SHORT和NEAR) JMP 标号 △汇编时如何确定标号的类型? 位移量D ≤8位段内短转移指令 >8位段内直接近转移指令 段内间接转移(段内间接寻址) 格式: JMP WORD PTR OPR操作:(IP)←(OA) OA是由OPR的寻址方式确定的寄存器或存储单元(字类型) OA存的是目的转移地址
段内直接近转移(段内直接寻址) 格式:JMP NEAR PTR 标号 操作:(IP)←(IP)+D(16位偏移量)-32768~+32767字节范围 例4-3 段内直接近转移举例 JMP NEAR PTR EXIT EXIT: POP AX 两种转移指令都可以写成简化形式(省略SHORT和NEAR): JMP 标号 汇编时如何确定标号的类型? 位移量D= 8位 段内短转移指令 > 8位 段内直接近转移指令 段内间接转移(段内间接寻址) 格式:JMP WORD PTR OPR 操作:(IP)←(OA) OA是由OPR的寻址方式确定的寄存器或存储单元(字类型), OA存的是目的转移地址
例:段内间接转移 UMP BX ;(IP)←(BX)=转移地址 JMP BXI (IP)←((BX))=转移地址 间接寻址转移指令的特点是指令中没有直接给出标号 (2)段间转移 实现段间转移时,转移目的地址由段地址和偏移地址构 成,因此段间转移需要同时修改CS和IP。 o段间直接转移(段间直接寻址) 格式: UMP FAR PTR标号 操作:(P)←标号的偏移地址 (CS)←标号所在段的段地址 例45段间直接转移 CODEl SEGMENT CODE2 SEGMENT JMP FAR PTR NEW SEG/ NEW SEG: MOV AX, BX CODE2 ENDS CODEL ENDS
例 : 段内间接转移 JMP BX ;(IP)←(BX)=转移地址 间接寻址转移指令的特点是指令中没有直接给出标号 (2)段间转移 实现段间转移时,转移目的地址由段地址和偏移地址构 成,因此段间转移需要同时修改CS和IP。 段间直接转移(段间直接寻址) 格式:JMP FAR PTR 标号 操作:(IP)←标号的偏移地址 (CS)←标号所在段的段地址 例4-5 段间直接转移 CODEl SEGMENT JMP FAR PTR NEW_SEG CODEl ENDS CODE2 SEGMENT NEW_SEG: MOV AX,BX CODE2 ENDS JMP [BX] ;(IP)←((BX)) =转移地址
设 NEW SEG标号的地址为3200H:2100H CODE1 执行JMP指令后,程序流程控制 将从CODE代码段—→CODE2代码段, EA操作码 实现段间转移操作。 00 JMP指令 21 00 e段间间接转移(段间间接寻址) 32 格式: JMP DWORD PTR OPR 操作:(IP)←-(OA) 32000H CODE2 (CS)←(OA+2) OA是由OPR的寻址方式所确定 的一个双字单元地址 NEW SEG XX 34100H (OA)=转移地址的偏移地址 (OA+2)=转移地址的段地址 (段间间接转移见P80,例4-6) 段间直接转移
34100H 32000H XX XX … … … CODE2 CODE1 操作码 21 00 32 NEW_SEG 00 … EA JMP指令 IP CS 设NEW_SEG标号的地址为3200H:2100H 执行JMP指令后,程序流程控制 将从CODEl代码段 CODE2代码段, 实现段间转移操作。 段间间接转移(段间间接寻址) 段间直接转移 格式:JMP DWORD PTR OPR 操作:(IP)←(OA) (CS)←(OA+2) OA是由OPR的寻址方式所确定 的一个双字单元地址 。 (OA)=转移地址的偏移地址 (OA+2)=转移地址的段地址 (段间间接转移见P80,例4-6)
2)条件转移指令(18条) 基本格式为:J××标号 (××代表一种转移条件) 条件转移指令根据检测标志位的状态来判断条件,若条件为 真,则转至标号处执行程序,否则顺序往下执行程序 操作:(IP)←(IP)+D(8位偏移量) 显然条件转移指令转移范围与段内短转移相同 条件转移指令分三类 (1)一般条件转移指令(见P81表4-1) 用于某个检测标志位 (2)用于无符号数的条件转移指令(见P81表4-2) 用于检测无符号数的比较 (3)用于带符号数的条件转移指令(见P82表4-3) 用于检测带符号数的比较
2)条件转移指令 (18条) 基本格式为: J×× 标号 (××代表一种转移条件 ) 条件转移指令根据检测标志位的状态来判断条件,若条件为 真,则转至标号处执行程序,否则顺序往下执行程序 。 操作:(IP)←(IP)+D (8位偏移量) 显然条件转移指令转移范围与段内短转移相同 条件转移指令 分三类: (1)一般条件转移指令(见P81 表4-1) 用于某个检测标志位 (2)用于无符号数的条件转移指令(见P81 表4-2) 用于检测无符号数的比较 (3)用于带符号数的条件转移指令 (见P82 表4-3) 用于检测带符号数的比较
●先执行影响标志位的指令(如算术运算、比较及位测试等 指令),再执行适当的条件转移指令检测相应的标志位,根据 条件实现转移。 例:利用条件转移指令构成循环 MOV CX,100(循环计数) AGAIN DECCⅩ JNZ AGAIN 4.3.2分支程序设计方法 般分为两类 o条件转移指令—实现程序两路分支 ②无条件转移指令+跳转表实现程序多路分支
先执行影响标志位的指令(如算术运算、比较及位测试等 指令),再执行适当的条件转移指令检测相应的标志位,根据 条件实现转移。 例 :利用条件转移指令构成循环 MOV CX,100 (循环计数) AGAIN: DEC CX JNZ AGAIN 4.3.2 分支程序设计方法 一般分为两类: 条件转移指令——实现程序两路分支 无条件转移指令+跳转表——实现程序多路分支