汇编语言程序设计第5章循环和分支程序设计
汇编语言第五、六章:循环与分支程序设计
PUSH DS MOV AX,0 PUSH AX ③用户程序结束时,用RET指令
程序结束的方法
(2)使用DOS功能调用的“INT 21H”指令,实现 用户程序结束,返回DOS
方法:在程序结束前,使用如下指令 MOV AH,4CH INT 21H
注意:一般情况下,使用第2种方法结束用户程序。
3.与简化段定义有关的预定义符号
汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程 序中出现,并由汇编程序识别使用。有关的预定义符号如下:
(1)@code 由.CODE 伪指令定义的段名或段组名。 (2)@data 由.DATA 伪指令定义的段名,或 由 .DATA 、.DATA?、.CONST和 .STACK所定义的段组名。 (3)@stack 堆栈段的段名或段组名。
第一节:循环结构
初始化
循环体
修改部分 Y
控制条件 N
结束
循环的初始状态
循环的工作部分 及修改部分
计数控制循环 条件控制循环
ห้องสมุดไป่ตู้
第五章第循一环章与基分础支知程识序设计
第五章第循一环章与基分础支知程识序设计
循环程序设计
根据条件重复执行一段指令就构成了循环程序结构 。
例:将ARRAY数组中的50个数求和,并将和存入字变量S中 。
……
00110001
16. 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 (ROL DX,1) 0 0 0 0 0 0 0 1 (AND)
00000000 + 0 0 1 1 0 0 0 0 (ADD)
00110000
binbuf 30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30 返回
汇编第05章循环与分支程序设计
JMP RES NEXT1:MOV Y,-1 JMP RES NEXT2:MOV Y,1 RES:MOV AH,4CH INT 21H CODE ENDS END START
14
第五章 循环和分支结构程序设计
5.2分支结构程序设计 5.2分支结构程序设计
2、多分支结构程序设计 使用地址表,实现多路转移。 例 使用地址表,实现多路转移。根据 AL 寄存 ),把程序转 器中哪一位为 1(从低位到高位),把程序转 (从低位到高位), 个不同的程序分支。 移到 8 个不同的程序分支。
1、双分支结构程序设计 、
• 例 比较 、D2单元中的字符,相同显示 比较D1、 单元中的字符 相同显示YES,不 单元中的字符, , 同显示NO。 同显示NO。
20122012-5-21
8
DATA SEGMENT D1 DB ‘A’ D2 DB ‘B’ RES1 DB ‘YES$’ RES2 DB ‘NO $’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA : , : START:MOV AX,DATA : , MOV DS,AX , MOV AL,D1 , MOV BL,D2 , CMP AL,BL , JNE NEXT1 LEA DX,RES1 , JMP NEXT2 NEXT1:LEA DX,RES2 : , NEXT2:MOV AH,09H : , INT 21H MOV AH,4CH , INT 21H CODE ENDS END START
20122012-5-21
AD0:MOV DL,’0’ : , JMP DISP AD1:MOV DL,’1’ : , JMP DISP AD2:MOV DL,’2’ : , JMP DISP AD3:MOV DL,’3’ : , JMP DISP AD4:MOV DL,’4’ : , JMP DISP AD5:MOV DL,’5’ : , JMP DISP AD6:MOV DL,’6’ : , JMP DISP AD7:MOV DL,’7’ : , DISP:MOV AH,2 : , INT 21H MOV AH,4CH , INT 21H CODE ENDS END START
第5章 汇编语言程序
Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。
80X86汇编语言电子教案(5-循环与分支程序设计)
一汇编语言程序设计基本步骤二程序的基本结构形式顺序结构的程序执行时按语句的书写顺序依次执行转移分支和循环因此对于有先后关系的语句程序设计时其先后次序是至关重要的顺序结构一般为简单程序顺序片段会在所有程序中存在1X和位无符号数16X Y值的程序分析1如何定义数据段X Y运算结果用双字空间存储2如何实现无符号数乘法1用加法指令实现无符号数乘法23解12CSEG SEGMENT1设位无符号数写一个求表达式16X Y值的程序实现无符号数乘法1设位无符号数写一个求表达式16X Y值的程序思考是有符号数1数据段的定义是否需要改变2对于这三种指令号数乘法的实现有何不同循环是一种重复循环通常由四部分组成1初始化部分234常有两种1Do-Until由循环指令实现2由转移指令实现说明(1) 由循环指令实现循环时ECX ZF标志这时计数值调整和条件测试在循环指令中完成例如使用LOOP LOOPZ/LOOPNZ 由转移指令实现循环时通常以条件转移指令为循环控制部入口以无条件转移指令为循环体结束件控制法循环可以嵌套明确循环控制部分和调整部分防止死循环特殊循环结构在循环体内条件判断出口能有多个出口循环控制部分控制循环何时结束1循环次数已知例LOOP2循环次数已知但可能提前结束例LOOPZ/LOOPNZ3循环次数不定据具体情况而定合理选择循环控制条件是循环程序设计的关键题意屏幕显示如下2把制的形式显示在屏幕上2把制的形式显示在屏幕上分析位十六进制数码因此BX位之后加上一个数一个十六进制数码对应字母的码值算法的基本思想ASCII A~F2把制的形式显示在屏幕上程序主体rotate: 完成什么功能;0-9ASCII 30H-39H作用 ;A-F ASCII 41H-46H作用3 53将正数数组的正确位置数据段部分3 5353535算法的基本思想ARRAY_HEAD-2-1K NN循环次数已知但可能提前结束代码段部分1数组中元素与插入值的比较指令在何处2控制循环结束的指令在哪里3边界条件如何体现功能3将正数数组的正确位置4试编制一程序从键盘输入一行字符要求第一个键入的字符必须是空格如不是则退出是则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中空格符不存入直到接收到第二个空格符时退出程序题意C空格是第一个字符是空格符是空格符代码段部分LEA BXMOV FLAG0NEXT MOV AH01HINT21HFLAG01HFOLLOWALEXITFLAG1 FOLLOWCMP ALEXIT[BX]EXIT 1判定第一个接收字符的指令语句在哪里2循环结束条件是什么循环结构思路采用冒泡排序算法使用双重循环内层循环每次比较相邻的两个数据次序不对则交换外层循环控制内层循环次数以及负责内层循环的初始化5将首地址为字的数组从大到小实现排序多重循环21循环可以嵌套多重循环的设计方法同单重循环但应分别考虑各重循环控制条件数据段部分代码段部分CX 内层循环计数器也CX 该程序如何解决它们冲突的循环结束条件是否可以更改作业P175。
汇编语言的程序设计方法(循环结构和分支结构)
汇编语言的程序设计方法(循环结构和分支结构)汇编语言中常见的形式有:顺序程序设计,分支程序设计,循环程序设计以及子程序设计今天通过实例来详细说明分支程序设计,和循环程序设计1.分支程序设计根据不同的条件做出不同的处理,把不同的方法编织成各自的处理程序段,运行时由机器根据不同的条件自动做出选择判断。
绕过某些指令,仅执行相应的处理程序段。
按这种方法处理成为分支结构。
分支程序是机器利用改变标志位的指令和转移指令来实现的。
分支程序设计实例给定以下符号函数:给定X值,假设为-25,且存放于X单元,函数值Y存放于Y于单元,根据给定的X值确定Y得值程序如下DATAX SEGMENTx DB-25y DB?DATAX ENDSCODEX SEGMENTMAIN PROC FARASSUME CS:CODEX, DS:DATAXSTART:PUSH DSMOV AX,0PUSH AXMOVAX,DATAXMOVDS,AXMOVAL,xCMPAL,0JGE LOOP1MOVAL,OFFHMOVy,ALRETLOOP1:JELOOP2MOVAL,1MOVY,ALRETLOOP2:MOVAL,0MOVy,ALRETMAIN ENDPCODEX ENDSENDSTART2.循环程序设计(1)计数控制循环(限于循环次数已知) 该方法简单直观易于程序设计(2)用条件控制循环无法确定循环次数的时候用该方法下面通过实例讲解DATASSEGMENTnDW?sumDW?DATASENDSCODES SEGMENTMAINPROCFARASSUMECS:CODES,DS:DATAS START:PUSHDSMOVAX,0PUSHAXMOVAX,DATASMOVDS,AXMOVAX,0MOVBX,0MOVCX,0LOOPT: INC BXADDAX,BXINCCXCMP AX.1000JBELOORTMOVn,CXMOVsum,AXRETMAIN ENDPCODESENDSENDSTART问渠哪得清如许?为有源头活水来!持续不断地输入,才会厚积薄发!有遗漏的地方大家指正。
汇编-循环与分支程序设计
方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;
汇编语言分支与循环程序设计
5.3.1 单重循环程序设计
例5.11 设数组X、Y中分别存有10个双字型 设数组X 中分别存有10 10个双字型 数据。试实现以下计算并把结果存入Z单元。 数据。试实现以下 Z2=X2+Y2 Z3=X3-Y3 Z4=X4Z5=X5Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7Z8=X8Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10
用逻辑尺控制循环
5.3.2 多重循环程序设计
有些比较复杂的问题使用一重循环可能无 法解决,此时就需要设计多重循环程序。 法解决,此时就需要设计多重循环程序。在多 重循环的程序中, 重循环的程序中,内层循环嵌套于外层循环中 循环的嵌套层次没有限制。 ,循环的嵌套层次没有限制。各层循环都有各 自的循环次数、循环体、循环结束条件, 自的循环次数、循环体、循环结束条件,相互 之间不能干扰、交叉。 之间不能干扰、交叉。 例5.13 把数组中的n个元素按从小到大的 顺序排列。 见课本) 顺序排列。 (见课本)
5.2 分支程序设计 IF_THEN_ELSE结构分支程序设计 5.2.1 IF_THEN_ELSE结构分支程序设计
对于具有下页图( 对于具有下页图(a)结构的程序,当条件 结构的程序, 满足时跳过指令序列实现转移, 满足时跳过指令序列实现转移,条件不满足时 继续向下执行指令序列1 继续向下执行指令序列1。 对于具有下页图( 结构的程序, 对于具有下页图(b)结构的程序,当条件 满足时转去执行指令序列2 满足时转去执行指令序列2,条件不满足时继 续向下执行指令序列1 无论执行哪个分支, 续向下执行指令序列1,无论执行哪个分支, 最终都会到同一个出口。 最终都会到同一个出口。
第5章 分支与循环程序设计
汇编源程序 第5章 分支与循环程序设计
分支与循环程序设计
2.JNA指令──无符号数小于或等于跳转(Jump if Not Above) 【指令格式】JNA 标号 【功能】如果ZF为1,或者CF为1,则转到标号处继续 执行,否则按正常顺序执行下一条指令。 用“CMP d1,d2”指令设置标志位之后,ZF为1表示d1 =d2 ,而CF为1表示把两个数作无符号数看待时,两数相 减最高位向前有借位,所以可判定d1<d2 。这是两个条件 的“或”关系,只要其中一个满足已可判定d1≤d2。 与JNA指令完全等同的写法是JBE(Jump if Below or Equal)。
分支与循环程序设计
条件跳转指令是高级语言中IF语句的最终实现方法, 指令的数量繁多,同一种跳转条件的指令又可以有多种写 法,记忆起来比较困难。不妨仔细分析一下指令助记符, 可以看出绝大多数都是由7个英文单词的首写字母拼接在一 起构成的,分别是Jump、Equal、Not、Above、Below、 Great和Less。表 4.2把所有跳转指令进行了汇总。所有的 跳转指令都不影响标志位的值。
分支与循环程序设计
6.JNS指令(Jump if SF Not Set)
【指令格式】JNS 标号 【功能】如果SF标志位的值是0,则转到标号所在处继 续执行,否则按正常顺序执行下一条指令。 7.JO指令(Jump if OF Set) 【指令格式】JO 标号 【功能】如果OF标志位的值是1,则转到标号所在处继 续执行,否则按正常顺序执行下一条指令。 8.JNO指令(Jump if OF Not Set) 【指令格式】JNO 标号 【功能】如果OF标志位的值是0,则转到标号所在处 继续执行,否则按正常顺序执行下一条指令。
分支与循环程序设计
2.JGE指令──带符号数大于或等于跳转(Jump if Great or Equal) 【指令格式】JGE 标号 【功能】如果SF与OF值相同,则转到标号处继续执 行,否则按正常顺序执行下一条指令。 参考JG指令的分析,当SF=OF=1时可知d1>d2,而 SF=OF=0时可判定d1≥d2。 与JGE指令完全等同的写法是JNL(Jump if Not Less)。
总汇编语言循环分支程序设计
总汇编语言循环分支程序设计简介总汇编语言是一种低级语言,用于编写计算机的机器指令。
循环和分支结构是编写程序时经常使用的控制结构。
本文将介绍总汇编语言中循环和分支结构的设计和实现,并给出一些示例代码来帮助读者更好地理解。
循环结构循环结构允许我们重复执行一段代码,直到满足特定条件为止。
在总汇编语言中,有两种常用的循环结构:计数器控制循环和条件控制循环。
计数器控制循环计数器控制循环中,我们使用一个计数器来确定循环执行的次数。
下面是一个示例代码片段,展示了如何使用计数器控制循环:MOV CX, 5 ; 设置循环次数为5L1:; 循环体代码; ...LOOP L1 ; 循环次数减1,如果不为0,则跳转到标签L1继续循环在上面的代码中,我们使用MOV指令将值5赋给CX寄存器,作为循环次数。
然后,我们使用LOOP指令在每次循环结束后将CX寄存器的值减1,并检查其是否为0。
如果不为0,则跳转到标签L1处,继续执行循环体代码。
条件控制循环条件控制循环中,我们使用一个条件来确定循环是否继续执行。
总汇编语言提供了多个指令来实现条件判断,例如CMP、JMP、JE等。
以下是一个示例代码片段,展示了如何使用条件控制循环:MOV CX, 10 ; 设置循环次数L1:; 循环体代码; ...DEC CX ; 循环次数减1CMP CX, 0 ; 比较循环次数与0JNE L1 ; 如果循环次数不为0,则跳转到标签L1继续循环在上面的代码中,我们使用MOV指令将值10赋给CX寄存器,作为循环次数。
然后,在每次循环结束后,我们使用DEC指令将CX寄存器的值减1,并使用CMP指令与0进行比较。
如果循环次数不为0,则使用JNE指令跳转到标签L1处,继续执行循环体代码。
分支结构分支结构允许我们在特定条件下选择不同的执行路径。
在总汇编语言中,我们可以使用条件判断指令(如CMP、JMP、JE等)来实现分支结构。
单一条件分支单一条件分支结构中,根据特定条件的真假选择不同的执行路径。
第5章循环与分支程序设计
编程方法-举例2
Data segment mess db 'Your Hex number is:$' bb db 00110100b, 00010010b Data ends Prognam segment assume cs: prognam, ds:data start: mov ax, data mov ds,ax lea dx, mess mov ah,9 int 21h
例5.7
• 有一个首地址为A的N字数组,请编制程 序使该数组中的数按照从大到小的次序 整序。
采用起泡排序算法 方法: 从第一个数开始依次对相邻两个数进行比 较。如次序对,则不做任何操作;如次序不 对,则将这两个数交换位置。
数据段
datarea segment n equ 12 ;此处修改 a dw n dup (?) datarea ends • 程序:例5.7
mov di, offset len ;此处修改} mov start_addr,di ;首地址存放在内存中 mov cx, es:[di] ;根据首地址取元素个数N mov save_cnt, cx ;个数N保存在内存 init: mov bx, 1 ;初始化设置 ;设BX = 1(即假设未作过交换数据) dec save_cnt ;做 count-l 次比较 jz sorted ;如save_cnt=O,退出 mov cx,save_cnt ;否则 比较次数放cx mov di,start_addr ;将开始地址放 DI
续 mov cx, es:[di] ;取长度
add di, 2 Repne scasw je delete Pop di jmp short exit delete: jcxz dec_cnt Next_el: ;移动 mov bx, es: [di] mov es:[di-2], bx add di, 2 loop next_el
汇编语言程序设计第五章 循环与分支程序设计
B、SF∧OF=0:JNL(≮)、JGE(≥)
C、(SF∧OF)∨ZF =1:JLE(≤)、JNG(≯)
D、(SF∧OF)∨ZF =0:JNLE(≮=)、JG(>)
20
(4)测试CX或ECX的值为0转移指令(P91)
A、(CX)=0:JCXZ
B、(ECX)=0:JECXZ
21
例5.9:在附加段中,有一个按从小到大排列的无 符号数数组,其首地址放在DI寄存器中,数组中 的第一个单元存放着数组长度。在AX中有一个无 符号数,要求在数组中查找(AX),如找到,则使 CF=0,并在SI中给出该元素在数组中的偏移地址; 如未找到,则使CF=1。
(COUNT1)
Y (COUNT1) -1
Y 结束
N
(COUNT1)=0?
14
以下为程序的实现:
Datarea n a Datarea segment EQU 20 dw n dup(?) ends ;define data segment
Prognam segment ;
;define code segment
思路: 1、因为已排序,采用折半查找法以提高查找效率。 2、先取中间元素,如果相等则查找成功;如果比中间元素 大,则再取高半部的中间元素进行比较;如果比中间元素小 ,则再取低半部的中间元素进行比较。 3、重复2过程直到查找成功或最终未找到该数为止。 4、顺序查找法平均N/2次,折半法平均比较次数为log2N
2
循环程序设计过程
框图:
次数:4
初值
取一个十六进数
显示
循 环 体
循环 控制
3
次数-1 =0?
结束
取一个十六进制数
汇编语言程序
方法三:采用同#0FH、#0F0H相与的方法分离 高低4位,将两个BCD数分开。 ORG 1000H MOV A,20H ANL A,#0FH ORL A,#30H MOV 22H,A MOV A,20H ANL A,#0F0H SWAP A ORL A,#30H MOV 21H,A;9条指令,17个字节,9个机 器周期;
第五章 汇编语言程序设计 1 程序设计方法 2 顺序程序 3 4 5 6 分支程序 循环程序 子程序 位操作程序
1、本章教学内容: (1)汇编应用概述 (2)简单程序设计 (3)分支程序 (4)循环程序 (5)查表程序 (6)子程序的设计及其调用
(7)位操作程序
2、本章基本要求 (1)掌握简单程序设计 (2)掌握分支和散转程序设计 (3)理解循环程序 (4)掌握简单查表程序 (5)掌握子程序的设计、位操作
程序
5-1-2 汇编语言程序设计步骤
一、 分析问题,建立数学模型。 二、确定算法:对待定问题求解步骤的一种描 述,是指令的有限集合,算法有五个特征: 有穷性、确定性、可行性、输入、输出 开始 三、制定程序流程图: 表示程序结构和程序功能
?
N
Y
1
四、编制源程序 1.确定数据结构:合理分配存储器单元和了 解I/O接口地址。 2.按功能设计,明确各程序之间关系。 3.用注释行说明程序。 生成一个ASCII码文件,扩展名为“.ASM”。
方法2 相对地址表PRGTBL:DB PRGi-PRGTBL 决定地址表长加分支处理程序长小于256B. 方法3:跳转表+散转指令 例 5 - 1 0 1 2 8 路 分 支 程 序 。 功 能 : 根 据 R3 的 值 (00H~7FH)转到128个目的地址。 参考程序:
JMPl28:MOV A,R3 RL A ;(A)×2 MOV DPTR,#PRGTBL ;散转表首址 JMP @A+DPTR ;散转 PRGTBL:AJMP ROUT00 AJMP ROUT01 … AJMP ROUT7F ;128个AJMP指令占 RORT00: … ROUT01 : … 注意:通过AJMP跳到各分支,限制分支程序入口 RORTi必须于对应AJMP指令在同一2KB范围。
循环与分支程序设计
标志位
CF=0且ZF=0 CF=0或ZF=1 CF=1且ZF=0 CF=1或ZF=1 SF=OF且ZF=0 SF=OF或ZF=1
JP/JPE
JNP/JPO JO JNO
PF =1
PF =0 OF =1 OF =0
JL/JNGE
JLE/JNG JCXZ
SF≠OF且ZF=0
SF≠OF或ZF=1
CX=0
实际虽然指令只有19条,但却有31个助记符 采用多个助记符,只是为了方便记忆和使用
⑴ 段内转移、直接寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址 目的地址与JMP属同一逻辑段, 只修改IP值 从一个代码段转移到另一个代码段,CS 和IP都会被修改
8
1. 无条件转移指令 —目标地址的寻址方式
直接寻址方式
用标号表达
间接寻址方式
转移地址象立即数一样,直接在指令的机器代码中,就 是直接寻址方式 用寄存器或存储
转移范围可以用一个字节表达,在段内 -128~+127范围的转移
代 码 段
10
1.无条件转移指令 —目标地址的范围:段间
段间转移——远转移(far)
从当前代码段跳转到另一个代码段,可以 在1MB范围
需要更改CS段基值和IP偏移地址
代 码 段
目标地址必须用一个32位数表达,叫做 32位远指针,它就是逻辑地址
19
判断单个标志位状态
这组指令单独判断5个状态标志之一 ⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零 (或相等) ⑵JS和JNS:利用符号标志SF,判断结果是正是负 ⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出 ⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中 “1”的个数是偶是奇
第5章分支与循环程序设计34页PPT
Z0X0+Y0 Z1X1+Y1 Z2X2-Y2 Z3X3-Y3 Z4X4-Y4 Z5X5+Y5 Z6X6+Y6 Z7X7-Y7 Z8X8+Y8 Z9X9-Y9
则再设定一个数组OP,用0和1表示加法和减法。 当计算Z的元素时,取出OP数组中的对应元素,
1.段内转移
格式:JMP SRC
功能:跳转到SRC指定的位置继续执行
SRC可以是:
程序标号
如: JMP _Done
寄存器
如: JMP EAX
内存操作数 如: JMP
[EBX]
2.段内短转移
格式:JMP SHORT SRC
JMP指令仅占2字节 SRC必须是一个程序标号 同JMP SRC相比,短转移跳转的范围较小
(6)如果R[m]大于a,则修改上界h为 m1。然后跳转到第2步。
(7)如果R[m]小于a,则修改下界l为 m+1。然后跳转到第2步。
实现折半查找的程序样例:split.asm 结果为:Index=5 Count=3 Element=680
5.2.4 有序表插入
要插入一个数到有序表中 找到插入位置 把数组的元素逐个向后移动 将这个数写到空出的位置
4.依据CX/ECX是否为0的条件转移指令
格式1:JCXZ LABELX 格式2:JECXZ LABELX 功 能 : 如 果 CX/ECX 等 于 0 , 则 转 移 到
LABELX处执行,否则顺序执行下一条指 令。
5.2 分支结构程序设计
5.2.1 5.2.2 5.2.3 5.2.4
值,还 会检查ZF。 格式:LOOPZ(LOOPNZ) 标号 功能:ECX先减1,再检查ECX和ZF标志位:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
; ’0’~’9’ ASCII 30H~39H ; ’A’~’F’ ASCII 41H~46H
例5.2
在ADDR单元中存放着数Y的地址,试编 制一程序把Y中1的个数存入COUNT单 元中。
请参看教材P.162
例 5.3
在附加段中,有一个首地址为LIST和未 经排序的字数组。
在数组的第一个字中,存放着该数组的 长度,
continue:
mov dec mov mov
cx, 5 cx di, cx bx, 0
;元素个数 ;比较遍数 ;比较次数
mov cmp jle xchg mov
ax, A[bx] ;相邻两数 ax, A[bx+2] ; 比较 continue ax, A[bx+2] ;交换位置 A[bx], ax
add loop mov loop
bx, 2 loop2 cx, di loop1
例 5.8
冒泡排序,设立一个交换标志位
请参看教材P.174
2. 分支程序设计
?
…
case 1 case 2
case n
CASE 结构
?
case 1 case 2 case n
IF-THEN-ELSE 结构
(1) 逻辑尺控制 (2) 条件控制 (3) 地址跳跃表(值与地址有对应关系的表)
;0000,0000,1101,1100
…… mov
mov sub result: mov add loop ……
bx, 0 cx, 10 dx, logic_rule ax, x[bx] dx, 1 subtract ax, y[bx] short result
ax, y[bx] z[bx], ax bx, 2 next
……
例 5.6
从键盘输入一行字符,要求第一个键入 的字符必须是空格符,如不是,则退出 程序;如是,则开始接收键入的字符并 顺序存放在首地址为BUFFER的缓存区 中(空格符不存入),直到接收到第二 个空格符时退出程序。
5.1.3 多重循环程序设计
例5.7 有一个首地址为A的N字数组,编制程 序使该数组中的数按照从大到小的次序 整序。
例: 将首地址为A的字数组从小到大排序 (气泡算法,多重循环) 32,85,16,15, 8
序号 地址
数
1A
32
2 A+2 85
3 A+4 16
4 A+6 15
5 A+8 8
比较遍数
1
2
3
4
32
16 15 8
16
15 8 15
15
8 16 16
8
32 32 32
85
85 85 85
loop1: loop2:
逻辑尺:0 0 1 1 0 1 1 1 0 0
1 减法 0 加法
x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10
y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10
z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10
logic_rule dw 00dch
初始化
初始化
控制条件 N
Y
循环体
循环体 N 控制条件
Y
请D参O看-W教HI材LEP结.1构61
DO-UNTIL 结构
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1 2 3 4
请参看教材P.162
数组的首地址已存放在DI寄存器中,AX 寄存器中存放着一个数。
要求编制一程序:在数组中查找该数, 如果找到此数,则把它从数组中删除。
请参看教材P.165
例 5.4
将正数 n 插入一个已整序的正数字数组。
将正数N插入一个已整序的字数组的正 确位置,该数组的首地址和末地址分别 为ARRAY_HEAD和ARRAY_END,其中 所有数均为正数且已按递增的次序排列。
第5章 循环与分支程序设计
循环程序设计 分支程序设计
程序结构:
顺序结构
循环结构
分支结构
子程序结构
… 复合结构:多种程序结构的组合
编制汇编语言程序的步骤:
(1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序
请参看教材P.160
1. 循环程序设计
例:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), 编程计算 z(z1,z2,……,z10)
z1 = x1 + y1 z2 = x2 + y2 z3 = x3 - y3 z4 = x4 - y4 z5 = x5 - y5 z6 = x6 + y6 z7 = x7 - y7 z8 = x8 - y8 z9 = x9 + y9 z10= x10 + y10
array_end
n
-1 3 5 15 23 37 49 52 65 78 99 105 32
例 5.5 逻辑尺例题程序实现 (167页)
设有数组X和Y。X数组中有X1,…,X10 ; Y数组中有Y1,…,Y10 。
试编制程序计算 Z1 = X1 + Y1 Z2 = X2 + Y2
……
mov rotate: mov
rol mov and add cmp jl add printit: mov mov int dec jnz ……
ch, 4 cl, 4 bx, cl al, bl al, 0fh al, 30h al, 3ah printit al, 7h dl, al ah, 2 21h ch rotate
;例5.4:将正数 n 插入一个已整序的正数字数组
x
dw
array_head dw
array_end dw
n
dw
? 3,5,15,23,37,49,52,65,78,99 105 32
…… mov mov mov compare: cmp jle mov mov sub jmp insert: mov ……
ax, n array_head-2, 0ffffh si, 0
array_end [si], ax insert bx, array_end [si] array_end [si+2], bx si, 2 short compare
array_end [si+2], ax
x
array_head