790 likes | 914 Views
本次课程内容及目标. 教学内容: 汇编语言程序设计(顺序程序) 教学目标: 建立顺序程序的概念,能够编制简单顺序程序。 作业:. 汇编语言程序设计. 汇编语言程序可分为以下四种基本结构: 顺序程序、 转移程序、 循环程序、 过程 。. 顺序程序.
E N D
本次课程内容及目标 • 教学内容: • 汇编语言程序设计(顺序程序) • 教学目标: • 建立顺序程序的概念,能够编制简单顺序程序。 • 作业:
汇编语言程序设计 • 汇编语言程序可分为以下四种基本结构: • 顺序程序、 • 转移程序、 • 循环程序、 • 过程 。
顺序程序 • 顺序程序的主要特点:在执行过程中,始终遵守人们在源程序中所排定的指令顺序,一条接一条的执行,中间无转移、无循环、无过程调用。
读懂例5.2中的程序(P137)。 • ①初始化堆栈段状态: SP,SS。 • ②初始化数据段状态:用MEMORY 1窗口观察数据段中的数据存储状态。 • ③用CodeView的单步功能分析各条指令的功能。
(10X+4Y)/2 • .MODEL SMALL • .STACK 40H • .DATA • X BYTE 66H • Y BYTE 35H • Z WORD ? • .CODE • START: MOV AX,@data • MOV DS,AX • XOR AX,AX ;把AX清除为0
MOV AL,X ;X→AL • SHL AX,1 ;2X • MOV BX,AX ;(AX)→BX,存2X • SHL AX,1 ;4X • SHL AX,1 ;8X • ADD BX,AX ;2X+8X • MOV AH,0 ;清除AH • MOV AL,Y ;Y→AL • SHL AX,1 ;2Y • SHL AX,1 ;4Y • ADD BX,AX ;10X+4Y • SHR BX,1 ;(10X+4Y)/2 • MOV Z,BX • .EXIT • END START
分支程序 • 教学内容: • 汇编语言程序设计(分支程序) • 教学目标: • 建立分支程序的概念,能够读懂分支程序。 • 教学过程: • 先简介例5.3,然后讲概念,最后再分析例5.3。
分支程序 • 分支程序的主要特点: • 在运算类指令之后,跟一条或几条转移指令JXX。 • 用转移指令JXX对运算指令建立的标志进行测试,如果条件满足,程序就跳转到转移目标处执行;如果条件不满足,程序就顺序执行。最终实现了逻辑判断的功能。
1. 转移类指令 • 转移类指令共有21条,用JXX的形式统一表示,在汇编语言中的引用格式为: • JXX 转移目标(用标号表示) • 条件转移指令中的“条件”一词的含义: • 此处所说的条件就是CPU标志寄存器中的5个状态标志位:CF、PF、ZF、SF、OF。 • 条件转移指令如下表。
种类 条件转移指令 判 断 条 件 操 作 简 单 条 件 转 移 指 令 JO (OF)= 1 溢出转移 JNO (OF)= 0 无溢出转移 JS (SF)= 1 结果为负转移 JNS (SF)= 0 结果为正转移 JZ/JE (ZF)= 1 结果为零转移 JNZ/JNE (ZF)= 0 结果非零转移 JP/JPE (PF)= 1 为偶转移 JNP/JPO (PF)= 0 为奇转移 JC (CF)= 1 结果有进位转移 JNC (CF)= 0 结果无进位转移
种类 无符号数条件转移指令 JA/JNBE (CF)= 0 且(ZF)= 0 大于转移 条件转移指令 判断条件 操作 JAE/JNB/JNC (CF)= 0 大于或等于转移 JB/JNAE/JC (CF)= 1 小于转移 JBE/JNA (CF)= 1 或(ZF)= 1 小于或等于转移 带符号数条件转移指令 JG/JNLE (SF) =(OF)且 (ZF) = 0 大于转移 JGE/JNL (SF) =(OF) 大于或等于转移 JL/JNGE (SF) ≠ (OF) 小于转移 JLE/JNG (SF) ≠ (OF)或(ZF)= 1 小于或等于转移 特殊条件转移指令 JCXZ (CX)= 0 (CX)= 0转移 JECXZ (ECX)= 0 (ECX)= 0转移
第一组是只对一个状态标志进行测试的转移指令;第一组是只对一个状态标志进行测试的转移指令; • 第二组是无符号数条件转移指令,特点是该组条件转移指令排在源程序中无符号数减法操作指令之后,因此是根据无符号数的比较结果决定是否转移;大于用above,小于用below。
第三组是带符号数条件转移指令,特点是该组条件转移指令排在源程序中带符号数减法操作指令之后,因此是根据带符号数的比较结果决定是否转移。大于用greater than,小于用less than。 • 第四组中的两条条件转移指令是一种特殊情况,JCXZ/JECXZ指令不测试EFLAGS/FLAGS中的任何状态标志,JCXZ指令测试CX寄存器的内容,JECXZ指令测试ECX寄存器的内容。
条件转移类指令转移的范围因CPU工作模式和存储器模型而异。 • 如果选择了8086 CPU时, • 则转移范围是-128~+127; • 选择IA-32 Intel系列CPU实地址模式时, • 则转移范围是-32768 ~ +32767; • 选择IA-32 Intel系列CPU在保护模式(flat 模型)时,则转移范围是±2GB。
2. 分支程序的实现 • 按功能的不同, • 分支程序可分为三种结构, • 如图5.1、图5.2、图5.3所示。
读懂例5.3中的程序。 ①初始化堆栈段状态: SP,SS。 ②初始化数据段状态:用MEMORY 1窗口观察数据段中的数据存储状态。 ③用CodeView的单步功能分析各条指令的功能。 ④由学生加注释。
例5.3 • .MODEL SMALL • .STACK 40H • .DATA • DATA2 BYTE 36H,0A8H • MAX BYTE ? • .CODE • START:MOV AX,@data • MOV DS,AX • LEA BX,DATA2 • MOV AL,[BX] • CMP AL,[BX+1] • JA NEXT • MOV AL,[BX+1] • NEXT: MOV MAX,AL • .EXIT • END START
循环程序 教学内容: 汇编语言程序设计(循环程序) 实践教学: sam5-6.asm(P146) sam5-7.asm(P147) 教学目标: 建立循环程序的概念,能够应用循环 程序机构。
教学过程: 1.运行sam5-8.asm,看到(INDEX)=2。理解循环程序的原理。 2.讲循环的概念。 3.指导学生运行sam5-9.asm,验证例5.9中的注释。 4.总结构成循环程序的两种方法:如果循环次数是已知的,使用LOOP指令是合适的。如果不知道循环次数,只知道循环结束的条件,使用条件转移类指令JXX是合适的。 5. 用LOOPD指令构成的循环程序的实例。 6. CF:b0,ZF:b6,SF:b7,OF:b11
循环程序 • 循环程序特点: • 多次重复执行同一段指令代码。 • 1. 循环控制类指令 • 循环控制类指令有三种: • LOOP,LOOPE,LOOPNE • 计数器可用CX或ECX。
(1)LOOP指令 • 格式:LOOP Label • 功能:选择8086CPU时, • CX←(CX)-1,若(CX)≠0,则转移到标号地址; • 若(CX)=0,则执行下一条指令。 • 选择IA-32CPU时, • 实地址模式下:LOOP指令仍使用CX作计数器; • LOOPD指令使用ECX作计数器。 • 保护模式下: LOOP指令仍使用CX作计数器; • LOOPW指令使用ECX作计数器。
(2)LOOPE、LOOPNE指令 • LOOPE(LOOPZ)、LOOPNE(LOOPNZ)除使用CX作为循环次数计数器外,还测试ZF的状态。 • LOOPE Label • ;CX←(CX)-1若(CX)≠0且(ZF)= 1,继续循环; • 若(CX)=0或(ZF)=0,跳出循环。 • LOOPNE Label • ;CX←(CX)-1若(CX)≠0且(ZF)=0,继续循环; • 若(CX)=0或(ZF)=1,跳出循环。
若选择了IA-32CPU: • 在实地址模式下, • LOOP使用CX, • LOOPED/LOOPNED使用ECX; • 在保护模式下, • LOOP使用CX, • LOOPEW/LOOPNEW使用ECX。
2. 循环程序的实现 • 循环程序一般可由三部分组成: • 初始化部分: • 因循环程序的功能不同而不同,但一般是为循环控制条件设初值,为计数器设初值,为地址指针寄存器置初值等。 • 循环体部分: • 一是要求循环应完成的功能;二是更新循环控制条件,如对计数器进行增量/减量操作。 • 判断部分: • 若满足循环控制条件,则循环,否则结束循环,执行循环的后继指令。
循环程序可以实现DO-WHILE结构, • 如图5.4, • 特点是:先判断,后执行循环体; • 循环程序也可以实现DO-UNTIL结构, • 如图5.5, • 特点是:先执行循环体,后判断。
例:将BLKS为首址的N个字节数传送至BLKD为首址的存储区,且假设这两个存储区不重叠。例:将BLKS为首址的N个字节数传送至BLKD为首址的存储区,且假设这两个存储区不重叠。 • 程序流程图如下:
开始 CX←N 置循环初值部分 SI←BLKS DI←BLKD [DI] ←[SI] 循环工作 部分 SI←SI+1 DI←DI+1 CX←CX-1 循环控制 部分 Y CX≠0 N 结束 程序流程图
.MODEL SMALL .DATA BLKS DB 5 DUP(9) DB 5 DUP(11) N EQU 10 BLKD DB 10 DUP(?) .STACK 40H .CODE START:MOV AX,@data MOV DS,AX MOV CX,N MOV SI,OFFSET BLKS MOV DI,OFFSET BLKD ;置循环初值部分
MOVE: MOV AL,[SI] MOV [DI],AL INC SI INC DI ;循环工作部分 DEC CX JNZ MOVE ;循环控制部分 .EXIT END START
以上程序通过指令 • DEC CX JNZ MOVE 实现循环控制。 • 而LOOP指令就包括了这两条指令的功能。 • 所以上程序中可用LOOP MOVE指令代替这两条指令。 • 对此例题进行编辑、汇编、链接、调试,观察运行结果。
实验5.3 • 按照实验5中的实验5.3进行实验。 • 实验5.3中的程序即为例5.7,如下:
例5.7:读下列程序,利用CodeView中的单步功能分析本程序的功能,给出执行结果,并给每条指令加注释。例5.7:读下列程序,利用CodeView中的单步功能分析本程序的功能,给出执行结果,并给每条指令加注释。 ;寻找一字符串中第一个非空格字符在字符串中的相对位置(1、2、3、…n),并送INDEX单元中,如无非空格字符,把全 “1” 送INDEX单元中。
.MODEL SMALL .DATA STRING BYTE 20H,20H,41H,42H,43H,0DH INDEX BYTE ? .STACK 40H .CODE START: MOV AX,@data MOV DS,AX
MOV BX,-1 NEXT: INC BX CMP STRING[BX],0DH JZ NOSPACE CMP STRING[BX],20H JZ NEXT JNZ OK NOSPACE: MOV BL,0FFH OK: MOV INDEX,BL .EXIT END START
题目分析: • 循环结束条件为:在字符串中找到第一个既不是0DH,又不是20H的字符时,或一直到0DH都未找到非空格字符。 • BX作为空格个数计数器,其内容随循环次数的变化情况如表所示。
循环次数 (BX) (INDEX) 1 0 0 2 1 0 3 2 2 • 表 BX和INDEX内容随循环次数的变化情况
注意:按表5.7分析该程序的运行过程。 • 第一次循环的注释, • 第二次循环的注释, • 第三次循环的注释。
例5.6: 请利用CodeView中的单步功能,验证本例中给出的注释及此程序的结果。(功能:将5FA1转换为ASCII码,并放入缓冲区。) .MODEL SMALL .STACK 40H .CODE ; 第1次循环 第2次循环 START: MOV BX,5FA1H MOV CH,4 ;(CH)=4 NEXT: MOV CL,4 ;(CL)=4 (CL)=4 ROL BX,CL ;(BX)=FA15H (BX)=A15FH MOV AL,BL ;(AL)=15H (AL)=5FH
AND AL,0FH; (AL)=05H (AL)=0FH ADD AL,30H ;(AL)=35H (AL)=3FH CMP AL,3AH ; 35H<3AH 3FH>3AH JL PRINT ; 转PRINT 顺序执行 ADD AL,7H ;(AL)=46H PRINT: MOV DL,AL MOV AH,2 ;2号功能调用,输出(AL) INT 21H DEC CH ;(CH)=3 (CH)=2 JNZ NEXT ; 循环 循环 .EXIT END START
题目分析: • 每次取(BX)的高4位。 • 0~9时,加30H; A~F时加37H。 • 然后显示。重复4次即可。
作业: • 把例5.7中的JA改为JB,JA之后的部分可作适当修改,JA之前的部分不要改变。
1、调用程序与过程(子程序) • 循环程序设计技术能够解决在同一程序中连续重复执行同一个程序段的问题,但是对于非连续地重复执行同一程序段的问题则无能为力。 • 对于在不同的代码段,以及在不同的源程序中用到同一个程序段的问题也不能用循环程序设计技术来解决。
此时,为了避免重复劳动,节省程序代码所占的存储空间,往往将需要重复或经常使用的程序段编制成独立的程序 ,在需要的位置使用特定的指令调用该独立的程序。 • 这里所说的独立的程序就称为子程序,也称为过程。
2、调用指令与返回指令 • 实现上述的过程调用以及过程返回需要分别使用调用指令与返回指令。 • 分为: • 近调用(过程与调用程序在同一代码段中)、 • 远调用(过程与调用程序在不同的代码段)。 • 又分为: • 直接调用(指令中直接给出子程序的标号)、 • 间接调用(指令中间接给出子程序的标号) • 如下表所示。