西安邮电大学微机原理与汇编语言课件

上传人:磨石 文档编号:243024917 上传时间:2024-09-14 格式:PPT 页数:92 大小:950.50KB
返回 下载 相关 举报
西安邮电大学微机原理与汇编语言课件_第1页
第1页 / 共92页
西安邮电大学微机原理与汇编语言课件_第2页
第2页 / 共92页
西安邮电大学微机原理与汇编语言课件_第3页
第3页 / 共92页
点击查看更多>>
资源描述
*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,微型计算机原理,第五章 汇编语言程序设计,单击此处编辑母版文本样式,*,西安邮电学院计算机系,系统结构教研室,2011.2,微机原理与汇编语言,教材及参考书,微型计算机原理,王忠民 王钰 王晓婕 编著,微型计算机原理,学习与实验指导 王钰 王劲松 刑高峰 编著,2024年9月14日,第,5,章 汇编语言程序设计,主要内容,:,汇编语言源程序的格式及上机过程,汇编语句源程序的编写,汇编语言程序的设计,(,一,),顺序与分支结构,汇编语言程序的设计,(,二,),循环结构与子程序,2024年9月14日,5,.1,汇编语言源程序的格式及上机过程,本节学习要求,学会在,DEBUG,调试环境下察看程序结果,学会简单汇编程序的编辑、运行过程,掌握常见的输入及显示方法,2024年9月14日,计算机语言发展过程,机器语言,汇编语言,高级语言,FORTRAN,BASIC,COBOL,PASCAL,C/C+/C#,JAVA,.,2024年9月14日,机器语言,:依赖于机器的低级语言,书写格式为二进制代码。,优点,:执行速度快,效率高。,缺点,:表达的意义不直观,编写、阅读、调试较困难。,汇编语言,:一种符号语言,与机器语言一一对应;使用助记符,优点,:,用户理解容易,缺点,:,不能被机器直接识别,高级语言,:独立于机器的通用语言,接近人类的自然语言。,优点,:易学易用,可移植性较好,缺点,:目标代码冗长,占用内存多,执行效率不高,2024年9月14日,例一,编程实现,c=a+b,,并在屏幕上显示结果,解,1,:用,C,语言实现,#include stdio.h,int main(int argc, char* argv),int a,b,c;,a=1;,b=2;,c=a+b;,printf(“c=%dn,c);,return 0;,编译后的目标文件达到,3.59KB,2024年9月14日,data segment,a db ?,b db ?,c db ?,string db c=$,data ends,code segment,main proc far,assume cs:code, ds:data,assume es:data,start:,push ds,sub ax,ax,push ax,mov ax,data,mov ds,ax,mov es,ax,mov a,1,mov b,2,mov al,a,add al,b,mov c,al,lea dx,string,mov ah,09,int 21h,add c,30h,mov dl,c,mov ah,2,int 21h,mov dl,0ah,int 21h,mov dl,0dh,int 21h,ret,main endp,code ends,end start,解,2:,用汇编语言实现,汇编后的目标文件只有,208,字节,2024年9月14日,汇编语言源程序的格式,例二,编程实现多字节加法,如,S=3B74AC60F8H+20D59E36C1H,F8H,60H,ACH,74H,3BH,C1H,36H,9EH,D5H,20H,被加数、和,加数,DATA1,DATA2, ,2024年9月14日,CODE SEGMENT,ASSUME CS,:,CODE,,,DS,:,DATA,START,:,MOV AX, DATA,MOV DS, AX,MOV CX, 5,MOV SI, 0,CLC,LOOPER,:,MOV AL, DATA2SI,ADC DATA1SI,,,AL,INC SI,DEC CX,JNZ LOOPER,MOV AH, 4CH,INT 21H,CODE ENDS,END START,DATA SEGMENT,DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH,DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H,DATA ENDS,2024年9月14日,汇编语言源程序的组织结构,汇编语言源程序采用的是分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以,SEGMENT,语句开始,以,ENDS,语句结束,整个程序的结尾是,END,语句。,在代码段中下面的内容是不可缺少的:,(1),定义段(使用,SEGMENT/ENDS,语句定义),(2),约定段寄存器和段的关系(即物理段和逻辑段的关系,使用一个或多个,ASSUME,语句实现),(3),装填段寄存器(只装填数据型段寄存器),(4),设置返回,DOS,的方法,2024年9月14日,例如:,MYDARA SEGMENT,;,定义数据段起始语句, ,;,定义数据,MYDATA ENDS,;,定义数据段终止语句,MYCODE SEGMENT,;,定义代码段起始语句,ASSUME CS:MYCODE,DS:MYDATA,;,约定段寄存器和段的关系,START:,MOV AX,MYDATA,;,装填相应的段寄存器,MOV DS,AX, ,;,完成所需功能的程序段,MOV AH,4CH,;,设置返回,DOS,INT 21H,MYCODE ENDS,;,定义代码段终止语句,END START,;,程序结束,2024年9月14日,汇编语言语句的类型和格式,1.,语句分类, 指令性语句:也称指令语句,指令系统的指令,汇编后产生目标代码。, 指示性语句:也称伪指令语句,告诉汇编程序如何汇编,汇编后不产生目标代码。, 宏指令语句:自定义语句,由指令语句和伪指令语句组成的指令集合,不展开时不产生目标代码。,2.,语句格式,汇编语言是由一条条的语句组成的,其每条语句的格式如下:,2024年9月14日,名字语句前缀助记符操作数,;,注释,其中带方括号的部分表示任选项,既可以有,也可以没有。,(1),名字,“,名字,”,是语句的符号地址,对于指令语句,,“,名字,”,称为标号,其后必须加冒号,“,:,”,;对于伪指令语句,“,名字,”,可以是变量名、段名、过程名等,其后不能加冒号,“,:,”,。,“,名字,”,一般都有三个属性:段属性、偏移属性和类型属性。, 段属性:表示,“,名字,”,所在段的起始地址(即段地址)。,2024年9月14日,偏移属性:表示,“,名字,”,所在段的起始地址到定义该,“,名字,”,的地址之间的字节数(即偏移量)。偏移量是一个,16,位无符号数。, 类型属性:表示该名字的数据或地址的类型。,对于标号和过程名,类型属性有,NEAR,和,FAR,两种,表示只能在段内被引用还是可以在其它段被引用;,对于变量类型属性有,BYTE(,字节,),、,WORD(,字,),、,DWORD(,双字,),、,QWORD(,四字,),、,TBYTE(,十字节,),等,表示数据区中存取操作对象的大小。,对于段名只有段属性,表示段的起始地址(段地址),而没有偏移属性和类型属性。,2024年9月14日,(2),助记符,在指令语句中,表示该指令语句的操作码,在伪指令语句中称为定义符,它们指出其语句的功能。,(3),操作数,操作数即为操作的对象。在指令语句中,可能有单操作数或双操作数,也可能无操作数或隐含操作数;而在伪指令中可能有更多个操作数。当操作数不止一个时,相互之间应该用逗号隔开。,可以作为操作数的有:常数、寄存器、标号、变量和表达式等。,2024年9月14日,1),常量:是指令在中出现的哪些固定值,可以分为数值常数和字符串常数两类。,2),寄存器:,8086,8088CPU,的寄存器可以作为指令的操作数。,3),变量:是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。,4),表达式:使用运算符把常数、寄存器、标号、变量等连接起来的运算式。, 表达式分为数值表达式和地址表达式两种。, 表达式中常用的运算符有以下几种:,2024年9月14日,算术运算符:、和,MOD,(模除, 即两个整数相除后取余数)等。,逻辑运算符:,AND,、,OR,、,XOR,、,NOT,等。,关系运算符:,EQ,、,NE,、,LT,、,GT,、,LE,、,GE,等。,分析运算符:,SEG,、,OFFSET,、,TYPE,、,SIZE,、,LENGTH,等。,合成运算符:,PTR,、,THIS,、,SHORT,等。,其它运算符: :、,LOW,、,HIGH,等,(4),注释,注释是对汇编语句的功能或汇编程序的说明。,2024年9月14日,上机环境,硬件,系统软件,应用软件,操作系统:,DOS,系统,编辑器,:,EDIT.exe,汇编程序,:,MASM.exe,连接程序,:,LINK.exe,用户开发的程序:,ABC.exe,等,CPU,、存储器,(ROM,、,RAM),、,I/O,接口、输入、输出设备,汇编语言源程序的上机过程,2024年9月14日,上机过程,.EXE,文件,手写程序,.ASM,文件,.OBJ,文件,编辑程序,编辑,汇编程序,汇编,连接程序,连接,EDIT,MASM,LINK,有语法错误,无法正常连接,有算法错误,2024年9月14日,(1),编辑程序,DOS,环境下用,EDIT,编辑器,WINDOWS,环境下用,记事本,(2),汇编源程序,宏汇编程序,MASM.EXE,或小汇编程序,ASM.EXE,汇编程序主要有以下功能:, 检查源程序中语法错误,给出错误提示信息, 产生目标文件(,.OBJ,)、列表文件(,.LST,)及交叉引用文件(,.CRF,), 展开宏指令,2024年9月14日,MASM,宏汇编的提示信息及回答,交叉参考文件用的文件名,(缺省:无交叉参考文件),Cross referenceNUL.CRF,:,(,交叉参考文件名,),列表文件名,(缺省:无列表文件),Source listingNUL.LST,:,(,源列表文件名,),目标文件名,(缺省:源文件名,.OBJ,),Object Source.OBJ,:,(,目标文件名,),欲汇编的,.ASM,源文件名,(缺省:命令中的文件名),Source .ASM,:,(,源文件名,),回 答,提 示 信 息,2024年9月14日,LINK,的提示信息及回答,用到的库文件名,(缺省:无库文件),Libraries.LIB,:,(,库文件名,),建立,连接映象文件名,(缺省:无,连接映象文件,),List file NUL.MAP,:,(,连接映象文件名,),欲连接的,.OBJ,文件名,(缺省:命令中的文件名),Run file .EXE,:,(,可执行文件名,),回 答,提 示 信 息,(3),连接目标文件,通过,LINK.EXE,程序实现, 将多模块连接,产生一个,.EXE,文件, 连接库文件(,.LIB,)及产生连接映象文件(,.MAP,),2024年9月14日,(4),运行程序,当我们建立了可执行文件后,就可以直接在,DOS,下执行该程序。,程序调试,DEBUG,是一种面向汇编语言的动态调试工具,共有,19,条命令。,DEBUG,提供了可以跟踪、测试程序的环境和条件,使编辑者能够对,.EXE,和,.COM,文件的执行进行动态跟踪调试,能够较快地查找出文件的错误和检查程序的运行结果。,还可以利用,DEBUG,直接编写一段小的汇编程序,并进行调试和运行。,2024年9月14日,DEBUG,常用命令,A ,起始地址, ,汇编并保存一段指令语句,U ,起始地址, ,反汇编,T =,起始地址, ,单步执行(执行一条语句),R ,寄存器, ,显示或修改寄存器内容,D ,存储单元逻辑地址, ,显示存储单元,(,80,个字节,/,次),N ,文件名, ,定义文件,L ,装入文件,2024年9月14日,DATA SEGMENT,NUM DB 82H,68H,88H,SUM DB ?,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,START:,MOV AX,DATA,MOV DS,AX,MOV BX,OFFSET NUM,MOV AL,BX,INC BX,ADD AL,BX,INC BX,ADD AL,BX,MOV SUM,AL,MOV AH,4CH,INT 21H,CODE ENDS,END START,例:,82H,68H,88H,1,72H,2024年9月14日,5.2,汇编语言和,DOS,操作系统的接口,1.,用户程序在存储器中的位置,ROM,RAM,DOS,磁,盘,应,用,程,序,其他,系统,程序,引导程序,ROM BIOS,系统检测程序,内,存,FFFFFH,00000H,IO.SYS,COMMAND.COM,MSDOS.SYS,IO.SYS,模块,MSDOS.SYS,模块,COMMAND.COM,hello.asm,hello.obj,hello.exe,用户程序空间,hello.exe,1KB,中断向量表,EDIT.EXE,MASM.EXE,LINK.EXE,DEBUG.EXE,2024年9月14日,2.,用户程序的装入,完成以下操作:,确定内存可用部分,以便存放要执行的,.exe,文件。,建立程序段前缀,PSP,(,Program Segment Prefix,),程序段前缀大小,100H,,,即,256,个字节。,存放执行过程中的控制信息。,PSP,最开始的两个字节,CD20,,,是一条,INT 20H,指令。,装入可执行程序,.exe,SP,DS,、,ES,代码段,INT 20H,数据段,CS:IP,SS,PSP(256,字节,),用户程序,没有定义堆栈段的用户程序装入情况,SP,DS,、,ES,INT 20H,数据段,代码段,堆栈段,CS:IP,SS,用户程序,定义了堆栈段的用户程序装入情况,附加段,PSP(256,字节,),2024年9月14日,DSEG SEGMENT,STRING1 DB 1,2,3,4,5,DSEG ENDS,ESEG SEGMENT,STRING2 DB 5 DUP(?),ESEG ENDS,SSEG SEGMENT STACK STACK,DW 10 DUP(?),SSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DSEG,ASSUME ES:ESEG,SS:SSEG,START: MOV AX,DSEG,MOV DS,AX,MOV AX,ESEG,MOV ES,AX,LEA SI,STRING1,LEA DI,STRING2,MOV CX,5,CLD,REP MOVSB,MOV AH,4CH,INT 21H,CSEG ENDS,END START,2024年9月14日,3.,返回,DOS,的方法,执行用户程序后,若要返回,DOS,状态,即在屏幕上出现,DOS,提示符,等待输入新的命令,应在用户程序的最后安排完成此功能的程序段。,为了保证用户程序执行完后,能回到,DOS,,可使用如下两种方法:,(1),非标准方法:调用,INT 21H,的,4CH,功能,例如:,MOV AH,,,4CH,INT 21H,2024年9月14日,(2),标准方法:借用,PSP,首单元的,INT 20H,返回,DOS,。,这种方法较麻烦。由于执行,INT 20H,的前提是,CS:IP,必须指向,PSP,首单元,否则执行,INT 20H,反而会造成死机,因此在,EXE,文件汇编格式中,不能直接执行,INT 20H,。用下列方法可使在需返回,DOS,时,,CS:IP,指向,PSP,首单元。, 把主程序定义成一个远过程。即:,过程名,PROC FAR,RET,过程名,ENDP,2024年9月14日,在给,DS,、,ES,赋初值之前,用下列三条指令,把,PSP,首单元的逻辑地址压入堆栈,即,PUSH DS,;,PSP,段地址压栈,MOV AX,,,0,;或用,XOR AX,AX,指令,PUSH AX,;,PSP,段首单元的偏移地址,;压栈,(,偏移地址为,0000H),采取了以上措施之后,程序在返回,DOS,的时候,执行一条,RET,指令即可返回,DOS,。因为这条,RET,指令是远过程中的,RET,指令,它将从栈顶弹出四个字节,即把,PSP,首单元的逻辑地址反弹到,CS:IP,之中,于是,CPU,就自动从,PSP,首单元取出,INT 20H,,执行它返回,DOS,。,2024年9月14日,例:,DATA SEGMENT,NUM DB 82H,68H,88H,SUM DB ?,DATA ENDS,CODE SEGMENT,MAIN PROC FAR,ASSUME CS:CODE,DS:DATA,START:,PUSH DS,XOR AX,AX,PUSH AX,MOV AX,DATA,MOV DS,AX,LEA BX, NUM,MOV AL,BX,INC BX,ADD AL,BX,INC BX,ADD AL,BX,MOV SUM,AL,RET,MAIN ENDP,CODE ENDS,END START,2024年9月14日,4.,数据的输入与输出(,DOS,功能调用),微型计算机系统为汇编用户提供了两个程序接口来使用计算机的硬件资源,一个是,DOS,功能调用,另一个是,ROM,中的,BIOS(basic input/output system),功能调用。,DOS,功能调用和,BIOS,功能调用都是由一系列的服务子程序构成的,但调用与返回不是使用子程序调用指令,CALL,和返回指令,RET,,而是通过软中断指令,INT n,和中断返回指令,IRET,调用和返回的。,软中断(,INT n,指令)可分为三部分:,2024年9月14日, ROM BIOS,中断,占用类型号为,10H,1FH,。,DOS,中断,占用类型号为,20H,3FH,。目前使用的有,20H,27H,和,2FH,,其余类型号保留。, 自由中断,占用类型号为,40H,FFH,,可供系统或应用程序设置开发的中断处理程序用。,1,),DOS,中断及功能调用,目前,DOS,常用的,9,类中断,(20H,27H,和,2FH),分为两种:,DOS,专用中断:,INT 22H,、,INT 23H,和,INT 24H,,用户不能使用。,DOS,可调用中断:,INT 20H,、,INT 27H(,程序退出,),;,INT 25H,、,INT 26H(,磁盘,R,W,中断,),;,INT 2FH(,假脱机打印文件,),;,INT 21H(,系统功能调用,),。,2024年9月14日,2,),BIOS,中断调用,BIOS,中断功能依功能分为两种,一种为系统服务程序,另一种为设备驱动程序。其中中断类型号为,10H,、,16H,和,17H,的是显示器、键盘和打印机的驱动子程序。, 键盘输入子程序:,INT 16H,。, 显示输出子程序:,INT 10H,。, 打印输出子程序:,INT 17H,。,2024年9月14日,3) DOS,及,BIOS,功能调用方法,对于所有的功能调用,使用时一般需要经过以下三个步骤:, 子程序入口参数送相应寄存器。, 子程序编号,(,功能号,),送,AH,寄存器:,MOV AH,,功能号。, 发中断请求:,INT n,(系统功能调用使用,INT 21H,指令)。,2024年9月14日,功能号,功,能,入口参数,出口参数,01H,带回显的字符输入,(,单字符输入,),(AL),输入字符,02H,字符显示(单字符输出),(DL),输出字符,09H,字符串显示 (字符串输出),(DS:DX),缓冲区首地址,0AH,字符串缓冲输入,(,字符串输入,),(DS:DX),缓冲区首地址,4,)系统功能调用,系统功能调用是指,INT 21H,中断。它是可供系统程序和应用程序调用的一个极其重要的中断,内含近百个已经标准化了的系统调用子功能。它是构成操作系统内核的主要成分。,这里我们主要介绍他的几个成用的功能。如下表所示。,2024年9月14日,INT 21H,常用功能介绍,(,1,)键盘输入(,1#,功能),功能,:,键盘输入,一个,字符,将其,ASCII,码存放于,AL,,并在屏幕上显示该字符,输入字符,ASCII,码,AL,MOV AH,01H,INT 21H,(,2,)字符显示(,2#,功能),功能:在屏幕上显示任意,单个,字符,待输出字符,ASCII,码,DL,MOV DL,A,MOV AH,2,INT 21H,2024年9月14日,INT 21H,常用功能介绍,(,3,)字符串输(,10,#,功能),功能,:,键盘输入,一串字符,存至存储区,存储区起始单元地址,(,段地址,:,偏移量,),(,DS:DX,),存储区特点:,首字节为存储区最大长度,M,(,1,255,);,第二字节存放输入字符串的,实际长度,;,第三字节以后为用户输入内容(含结束标识回车的,ASCII,码,0DH,2024年9月14日,例 从键盘输入一串字符,个数小于,50,其程序设计方法是:,DATA SEGMENT,BUF DB 50,DB ?,DB 50 DUP(?),DATA ENDS,CODE SEGMENT,MOV AX,DATA,MOV DS,AX,LEA DX, BUF,MOV AH, 10,INT 21H,CODE ENDS,50,BUF,预留字节数,实际字节数,用,户,输,入,内,容,2024年9月14日,INT 21H,常用功能介绍,(,4,)字符串显示(,9 #,功能),功能:屏幕上显示,一串以,$,结尾的字符,待显示字符串首单元地址,(,DS,:,DX,),DATA SEGMENT,BUF DB,HOW DO YOU DO?,$,DATA ENDS,CODE SEGMENT,MOV DX,OFFSET BUF,MOV AH,9,INT 21H,CODE ENDS,H,O,W, ,D,O,BUF,输,出,内,容,O, ,Y,U, ,D,O,?,$,2024年9月14日,5.3,伪指令语句,宏汇编程序,MASM,提供了约几十种伪指令,其中有一些伪指令小汇编,ASM,不支持,例如宏处理伪指令等。根据伪指令的功能,大致可以分为以下几类:, 方式伪指令,.8086,。汇编程序将在,8086,8088,方式下操作。,.386,。汇编程序将在,80386,方式下操作。,2.,符号定义伪指令,EQU,(赋值伪指令),名字,EQU,表达式,2024年9月14日,(等号伪指令),名字表达式,LABEL,(类型定义伪指令),名字,LABEL,类型,3.,数据定义伪指令,数据定义伪指令的一般格式为:,变量名,伪操作符 操作数,操作数, DB,定义变量的类型为,BYTE,,给变量分配字节或字节串操作数。,DW,定义变量的类型为,WORD,,给变量分配字操作数。,2024年9月14日, DD,定义变量的类型为,DWORD,,给变量分配双字操作数。,除了常数、表达式和字符串外,问号,“,?,”,也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋与变量某个确定的初值。,当同样的操作数重复多次时,可用重复操作符,“,DUP,”,表示,其形式为:,n DUP(,初值,初值,),2024年9月14日,例,:,画图说明下列伪指令所定义的数据在内存中的存放形式。,ARV1 DB 3+4,43H,-2,ARV2 DW 474FH,1,?,COUNT EQU 2,ARV3 DB 2 DUP(1,COUNT DUP(2),ARV4 DD ARV3,ARV5 DB AB,ARV6 DW AB,解:假设此数据段的段地址为,1234H,,即,DS,1234H,,则有:,1234H:00,00,H,01,H,02,H,03,H,04,H,05,H,06,H,07,H,08,H,1234H:00,09,H,0A,H,0B,H,0C,H,0D,H,0E,H,0F,H,10,H,11,H,12,H,13,H,14,H,15,H,1234H:00,16,H,07H,43H,FEH,ARV1,4FH,47H,01H,00H,ARV2,01H,02H,02H,01H,02H,02H,ARV3,09H,00H,34H,12H,ARV4,41H,42H,ARV5,42H,41H,ARV6,ARV1,ARV2,ARV3,ARV4,ARV5,ARV6,2024年9月14日,4.,段定义伪指令,段定义伪指令的用途是在汇编语言源程序中定义逻辑段,常用的段定义伪指令有,SEGMENT,ENDS,和,ASSUME,等,SEGMENT,ENDS,伪指令,段名,SEGMENT ,定位类型,组合类型,类名,段名,ENDS,定位类型。定位类型给出实际段起点的类型。它有,PAGE,(页类型)、,PARA,(节类型)、,WORD,(字类型)、,BYTE,(字节类型)四种类型。其中,PARA,为默认值。,2024年9月14日,组合类型。组合类型在多模块程序设计中表示该段和其它同名段间的组合连接方法。组合类型有,PUBLIC,、,COMMON,、,AT,、,MEMORY,、,STACK,等。, 类名。类名是程序员任选的一个字符串,使用时必须用单引号括起来。其作用是在连接时决定各逻辑段的装入顺序。,ASSUME,伪指令,它是用来说明逻辑段和物理段关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。,ASSUME,段寄存器名,:,段名,段寄存器名,:,段名,2024年9月14日, ORG,伪指令,伪指令,ORG,指出其后的程序段或数据块的起始地址的偏移量。其格式为:,ORG,表达式,5.,过程定义伪指令,过程名,PROC,NEAR/FAR,过程名,ENDP,2024年9月14日,5.4,宏指令及其使用,1.,宏指令、宏定义和宏调用,宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。,宏定义由,MASM,宏汇编程序提供的伪指令实现。,2024年9月14日,1.,宏定义,宏指令名,MACRO,形式参数,ENDM,2.,宏调用,宏指令名 实际参数,这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。,3.,宏展开,宏体,2024年9月14日,具有宏调用的源程序被汇编时,每个宏调用将被,MASM,进行宏展开。,宏展开实际上是用宏定义时设计的宏体去代替相应的宏指令,并用实际参数一一取代形式参数。,由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由,MASM,进行宏展开。,2024年9月14日,例,若源程序中多处需要将,AL,和,CL,寄存器中的两位压缩型的,BCD,数相加,并将和送回,CL,寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。,DECADD MACRO,ADD AL,CL,DAA,MOV CL,AL,ENDM,显而易见,这是一个无形式参数的宏定义。,2024年9月14日,如果对分别存放在任意,8,位寄存器或存储单元中的两个压缩型的,BCD,数进行加法运算,则可将上例宏定义改写为,DECADD1 MACRO OPR1,OPR2,MOV AL,OPR1,ADD AL,OPR2,DAA,MOV OPR1,AL,ENDM,这是一个带有两个形式参数的宏定义。宏指令为,DECADD1,。,例如有以下宏调用:,2024年9月14日,DECADD1 DL, BUFFER,DECADD1 AREA1, AREA2,则汇编时进行宏展开,得到以下指令:,DECADD1 DL, BUFFER,+ MOV AL, DL,+ ADD AL, BUFFER,+ DAA,+ MOV DL, AL,DECADD1 AREA1, AREA2,+ MOV AL, AREA1,+ ADD AL, AREA2,+ DAA,+ MOV AREA1, AL,2024年9月14日,2.,宏指令与子程序(过程),在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可被程序多次调用的程序段,并且调用前必须由设计者根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和其格式不同,因此,使用中有许多不同之处,主要是空间和时间的差异。,2024年9月14日,子程序由,CALL,指令调用,由,RET,指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。,2024年9月14日,从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。,综上所述,当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较段,访问次数又很频繁时,选用宏指令结构显然要更好些。,2024年9月14日,5.5,汇编语言程序设计,通常,编制一个汇编语言源程序应按如下步骤进行,:,明确任务,确定算法。, 绘制流程图。, 根据流程图编写汇编语言程序。, 上机调试程序。,程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。,2024年9月14日,一、顺序程序设计,顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。,顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。,S1,S2,S3,开始,结束,2024年9月14日,例,1,求两个数的平均值。这两个数分别存放在,X,单元和,Y,单元中,而平均值放在,Z,单元中。源程序编制如下,:,DATA SEGMENT,X DB 5FH,Y DB 57H,ZDB ?,DATA ENDS,STAC SEGMENT STACK STACK,DW 20H DUP(?),TOP LABEL WORD,STAC ENDS,2024年9月14日,CODESEGMENT,MAIN PROC FAR,ASSUME CS:CODE,DS:DATA,SS:STAC,START:,PUSH DS,MOV AX, 0,PUSH AX,MOV AX, DATA,MOV DS, AX,MOV AX, STAC,MOV SS, AX,MOV SP, OFFSET TOP,MOV AL, X,ADD AL, Y,MOV AH, 0,ADC AH, AH,SHR AX, 1,MOV Z, AL,RET,MAIN ENDP,CODEENDS,END START,2024年9月14日,二、分支程序设计,分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示:,分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。,条件,S,1,S,2,条件,S,S,1,S,2,Sn,条件,N,N,Y,Y,2024年9月14日,例,2,现有一符号函数,:,1,当,X0,时,Y= 0,当,X=0,时,-1,当,X0,时,假定,X,为,-25,,且存放在,VARX,单元中,函数值,Y,存放在,VARY,单元,试编写程序根据,X,的值确定函数,Y,的值。,根据题意画出流程图如下:,2024年9月14日,实现符号函数程序的流程图,开始,ALX,AL0?,Y-1,结束,AL,0,Y1,Y0,Y,Y,N,N,2024年9月14日,DSEGSEGMENT,VARXDB -25,VARYDB ?,DSEGENDS,CSEGSEGMENT,ASSUME CS:CSEG,DS:DSEG,START:MOV AX, DSEG,MOV DS, AX,MOV AL, VARX,CMP AL, 0,JGE NEXT,MOV AL, 0FFH,JMP HALT,NEXT:JE ZARE,MOV AL, 1,JMP HALT,ZARE:MOV AL, 0,HALT:MOV VARY, AL,MOV AH, 4CH,INT 21H,CODEENDS,END START,MOVDL, VARY,MOV CL, 4,ROR DL, CL,AND DL, 0FH,CMPDL, 0AH,JBNUA,ADDDL, 7,NUA:ADD DL, 30H,MOV AH, 2,INT 21H,MOV DL, VARY,AND DL, 0FH,CMPDL, 0AH,JBNUB,ADDDL, 7,NUB:ADD DL, 30H,MOV AH, 2,INT 21H,MOV DL, H,MOV AH, 2,INT 21H,2024年9月14日,三、循环程序设计,循环程序结构就是重复执行某一段程序,直到某个条件出现为止。循环程序结构同分支程序结构有相似之处,都是根据条件来实现的,只不过循环是一种运动方向总是向后的分支程序结构。因此,循环可以用分支来实现。,循环初始状态,循环控制条件,循环体,Y,N,循环初始状态,循环体,循环控制条件,N,Y,2024年9月14日,用分支结构实现:,MOVDL, VARY,MOV CL, 4,ROL DL, CL,AND DL, 0FH,CMPDL, 0AH,JBNUM,ADDDL, 7,NUM:ADD DL, 30H,MOV AH, 2,INT 21H,MOV DL, VARY,AND DL, 0FH,CMPDL, 0AH,JBNUB,ADDDL, 7,NUB:ADD DL, 30H,MOV AH, 2,INT 21H,MOV DL, H,MOV AH, 2,INT 21H,用循环结构实现:,MOV BL,,,2,MOVDH, VARY,LOP:MOV CL, 4,ROR DH, CL,MOVDL, DH,AND DL, 0FH,CMPDL, 0AH,JBNUM,ADDDL, 7,NUM:ADD DL, 30H,MOV AH, 2,INT 21H,DECBL,JNZLOP,MOV DL, H,MOV AH, 2,INT 21H,例,3,将上例题中字节变量,VARY,中两位十六进制数输出。,2024年9月14日,1.,循环程序的组成,一个循环程序通常由四部分构成:, 初始化部分,建立循环初始值。如初始化地址指针,计数器,其他循环参数的起始值等。, 工作部分,它是循环程序的这主要部分,是为完成某种特定功能而设计的程序段。, 修改部分,为保证正确的循环而修改某些参数。如修改计数器的值、操作数地址等。, 控制部分,2024年9月14日,判断循环结束条件是否成立。这是循环程序设计的关键。通常判断循环是否结束的办法有两种:, 用计数控制循环:循环是否已进行预定次数,它适用于已知循环次数的循环程序设计;, 用条件控制循环:循环终止条件是否已成立,它适用于未知循环次数的循环程序设计。,2.,循环控制方法, 用计数控制循环,2024年9月14日,例,4,在,xx,单元开始的连续单元中存放有,10,个无符号字节数,从中找出中最大者送,yy,单元。,根据题意,我们把第一个数先送入,AL,寄存器中,然后将,AL,中的数与后面的,9,个数逐个进行比较。如果,AL,中的数较小,则两数交换;如果,AL,中的数大,则不交换。在比较过程中,,AL,中始终保持较大的数,这样,比较,9,次后,则最大的数在,AL,中,最后把,AL,中的数(最大者)存入,yy,单元。,由此可画出程序的流程图,:,2024年9月14日,从一批数中求最大者流程图,开始,ALxx,BXxx,的有效地址,CX9,BXBX+1,AL BX?,AL,BX,中的数交换,CXCX-1,CX=0?,yyAL,结束,Y,Y,N,N,2024年9月14日,DATASEGMENT,xx DB 49,38,65,12,97,13,55,27,28,85,yy DB ?,DATAENDS,CODESEGMENT,ASSUME CS:CODE, DS:DATA,START: MOV AX, DATA,MOV DS, AX,LEABX, xx,MOV AL, BX,MOV CX, 9,LOOP1: INC BX,CMPAL, BX,JAE NEXT,XCHG AL, BX,NEXT: LOOP LOOP1,MOV yy, AL,MOV AH, 4CH,INT 21H,CODEENDS,END START,2024年9月14日,LOOP1:INC BX,CMP AL, BX,JAE NEXT,XCHG AL, BX,NEXT:LOOP LOOP1,AAM,MOV yy, AL,MOV DL, AH,OR DL, 30H,MOV AH, 2,INT 21H,MOV DL, yy,OR DL, 30H,MOV AH, 2,INT 21H,MOV AH, 4CH,INT 21H,CODEENDS,END START,将最大数输出显示,2024年9月14日,(2),用条件控制循环,有些情况无法确定循环次数,但是循环何时结束,可用某种条件来确定。这时,编制程序主要是寻找控制条件及对控制条件的检测。,例,5,从自然数,1,开始累加,直到累加和大于,1000,为止,统计被累加的自然数的个数,并把统计的个数送入,n,单元,把累加和送入,sum,单元。,根据题意,被累加的自然数的个数事先是未知的,也就是说,循环的次数是未知的,因此不能用计数器方法控制循环。但题目中给定一个重要条件,即累加和大于,1000,则停止累加,因此,可以根据这一条件控制循环。我们用,CX,寄存器统计自然数的个数,用,AX,寄存器存放累加和,用,BX,寄存器存放每次取得的自然数。,2024年9月14日,程序的流程图如下所示。,开始,初始化,AX0, CX0, BX0,BXBX+1,AXAX+BX, CXCX+1,AX1000?,nCX, sumAX,结束,Y,N,2024年9月14日,DATAS SEGMENT,n DW ?,sum DW ?,DATAS ENDS,STACK SEGMENT PARA STACK stack,DW 100 DUP(?),STACK ENDS,CODES SEGMENT,MAIN PROC FAR,ASSUME CX:CODES, DS:DATAS, SS:STACK,START,:,PUSH DS,MOV AX, 0,PUSH AX,MOV AX, DATAS,MOV DS, AX,2024年9月14日,MOV CX, 0,MOV AX, 0,MOV BX, 0,LOOPT,:,INC BX,ADD AX, BX,INC CX,CMP AX, 1000,JBE LOOPT,MOV n, CX,MOV sum, AX,RET,MAIN ENDP,CODES ENDS,END START,2024年9月14日,3.,多重循环程序设计,多重循环又称循环嵌套,即循环套循环。有些问题比较复杂,单重循环难以解决,必须使用多重循环。在使用多重循环时,必须注意以下几点:, 内循环必须完整地包含在外循环内,内外循环不能相互交叉。, 内循环既可以嵌套在外循环中,也可以几个内循环并列存在。可以从内循环中直接跳到外循环,但不能从外循环直接跳进内循环中。, 防止出现,“,死循环,”,。无论是外循环,还是内循环,千万不要使循环返回到初始部分,这一点应当特别注意。,2024年9月14日,每次通过外循环再次进入内循环时,初始条件必须重新设置。,例,6,利用逐次求大数的方法对内存单元,ARRAY,开始的一字节为单位的无符号数进行从大到小排序。,根据题意,排序方法为:,编制程序如下:,49,38,65,12,97,13,55,27,78,85,49,49,65,65,97,97,38,38,49,49,65,65,78,78,85,85,78,65,55,49,38,27,13,12,12,ARRAY,AL,BX,SI,SI,SI,SI,SI,SI,SI,SI,SI,BX,SI,SI,SI,SI,SI,SI,SI,SI,2024年9月14日,DATA SEGMENT,ARRAY DB 49,38,65,12,97,13,55,27,28,85,DATAENDS,CODE SEGMENT,ASSUME CS:CODE, DS:DATA,START: MOV AX, DATA,MOV DS, AX,MOV DX, 9,LEA BX, ARRAY,LOOP0: MOV AL, BX,MOV SI, BX+1,MOV CX, DX,LOOP1: CMP AL, SI,JAE NEXT,XCHG AL, SI,NEXT: INC SI,LOOP LOOP1,MOV BX, AL,IN
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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