汇编语言IBM-PC第5章.ppt

上传人:za****8 文档编号:16592762 上传时间:2020-10-17 格式:PPT 页数:39 大小:337KB
返回 下载 相关 举报
汇编语言IBM-PC第5章.ppt_第1页
第1页 / 共39页
汇编语言IBM-PC第5章.ppt_第2页
第2页 / 共39页
汇编语言IBM-PC第5章.ppt_第3页
第3页 / 共39页
点击查看更多>>
资源描述
第 4章作业 Page 156: 4.4、 4.6、 4.9、 4.13、 4.17 第 4章教学要求 1.掌握完整段定义源程序格式 2.掌握常量表达、变量定义及应用、变量和标号的属性及操作符 3.掌握基本伪指令和操作符: EQU; */; DB DW DD、? DUP; ORG $、 OFFSET SEG PTR; .MODEL .STACK .DATA .CODE END; PROC/ENDP 4.掌握汇编语言源程序的编辑、汇编、连接和调试的开发方法 第 5章 循环与分支程序设计 5.1 循环程序设计 5.2 分支程序设计 掌握基本的顺序 、 分支 、 循环设计方法 熟悉常见程序设计问题: 多精度运算 , 查表 ( 查代码 、 特定值等 ) ;数 据范围判断 ( 09、 AZ、 az) 、 字母大小写 转换;字符串传送 、 比较等操作 、 求最小最大 值 、 数据求和 、 统计字符个数 教学要求 编制汇编语言程序的步骤: (1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序 分支结构 子程序结构 程序结构: 复合结构:多种程序结构的组合 顺序结构 循环结构 第 5章: 顺序程序设计 没有分支 、 循环等转移指令的程序 , 会按 指令书写的前后顺利依次执行 , 这就是顺 序程序 顺序结构是最基本的程序结构 完全采用顺序结构编写的程序并不多见 例题 5.1: 顺序程序设计实例 采用查表法 , 实现一位 16进制数 转换为 ASCII码显示 第 5章:例 5.1: 采用查表法,实现一位 16进制数转换为 ASCII码显示 ;数据段 ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;对应 0 9的 ASCII码 db 41h,42h,43h,44h,45h,46h ;对应 A F的 ASCII码 hex db 04h,0bh ;假设两个数据 ;代码段 mov bx,offset ASCII; BX指向 ASCII码表 mov al,hex ; AL取得一位 16进制数 ;恰好就是 ASCII码表中的位移 and al,0fh ;只有低 4位是有效的 , 高 4位清 0 Xlat ;换码: ALDS :BX AL XLAT 第 5章:例 5.1: (续) mov dl,al ;入口参数: DLAL mov ah,2 ; 02号 DOS功能调用 int 21h ;显示一个 ASCII码字符 mov al,hex+1 ;转换并显示下一个数据 and al,0fh xlat mov dl,al mov ah,2 int 21h XLAT 第 5章: 5.1 循环程序设计 5.1 .1 循环程序的结构形式 5.1.2 循环程序设计方法 5.1.3 多重循环程序设计 第 5章: 5.1 .1 循环程序的结构形式 循环程序结构 是满足一定条件的情况下 , 重复执行某段程序 循环结构的程序通常有 3个部分: 循环初始部分 为开始循环准备必要的条件 , 如循环次数 、 循环体需要的数值等 循环体部分 指重复执行的程序部分 , 其中 包括对循环条件等的修改程序段 循环控制部分 判断循环条件是否成立 , 决 定是否继续循环 第 5章:循环控制 循环控制可以在进入循环之前进行 , 也可 以在循环体后进行 , 于是形成两种结构: “ 先判断 、 后循环 ” 结构 “ 先循环 、 后判断 ” 结构 循环结构程序 的设计关键是循环控制部分 循环结束的控制可以用循环次数 , 还可以 用特定条件等 , 于是又有: 计数控制循环 条件控制循环 图示 DO-WHILE 结构 DO-UNTIL 结构 控制条件 初始化 循环体 Y N 控制条件 初始化 循环体 Y N 第 5章: 5.1.2 循环程序设计方法 计数控制循环 利用 循环次数 作为控制条件 易于采用循环指令 LOOP和 JCXZ实现 初始化:将循环次数或最大循 环次数置入 CX 循环体 循环控制:用 LOOP指令对 CX减 1、 并判断是否为 0 1 .计数控制循环 第 5章:例 5.2: 用二进制显示 BL内容(参例 3.8) mov cx,8 ; CX 8( 循环次数 ) again: shl bl,1 ;左移进 CF,从高位开始显示 mov dl,0 ; MOV指令不改变 CF adc dl,30h ; DL 0 30H CF ; CF若是 0, 则 DL 0 ; CF若是 1, 则 DL 1 mov ah,2 int 21h ;显示 loop again ; CX减 1, 如果 CX未减至 0, 则循环 计数控制循环 先循环后判断 BX 1 2 3 4 例 5.3:把 BX 中的二进制数以十六进制的形式 显示在 屏幕上 mov ch, 4 rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h ; 09 ASCII 30H39H cmp al, 3ah jl printit add al, 7h ; AF ASCII 41H46H printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate 第 5章:例 5.4: 求数组元素的最大值和最小值 ;数据段 array dw 10 ;假设一个数组 , 其中头个数据 10表示元素个数 dw -3,0,20,900,587,-632,777,234,-34,-56 ;这是一个有符号字量元素组成的数组 maxay dw ? ;存放最大值 minay dw ? ;存放最小值 初始化:循环次数元素个数 1 循环体:逐个比较求最大 、 小值 循环控制:比较完所有数据 第 5章:例 5.4: 代码段 ;代码段 lea si,array mov cx,si ;取得元素个数 dec cx ;减 1后是循环次数 add si,2 mov ax,si ;取出第一个元素给 AX, AX用于暂存最大值 mov bx,ax ;取出第一个元素给 BX, BX用于暂存最小值 初始化 第 5章:例 5.4: 代码段(续) maxck: add si,2 cmp si,ax ;与下一个数据比较 jle minck mov ax,si ; AX取得更大的数据 jmp next minck: cmp si,bx jge next mov bx,si ; BX取得更小的数据 next: loop maxck ;计数循环 mov maxay,ax ;保存最大值 mov minay,bx ;保存最小值 循环体 第 5章: 2. 条件控制循环 条件控制循环需要利用特定条件判 断循环是否结束 条件控制循环用条件转移指令判断 循环条件 转移指令可以指定目的标号来改变 程序的运行顺序 , 如果目的标号指 向一个重复执行的语句体的开始或 结束 , 便构成了循环控制结构 第 5章:例 5.5:显示以 0结尾的字符串 ;数据段 string db Let us have a try !,0 ;代码段 mov bx,offset string again: mov dl,bx cmp dl,0 jz done ;为 0结束 mov ah,2 ;不为 0, 显示 int 21h inc bx ;指向下一个字符 jmp again done: 条件控制循环 先判断后循环 第 5章:例 5.6: 记录某个字存储单元数据中 1的个数 ;数据段 number dw 1110111111100100B ;代码段 mov bx,number xor dl,dl ;循环初值: DL 0 again: test bx,0ffffh ;也可以用 cmp bx,0 jz done ;全部是 0就可以退出循环 , 减少循环次数 shl bx,1 ;用指令 shr bx,1也可以 adc dl,0 ;利用 ADC指令加 CF的特点进行计数 jmp again 条件控制循环 先判断后循环 第 5章:例 5.7: 十进制显示( 0 16数值) done: cmp dl,10 ;判断 1的个数是否小于 10 jb digit ; 1的个数小于 10, 转移 push dx mov dl,1 ; 1的个数大于或等于 10 mov ah,2 ;则要先显示一个 1 int 21h pop dx sub dl,10 digit: add dl,0 ;显示个数 mov ah,2 int 21h 单分支结构 例 5.8: 将首地址为 A的字数组从小到大排序 ( 气泡算法 , 多重循环 ) 32,85,16,15, 8 序号 地址 数 比 较 遍 数 1 2 3 4 1 A 32 2 A+2 85 3 A+4 16 4 A+6 15 5 A+8 8 32 16 15 8 85 16 15 8 32 85 15 8 16 32 85 8 15 16 32 85 第 5章: 5.1.3 多重循环程序设计 mov cx, 5 ;元素个数 dec cx ;比较遍数 loop1: mov di, cx ;比较次数 mov bx, 0 loop2: mov ax, Abx ;相邻两数 cmp ax, Abx+2 ; 比较 jle continue xchg ax, Abx+2 ;交换位置 mov Abx, ax continue: add bx, 2 loop loop2 mov cx, di loop loop1 小结: 掌握循环程序设计方法 循环结构程序 的设计关键是循环控制部分 循环结束的控制可以用循环次数 , 还可以 用特定条件等 , 于是又有: 计数控制循环 条件控制循环 作业 : P193: 5.5, 5.9 第 5章: 5.2 分支程序设计 分支程序根据条件是真或假决定执行与否 判断的条件是各种指令 , 如 CMP、 TEST等 执行后形成的状态标志 转移指令 Jcc和 JMP可以实现分支控制 分支结构有 CASE 结构 IF-THEN-ELSE 结构 5.2.1 分支程序的结构形式 case 1 case 2 case n ? ? case 1 case 2 case n CASE 结构 IF-THEN-ELSE 结构 (1) 逻辑尺控制 (2) 条件控制 (3) 地址跳跃表 (值与地址有对应关系的表) 第 5章:计算 AX中有符号数的绝对值 cmp ax,0 jge nonneg ;条件满足 ( AX 0) , 转移 neg ax ;条件不满足 , 求补 nonneg: mov result,ax ;条件满足 ;不恰当的分支 cmp ax,0 jl yesneg ;条件满足 ( AX 0) , 转移 jmp nonneg yesneg: neg ax ;条件不满足 , 求补 nonneg: mov result,ax ;条件满足 编写分支程序 , 注意选择正确的条件转移指令和转移目标地址 5.1.2 分支程序设计方法 第 5章:显示 BX的 最高位 shl bx,1 ; BX最高位移入 CF标志 jc one ; CF 1, 即最高位为 1, 转移 mov dl,30h ; CF 0, 即最高位为 0: DL 30H 0 jmp two ;一定要跳过另一个分支体 one: mov dl,31h ; DL 31H 1 two: mov ah,2 int 21h ;显示 可以用 JNC替换 JC 第 5章:显示 BX的 最高位 (续) shl bx,1 ; BX最高位移入 CF标志 jnc one ; CF 0, 即最高位为 0, 转移 mov dl,31h ; CF 1, 即最高位为 1: DL 31H 1 jmp two ;一定要跳过另一个分支体 one: mov dl,30h ; DL 30H 0 two: mov ah,2 int 21h ;显示 转换为单分支结构 第 5章:显示 BX的 最高位 (另解) mov dl,0 ; DL 30H 0 shl bx,1 ; BX最高位移入 CF标志 jnc two ; CF 0, 即最高位为 0, 转移 mov dl,1 ; CF 1, 即最高位为 1: DL 31H 1 two: mov ah,2 int 21h ;显示 编写分支程序 , 需留心分支的开始和结束 第 5章:显示 BX的 最高位 (无分支) mov dl,0 shl bx,1 ; BX最高位移入 CF标志 adc dl,30h ; CF 0, DL 0 30h 0 30H 0 ; CF 1, DL 0 30h 1 31H 1 two: mov ah,2 int 21h ;显示 第 5章:大小写字母转换(参例题 3.6) ;如果 DL是一个小写字母 , 则转换为大写 cmp dl,a ;小于小写字母 a, 不需要处理 jb disp cmp dl,z ;大于小写字母 z, 也不需要处 理 ja disp sub dl,20h ;是小写字母 , 则转换为大写 disp: 转换原理 例:根据 AL 寄存器中哪一位为 1( 从低位到高位 ) , 把程序转移到 8 个不同的程序分支 branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8 5.1.3 跳跃表法 cmp al, 0 ;AL为逻辑尺 je continue lea bx, branch_table L: shr al, 1 ;逻辑右移 jnc add1 jmp word ptrbx ;段内间接转移 add1: add bx, type branch_table ; add bx,2 jmp L continue: routine1: routine2: ( 寄存器间接寻址 ) ( 寄存器相对寻址 ) cmp al, 0 je continue mov si, 0 L: shr al, 1 ;逻辑右移 jnc add1 jmp branch_tablesi ;段内间接转移 add1: add si, type branch_table jmp L continue: routine1: routine2: ( 基址变址寻址 ) cmp al, 0 je continue lea bx, branch_table mov si, 7 * type branch_table mov cx, 8 L: shl al, 1 ;逻辑左移 jnc sub1 jmp word ptr bxsi ;段内间接转移 sub1: sub si, type branch_table ;(si)-2 loop L continue: routine1: routine2: 第 5章:教学要求 掌握基本的顺序 、 分支 、 循环设计方法 熟悉常见程序设计问题: 多精度运算 , 查表 ( 查代码 、 特定值等 ) ;数 据范围判断 ( 09、 AZ、 az) 、 字母大小写 转换;字符串传送 、 比较等操作 、 求最小最大 值 、 数据求和 、 统计字符个数 作业 : P193: 5.1, 5.2, 5.4, 5.5, 5.9, 5.23
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!