《汇编语言程序设计整》由会员分享,可在线阅读,更多相关《汇编语言程序设计整(38页珍藏版)》请在金锄头文库上搜索。
1、第4章 汇编语言程序设计,4.1 选择结构程序 4.2 循环结构程序 4.3 子符串处理 4.4 子程序 4.5 宏指令 4.6 BIOS和DOS功能调用,按照指令执行的顺序,程序的结构可以划分成以下三种。 顺序结构:程序按照它编写的顺序执行,每条指令只执行一 次,这样的程序称为“顺序结构”的程序。 循环结构:一组指令被反复地执行,这样的程序称为“循环结 构”或者“重复结构”的程序。 选择结构:根据某个条件,一部分指令被执行,另一部分指 令没有被执行,这样的程序称为“选择结构”或者 “分支结构”的程序。 一个实际运行的程序,常常是由以上三种结构的程序组合而成的,上面的三种结构称为程序的“基本结
2、构”。,4.1 选择结构程序,4.1.1 测试和转移控制指令 4.1.2 基本选择结构 4.1.3 单分支选择结构 4.1.4 复合选择结构 4.1.5 多分支选择结构,4.1.1 测试和转移控制指令,1. 无条件转移指令 2. 比较和测试指令 3. 条件转移指令,1、无条件转移指令,执行JMP指令后,程序转移到新的“目的位置”执行。 按照转移目的位置的远近,JMP指令分为近程转移和远程转移 1)近程无条件转移指令 转移的目的位置与出发点在同一个段里,这样的转移称为近程转移,把目标位置的偏移地址置入IP寄存器中 短转移、近程直接转移、近程间接转移,一般格式:,JMP 目的位置,2) 远程无条件
3、转移指令 用来实现不同段之间的转移,执行该指令时,CPU把目的段的段基址装入CS,目的位置的段内偏移地址装入IP。 远程直接转移 JMP FAR PTR 远程标号 指令中的远程标号位于另一个代码段中。执行该指令时,把该标号所在段的段基址送入CS,该标号的偏移地址送入IP。 远程间接转移 需要32位的目的地址,使用间接转移时,需要把32位目的地址事先装入用DD定义的存储单元。,FAR_TGT DD TWO ;数据定义 JMP FAR PTR TWO ;第一组,远程直接转移 LEA BX, FAR_TGT JMP DWORD PTRBX ;第二组,远程间接转移 JMP FAR_TGT ;第三组,远
4、程间接转移,2、比较和测试指令 该指令用来确定某个数据的特征,如是否小于0、是否为偶数。,(1)CMP(Compare, 比较)指令 指令格式: CMP 目的操作数,源操作数 目的操作数:8位/16位/32位的寄存器/存储器操作数。 源操作数:与目的操作数同类型的寄存器/存储器/立即数。 功能:目的操作数-源操作数,保留运算产生的标志位,不保留 运算的差。用来比较两个有符号数或无符号数的大小。,2)TEST(Test,测试)指令 指令格式: TEST 目的操作数,源操作数 目的操作数:8位/16位/32位的寄存器/存储器操作数。 源操作数:与目的操作数同类型的寄存器/存储器/立即数。 功能:T
5、EST指令将目的操作数与源操作数进行逻辑乘运算,保 留运算产生的各标志位,但是不保留逻辑乘的结果。该 指令用来测试目的操作数中某几位二进制的特征。,指令 TEST VAR, 1 执行后:,如果ZF = 0,说明变量VAR的D0位为1,该数为奇数 如果ZF = 1,说明变量VAR的D0位为0,该数为偶数,3、条件转移指令,“J”是条件转移指令操作码的第一个字母 “cc”是代表转移条件的13个字母 “label”是转移目的地的标号。,条件转移指令格式:,Jcc label,1)根据两个有符号数比较结果的条件转移指令 两个有符号数的比较结果通过OF,SF,ZF反映出来,代表转移条件的字母有G(gre
6、ater),L(less),E(equal),N(not)。,2)根据两个无符号数比较结果的条件转移指令 两个有符号数的比较结果通过CF,ZF反映出来,代表转移条件的字母有A(above),B(below),E(equal)。,3)根据单个标志位的条件转移指令 根据某一个标志位来决定程序的走向,其中一些在前面已出现,4.1.2 基本选择结构 根据不同的条件,需要进行不同的处理,在不同的程序间进行选择。,逻辑流程 源程序代码 正确的流程 错误的流程,4.1.3 分支选择结构 程序A或程序B之一为空,即没有对应的处理过程。,计算AX |AX| 的两种判断方法:,4.1.4 复合选择结构,选择结构一
7、个分支的程序中又出现了选择结构,这样的 结构称为“复合选择结构”或者“嵌套选择结构”。,4.1.5 多分支选择结构,在选择结构程序里,如果可供选择的程序块多于两个,如下图 (a)所示, (b)是汇编语言程序的实现方法。,INCLUDE YLIB.H .CODE PROMPT DB 0DH, 0AH, “Input X(-10001000): $” X DB ? OUT_MSG DB 0DH, 0AH, “Y= $” START: PUSH CS POP DS ;装载DS LEA DX,PROMPT ;输入提示信息 CALL READINT ;从键盘了输入X的值 MOV X,AX ;保存输入值,
8、例4-1 对分段函数 进行计算。,COMP: CMP X, 3 ;比较,X3 ? JG GREATER ;X3成立,转“GREATER” CMP X, -3 ;比较,X3 的程序段 OUTPUT: LEA DX, OUT_MSG ;结果的前导文字 CALL WRITEINT ;输出计算结果 CALL CRLF ;输出回车换行 EXIT: MOV AX, 4C00H INT 21H END START,例4-2计算分段函数: X的值从键盘输入,Y的值送显示器输出。,INCLUDE YLIB.H DATA SEGEMNT MESS1 DB 0DH, 0AH, Input value of X pl
9、ease : $ MESS2 DB 0DH, 0AH, Y= : $ DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX LEA DX, MESS1 CALL READINT ;输入X的值,CMP AX, -2 JGE L2 L1: SUB AX, 3 ;AXX-3 JMP DONE L2: CMP AX, 3 JG L3 MOV BX, AX ADD AX, AX ;AX2X ADD AX, AX ;AX4X ADD AX, BX ;AX5X ADD AX, 6 ;AX5X+6 JMP
10、 DONE L3: MOV AX, 2 ;AX2 DONE: LEA DX, MESS2 CALL WRITEINT ;输出Y的值 CALL CRLF MOV AX, 4C00H INT 21H CODE ENDS END START,DATA SEGMENT PROMPT DB 0DH, 0AH, “Input a number (13): $” MSG1 DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $” MSG2 DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $” MSG3 DB 0DH, 0AH, “FUNCTION 3 EXECUT
11、ED . $” DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX,例4-3 从键盘上输入数字“1”到“3”,根据输入选择对应程序 块执行。,INPUT: LEA DX, PROMPT MOV AH, 9 INT 21H ;输出提示信息 MOV AH, 1 INT 21H ;输入一个数字 CMP AL, 1 JB INPUT ;“0”或非数字,重新输入 JE F1 ;数字“1”,转F1 CMP AL, 2 JE F2 ;数字“2”,转F2 CMP AL, 3 JE F3 ;数字“3”,转
12、F3 JMP INPUT ;大于“3”,重新输入,F1: LEA DX, MSG1 ;F1程序块 JMP OUTPUT F2: LEA DX, MSG2 ;F2程序块 JMP OUTPUT F3: LEA DX, MSG3 ;F3程序块 JMP OUTPUT OUTPUT: MOV AH, 9 INT 21H MOV AX, 4C00H INT 21H CODE ENDS END START,4.2 循环结构程序,循环结构也称为“重复结构”,它使得一组指令重复地执行,可以用有限长度的程序完成大量的处理任务,几乎所有的应用程序中都离不开循环结构。 循环一般由以下4个部分组成:,(1)初始化部分:
13、为循环做准备,如累加器清零,设置地址指 针和计数器的初始值等。 (2)工作部分:实现循环的基本操作,也就是需要重复执行的 一段程序。 (3)修改部分:修改指针、计数器的值,为下一次循环做准备。 (4)控制部分:判断循环条件,结束循环或继续循环。,计数循环:循环的次数事先已经知道,用一个变量记录循环的次数。进行减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减1,计数器减为0时,循环结束。 条件循环:循环的次数事先并不确定,每次循环开始时或结 束后测试某个条件,根据这个条件是否满足来决定是否继续下一次循环。,按照循环结束的条件,有以下两类循环:,按照循环结束判断在循环中的位置,有
14、以下两种结构的循环:,WHILE循环:进入循环后,先判断循环结束条件,条件满足则退出循环,循环次数最少为0次。 DO-WHILE循环:进入循环后,先执行工作部分,然后判断循环继续的条件,条件满足则转向工作部分继续循环,循环次数最少1次。,LOOP Label ; CXCX-1,若(CX)0,转移到Label LOOPZ/LOOPE Label ; CXCX-1,若(CX)0且ZF=1,转移到Label LOOPNZ/LOOPNE Label ; CXCX-1,若(CX)0且ZF=0,转移到Label,循环指令采用相对寻址方式,Label距离循环指令的下一条指令必须在-128+127B之内。,1
15、、循环指令,2、计数循环,计数循环是基本的循环组织方式,用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。,3、条件循环,用条件控制循环具有普遍性,计数循环本质上是条件循环的一种。,4、多重循环,若一个循环的循环体内包含了另一个循环,称为多重循环,各层循环可以是计数循环也可以是条件循环。,例4.4 字符串STRING以代码0结束,求这个字符的长度(字符个数),DATA SEGMENT STRING DB “A string for testing . ”, 0 LENTH DW ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA S
16、TART:MOV AX, DATA MOV DS, AX LEA SI, STRING ;装载字符串指针 MOV CX, 0 ;设置计数器初值 TST: CMP BYTE PTR SI, 0 ;比较 JE DONE ;字符串结束,转向DONE INC CX ;计数 INC SI ;修改指针 JMP TST ;转向TST,继续循环 DONE: MOV LENTH, CX ;保存结果 MOV AX, 4C00H INT 21H CODE ENDS END START,例4.5 一个有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均值。,DATA SEGEMNT LIST DW -56, +12, 88, -126, -5, 16, 32, -99, 72,