- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21.03.2019
114H,128H,256H,259H,325H,14ADH, 34DEH,4D34H,5FDAH 256H ? ? ?
第 1章
汇编语言基础知识 8章
8086/
22
8.2
分支结构程序设计
LEA CMP JA LEA JE STC JMP LAB1: MOV SHL ADD CMP JB JE STC JMP LAB2: MOV MOV MOV DI,ARRAY AX,ES:[DI] LAB1 SI ,ES:[DI] EXIT EXIT1 SI,LEN1-1 SI,1 SI,DI AX,ES:[SI] LAB2 EXIT EXIT1 MOV LOW1,1 BX,LEN1 HIGH1,BX BX,DI
21.03.2019
al, 0
;AL为逻辑尺
continue bx, branch_table al, 1 ;逻辑右移 add1 word ptr[bx] ;段内间接转移 bx, type branch_table ;add bx,2 L
第 1章
汇编语言基础知识 8章
8086/
17
…… cmp je mov L: shr jnc jmp add1: add jmp continue: …… routine1: …… routine2: ……
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
9
8.2 分支结构程序设计 CODE SEGMENT ASSUME DS:DATA,CS:CODE 8.2.1 测试法分支程序设计 START: MOV AX, DATA MOV DS, AX MOV AX, X CMP AX, Y DATA SEGMENT JGE L1 X DW -0ABH MOV AX, Y Y DW 205 L1: CMP AX, Z Z DW 200 JGE EXIT MAX DW ? MOV AX, Z DATA ENDS EXIT: MOV MAX, AX MOV AH, 4CH INT 21H CODE ENDS END START
dw
dw dw
routine5
routine6 routine7
dw
21.03.2019
routine8
8086/
16
第 1章
汇编语言基础知识 8章
(寄存器间接寻址)
……
cmp je lea L: shr jnc jmp add1: add jmp continue: …… routine1: …… routine2: ……
程序段1
图8.3 例8.3流程图 21.03.2019
第 1章
汇编语言基础知识 8章
8086/
14
8.2
分支结构程序设计
8.2.2 跳跃表法
P1:…… JMP P2: …… JMP P8: …… ┆ EXIT ┆ EXIT
DATA SEGMENT TAB DW P1,P2,P3,P4,P5,P6,P7,P8 N DB 5 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX, DATA MOV DS, AX ┆ MOV AL, N DEC AL ADD AL, AL MOV BL, AL MOV BH, 0 JMP TAB[BX]
第 1章
汇编语言基础知识 8章
8086/
4
8.1
分支程序的结构形式
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
5
8.2
分支结构程序设计
分支程序设计首先要在分析实际问题的基础上确定若干个 程序分支,然后在此基础上选用条件转移指令、或者是选用间 接寻址无条件转移来转向不同的程序分支。前者是测试法分支 程序设计,后者是跳跃表法分支程序设计。
第 1章
汇编语言基础知识 8章
8086/
19
8.2
分支结构程序设计
8.2.3举例
例8.4 在附加段中,有一个按从小到大顺序排列的无符号字节数组ARRAY, 要求在数组中查找字节X,若找到则使CF=0,并在ADDR中给出该元素在数 组中的偏移地址;如未找到则使CF=1。 算法分析: 折半查找法是先取有序数组的中间元素与查找值相比较,如相等则查找 成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比 较;如查找值小于中间元素,则再取低半部的中间元素与查找值相比较; 如此重复直到查找成功或者最终未找到该数(查找不成功)为止。对于 长度为N的表格,折半查找法的平均比较次数为log2N,而顺序查找法平 均要作N/2次比较。
第 1章 汇编语言基础知识 8章 8086/
8.2.3举例
;大于最小数 ;找到,结束 ;未找到
;使SI指向最后一个元素 ;小于最大数,则转去查询
21.03.2019
(寄存器相对寻址)
al, 0 continue si, 0 al, 1 add1 branch_table[si]
;逻辑右移
;段内间接转移
si, type branch_table L
第 1章
汇编语言基础知识 8章
8086/
18
…… cmp je lea mov mov L: shl jnc jmp sub1: sub loop continue: …… routine1: …… routine2: ……
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
7
8.2
分支结构程序设计
DATA
8.2.1 测试法分支程序设计
程序清单:
SEGMENT X DB -25 RESULT DB ? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX, DATA MOV DS, AX MOV AL, X TEST AL, 80H JZ NEXT NEG AL NEXT: MOV RESULT, AL MOV AH, 4CH INT 21H CODE ENDS END START
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
13
8.2
分支结构程序设计
开 始
8.2.2 跳跃表法
查表地址=TAB+(N-1)*2
例8.3 设某程序有8 路分支,试根据给 定的N值(1~8), 将程序的执行转移 到其中的一路分支。
符合条件1
N=?
符合条件2 程序段2
┅┅
符合条件8
程序段8
┆ EXIT: MOV AH,4CH INT 21H CODE ENDS END START
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
15
跳跃表法
例:根据 AL 寄存器中哪一位为 1(从低位到高位), 把程序转移到 8 个不同的程序分支 branch_table dw dw dw dw routine1 routine2 routine3 routine4
21.03.2019
(基址变址寻址)
al, 0 continue bx, branch_table si, 7 * type branch_table cx, 8 al, 1 ;逻辑左移 sub1 word ptr [bx][si] ;段内间接转移 si, type branch_table ;(si)-2 L
8086/8088和ARM核 汇编语言程序设计
第8章
8086/8088分支程序设计
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
1
第8章 8086/8088分支程序设计
8.1 分支程序的结构形式
8.2 分支结构程序设计
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
2
教学要求
• 分支程序根据条件是真或假决定执行与否 • 判断的条件是各种指令,如CMP、TEST等 执行后形成的状态标志 • 转移指令Jcc和JMP可以实现分支控制
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
6
8.2
分支结构程序设计
8.2.1 测试法分支程序设计
分支结构是有若干个条件,每一个条件对应一 个基本操作。分支程序就是判断产生的条件,哪个 条件成立,就执行哪个条件对应操作的程序段。也 就是说,从若干分支中选择一个分支执行。 例8.1 已知在内存中有一个字节单元NUM,存有带符号 数据,要求计算出它的绝对值后,放入RESULT单元中。
第 1章 汇编语言基础知识 8章
;初始化 ;X取到AL中 ;测试AL正负 ;为正,转NEXT ;否则AL求补 ;送结果 ;返回DOS ;汇编结束
8
21.03.2019
8086/
8.2
分支结构程序设计
8.2.1 测试法分支程序设计
例8.2 试编一程序, 求三个带符号字数据 中的最大值,并将最 大值存入MAX字单元 中。设三个带符号数 分别在三个字变量X、 Y、Z中存储。
• 掌握分支程序设计方法 • 熟悉常见程序设计问题:
数据范围判断(0~9、A~Z、a~z)、 字母大小写转换、 ……;
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
3
8.1
分支程序的结构形式
分支程序结构是根据条件转向不同程序分支的结果, 有3种形式:单分支、双分支结构和多分支结构。
21.03.2019
21.03.2019
第 1章
汇编语言基础知识 8章
8086/
11
2、试分析下列程序段,程序执行后, num2字节单元的内容是什么?如果 cmp ah, 39h num1字节单元的值为39h,运行后, num2字节单元的内容又是什么?由 Jbe next 此说明程序完成了什么操作。(6分) sub ah, 7 data segment next: sub ah, 30h num1 db 41h mov num2, ah num2 db ? mov ah, 4ch data ends int 21h Code segment code ends assume cs:code, ds:data end start start: mov ax, data mov ds, ax 0AH,09H, mov ah, num1 此程序可将num1字节单元中的ascii字 符‘0’~‘9’,‘A’~‘F’转换成十六进制 数0~9,A~F