收藏 分销(赏)

第4章 汇编语言程序设计new.ppt

上传人:s4****5z 文档编号:13996563 上传时间:2026-05-24 格式:PPT 页数:126 大小:253.50KB 下载积分:10 金币
下载 相关 举报
第4章 汇编语言程序设计new.ppt_第1页
第1页 / 共126页
第4章 汇编语言程序设计new.ppt_第2页
第2页 / 共126页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 汇编语言程序设计,计算机的程序设计语言,汇编语言程序格式,汇编语言表达式,伪指令语句,DOS,系统功能调用,程序设计方法,汇编语言语法,计算机的程序设计语言,机器语言,汇编语言,高级语言,机器语言,机器指令,(Machine Instruction),:,用二进制编码的指令,一条机器指令控制计算机完成一个操作。机器指令一般由操作码和操作数构成。,指令集,(Instruction Set),:,每种处理器都有各自的机器指令集合,称为该处理器的指令集。,机器语言,(Machine Language),:,指令集及使用它们编写程序的规则称为机器语言,用机器语言编写的程序是计算机唯一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译,(,汇编、编译或编译,),,变换成机器语言程序。,1011000000000011,0000010000000111,汇编语言,助记符,(Mnemonic),:,为了克服机器语言的缺点,人们采用便于记忆,并能描述指令功能的符号来表示机器指令,称为助记符。助记符一般由表明指令功能的英语单词或其缩写。助记符与机器指令一一对应。,汇编语言,(Assembly Language),:,用助记符表示的指令就是汇编格式指令,用汇编格式指令以及它们编写程序的规则形成汇编语言。用汇编语言书写的程序就是汇编语言程序。,汇编语言程序,机器语言程序,汇编,MOV AL,3,ADD AL,7,高级语言,汇编语言虽然较机器语言直观,但仍然烦琐难记,于是在,20,世纪,50,年代,人们研制了高级程序设计语言。,高级程序设计语言比较接近于人类自然语言和语法习惯及数学表达形式,与具体的计算机硬件无关,比较简单易学。,高级语言程序,机器语言程序,编译或解释,int,al=3;,al+=7;,混合语言编程,采用两种或两种以上编程语言组合编程,可以发挥各自语言的长处,或解决某一种语言不能解决的问题,C,语言和汇编语言混合编程,c/c,+,和,c#,混合编程,JavaScript,和,ActionScript,混合编程,汇编语言的应用场合,程序执行占用较短的时间,或者占用较小存储容量的场合。,程序与计算机硬件密切相关,程序直接控制硬件的场合。,分析系统的底层软件、加密解密软件、分析和防治计算机病毒。,需提高大型软件性能的场合。,汇编语言的基本定义,汇编语言也是一门计算机语言,比我们已经学过的,C,语言等其他计算机语言,低级,汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言,汇编语言程序的执行要经过:编辑、汇编、连接等过程,学习汇编语言必须具备,二进制及二进制同其他进制之间的转换,计算机中数和字符的表示,计算机系统的基本组成,基本的,DOS,命令,一门或几门计算机高级语言,后续课程,计算机组成原理,计算机接口技术,单片机原理与应用,汇编语言概述,什么是汇编语言,汇编语言程序的特点,汇编程序,MASM,的功能,汇编语言程序框架,什么是汇编语言,汇编语言(,Assembly Language),是利用指令的助记符、符号地址、标号来编写的语言,它是机器语言的符号表示,是较低级的语言。,汇编语言程序:用汇编语言编写的程序称为汇编语言程序,也称源程序,指令系统中的每条指令都是构成源程序的基本语句。,汇编语言程序的特点,可读性差,能够直接控制硬件,运行速度快,节省内存,汇编程序,MASM,的功能,汇编程序即微软提供的,MASM,宏汇编程序,它具有如下的功能:,检测出源程序中的语法错误,并给出出错信息,包括出错的行和错误类型;,处理伪操作;,产生源程序的目标程序(,obj,文件),并可给出列表文件(,lst,文件)和,crf,文件;,展开宏指令。,汇编语言程序格式,指令性语句,伪指令语句,数据项,指令性语句,指令性语句与机器指令相对应,汇编程序将它翻译成目标代码。,指令性语句格式:,标号:指令助记符 操作数1,操作数2;注释,标号,标号表示本指令的符号地址,后面必须跟冒号“:”,标号使用的字符为字母、数字或某些特殊字母(、_、?),第一个字符不能为数字,最大有效长度为31个字符,标号可以省略,标号经常作为转移指令的一个操作数,用来表示转移的地址,指令助记符,指令助记符表示该语句的指令名称的代表符号,指令助记符指出指令的操作类型,汇编程序将其翻译成机器指令,指令助记符是不能省略的,操作数,操作数表示参加本指令运算的数据,根据指令要求可以有一个或多个操作数,有的指令不需要操作数,多个操作数之间用逗号“,”隔开。,操作数与指令助记符之间用空格隔开。,操作数可以是常数、变量、标号、寄存器名和表达式,注释,注释用来说明一条指令或一段程序的功能,注释可以省略,注释前必须加上分号“;”,汇编程序对;后面的内容不汇编,使用注释使程序容易读懂,伪指令语句,伪指令语句没有对应的机器指令,汇编程序可以对不同的伪指令作不同的处理,常见的有:数据定义,存储区分配,段定义,段分配,过程定义,宏定义,指示程序结束等,伪指令语句格式:,名字 伪指令指示符 操作数1,操作数2;注释,名字,名字是给伪指令取的名称,它用符号地址表示,后面不允许带冒号,。,名字可以省略,伪指令中的名字可以是变量名、段名、过程名、符号名等,伪指令指示符,伪指令指示符是汇编程序,MASM,规定的符号,常用的有:,变量定义语句,DB、DW,符号定义语句,EQU、=,段定义语句,SEGMENT,和,ENDS,段分配语句,ASSUME,过程定义语句,PROC,和,ENDP,汇编程序结束,END,操作数,操作数由伪指令具体要求的,有的伪指令不带操作数,有的伪指令可以带多个操作数,多个操作数用逗号隔开。,操作数可以是常数、变量、字符串和表达式,但不能为寄存器。,注释,注释的功能和使用与指令性语句相同,数据项,汇编语言中使用的操作数可以是常数、寄存器、存储器、变量、标号或表达式,其中常量、变量和标号是三种基本数据项,常量,常量的值固定,不能改变,没有属性,是一个确定的数,用二进制表示时,以,B,结束;以八进制表示时,以,O,或,Q,结束;用十进制表示,以,D,结束,,D,也可以省略,也可以用科学记数法;用十六进制表示,以,H,结束,当十六进制数以“,AE”,的开头时,前面必须加0,常量也可以是字符串,字符串用单引号括起来,在内存中以字符的,ASCII,码存放。,变量,变量通常指存放在存储单元中的值,在程序的运行过程中,其值可以改变。,变量具有以下三个属性:,段值(,SEGMENT):,指变量所在段的段基地址,段内偏移地址(,OFFSET):,指变量地址与所在段的段基地址之间的地址偏移字节数,类型(,TYPE):,指变量中每个元素所包含的字节数,,BYTE,1,WORD,2,DWORD,4,标号,标号是可执行指令语句的地址的符号表示,它可以作为转移指令的目标操作数,以确定程序转向的目标地址,标号具有三个属性:,段值(,SEGMENT):,指标号所在段的段基地址,段内偏移地址(,OFFSET):,指标号与所在段的段基地址之间的地址偏移字节数,类型(,TYPE):,指标号在转移指令中可转移的距离。,NEAR,-1,FAR,-2,,隐含的为,NEAR,属性,MASM,中的表达式,表达式由运算对象和运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数。,运算对象可以是常数、变量和标号,运算结果可以是一个常数,也可以是一个存储器的地址,运算符:在,MASM,中使用了6类运算符,MASM,中的运算符,算术运算符:+、*、/、,MOD、SHL、SHR,逻辑运算符:,AND、OR、XOR、NOT,关系操作符:,EQ、NE、LT、GT、LE、GE,数值回送操作符:,TYPE、LENGTH、SIZE、OFFSET、SEG,修改属性操作符:段操作符、,PTR、THIS、SHORT、HIGH,和,LOW,其他运算符:圆括号()、方括号,算术运算符,算术运算符包括+、-、*、/、,MOD(,取模)、,SHL(,左移)、,SHR(,右移),算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。,若对地址运算,通常是在标号上加/减某一个数字量,对地址乘没有意义,逻辑运算符,逻辑运算符包括,AND(,与)、,OR(,或)、,NOT(,非)、,XOR(,异或),逻辑运算符是按位运算的,只能对常数进行运算,运算结果也是常数,注意:逻辑运算符与逻辑指令助记符的区别:逻辑运算符是在汇编过程中进行计算的;而逻辑指令助记符是在程序执行时进行运算的。,关系运算符,关系运算符包括,EQ(,相等)、,NE(,不相等)、,LT(,小于)、,GT(,大于)、,LE(,小于或等于)、,GE(,大于或等于),关系运算符的两个操作数必须是数据,或是同一个段内的两个存储单元的地址。,关系运算的结果是一个数值,若结果为真,输出全是1,即0,FFH,或0,FFFFH;,若结果为假,输出全是0,关系运算符一般与逻辑运算符组合起来使用,数值回送操作符,数值回送操作符也称为分析运算符,数值回送操作符包括,OFFSET、SEG、TYPE、LENGTH、SIZE,,它们加在变量或标号前,返回运算对象的某个参数值,例如:偏移地址值、段基地址值、类型属性、变量包含的单元数等,OFFSET,和,SEG,OFFSET,格式:,OFFSET variable,或,label,说明:回送变量或标号的偏移地址,SEG,格式:,SEG variable,或,label,说明:回送变量或标号的段基地址,TYPE,格式:,TYPE expression,或,label,说明:如右表所示,类型,返回值,变量,DB,1,DW,2,DD,4,DQ,8,标号,NEAR,-1,FAR,-2,LENGTH,格式:,LENGTH variable,说明:对于变量中使用,DUP,的情况,汇编程序将回送分配该变量的单元数(而不是字节数),而对于其他情况则回送1,SIZE,格式:,SIZE,vairable,说明:回送分配该变量的字节数,是,LENGTH,和,TYPE,的乘积,修改属性操作符,修改属性操作符也称为综合运算符,修改属性操作符有段操作符、,PTR、THIS、HIGH、LOW、SHORT,,在程序的运行过程中,通过修改属性运算符来修改变量或标号的属性,包括段属性、偏移地址属性、类型属性等,段操作符,格式:段前缀:变量或地址表达式,说明:段前缀有段寄存器,CS、DS、ES、SS,后跟冒号,用来表示某个变量或地址被修改到哪个段寄存器提供的段基地址中,PTR,格式:类型/距离,PTR,变量或标号,说明:将,PTR,左边的类型属性赋给右边的变量或标号。,PTR,本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,以保证运算时操作数的类型的匹配,常与类型,BYTE、WORD、NEAR、FAR,等连用,SHORT,格式:,SHORT,标号,说明:,SHORT,用来说明转移指令中转向地址的属性,指出转向的目标地址与本指令之间的距离在-128+127之间,即限制在短转移范围内。,HIGH,和,LOW,格式:,HIGH/LOW,变量或标号,说明:,HIGH,和,LOW,称为字节分离运算符,对一个数或地址表达式,,HIGH,从中分离出高位字节,,LOW,分离出地位字节。,其他运算符,圆括号():用来改变运算符的优先级别,方括号:用来表示地址表达式或多重变量的下标,运算符的优先级,优先级,运算符,1(最高),(),LENGTH SIZE,2,PTR OFFSET SEG TYPE THIS CS:DS:ES:SS:,3,HIGH LOW,4,*/,MOD SHL SHR,5,+-,6,EQ NE LT LE GT GE,7,NOT,8,AND,9,OR XOR,10(最低),SHORT,伪指令语句,数据定义语句,标号赋值伪操作,EQU、,段定义伪操作,段分配伪操作,ASSUME,过程定义伪操作,程序开始和结束伪操作,数据定义语句,格式,变量名 助记符 操作数,操作数,,,操作数;注释,变量名 助记符,n dup(,操作数,操作数,,,操作数,),;注释,解释,变量名:用符号表示,可以省略,助记符:,DB DW DD DQ DT,操作数:可以是常数,字符串,变量,标号,表达式等,多操作数之间用逗号分开,在格式,2,中,,n,必须是正整数,表示括号中的操作数的重复次数,注释:说明伪指令的功能,前面必须带分号,可有可无,操作数为常数或表达式,DA1 DB 10H,52H,DA2 DW 1122H,34H,-5,DA3 DB 5*20H,0FFEEH,?,AB,画出这三个变量在内存中的存储状况,操作数是字符串,写出下列变量在存储器中的存储状况:,ONE DB HELLO,TWO DB AB,THREE DW AB,?操作数,只分配存储空间,不存入具体的数,如:,VAL DB?,M DW 0F55H,?,复制操作符,dup,格式:,repeat_count,dup(oprand,oprand,),说明:,repeat_count,用来指定括号中的操作数的重复次数,写出下列变量在存储器中存储状况:,One db 5 dup(0),Two,dw,10 dup(?),Three db 4 dup(1,2 dup(20h),表达式赋值语句,EQU,赋值语句,EQU,格式:符号名,EQU,表达式,功能:用来给变量,标号,常数,指令,表达式等定义一个符号名,程序中用到,EQU,左边的变量,标号时可用右边的常数值或表达式代替,但不能重新定义,举例:,COUNT EQU 100,DATA EQU COUNT+2,A1 EQU BX+SI,B1 EQU OFFSET A1,C1 EQU ADD,等号“=”语句,等号语句与,EQU,语句具有相同的功能,,EQU,伪操作中的符号名是不允许重复定义的,而伪操作则允许重复定义,举例:,COUNT=100,COUNT=COUNT+10,A1=BX+SI,MOV CX,A1,B1=ADD,段定义伪操作,格式:,Name,SEGMENT,定位类型 组合类型 分类名,Name,ENDS,说明:定义一个逻辑段,,SEGMENT,和,ENDS,必须成对出现,定位类型、组合类型和分类名可以省略。,段分配伪操作,ASSUME,格式:,Assume,cs,:,段名,ds,:,段名,es,:,段名,ss,:,段名,指定某个段分配给哪个寄存器,它并不能把段地址存入段寄存器中,所以在代码段中,还必须把段地址装入相应的寄存器中。如:,MOV AX,DATA,MOV DS,AX,把数据段地址值装入,DS,寄存器中,注意:上面的四个段,除代码段外,其余,3,个段依据具体问题进行定义。,过程定义伪操作,格式:,过程名,PROC,属性,RET,过程名,ENDP,说明:,过程名:给所定义的过程取的名字,不可缺少,也是子程序的入口,具有三种属性:段属性、偏移地址属性、距离属性(,NEAR,或,FAR,),PROC,和,ENDP,成对出现,不可缺少,Ret,过程的返回指令,功能:定义一个过程,主程序可以用,CALL,指令调用,举例:用过程调用的方法,将内存中,n,个,BCD,码数相加,程序开始和结束伪操作,NAME,格式:,NAME,程序名,功能:为源程序目标模块赋名字;若源程序中省略,NAME,伪操作,汇编程序将源文件名作为目标模块的名字,END,格式:,END,标号名,功能:标记汇编源程序结束,不可省略,放在源程序的最后一行,每个模块只有一个,END,,汇编程序到,END,语句就停止汇编,Org,伪操作,格式:,ORG,表达式,功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址,Seg1 segment,Org 10,Var1,dw,1234h,Org 20,Var2,dw,5678h,Seg1 ends,Mov,bx,offset,var1,Lea si,var2,Bx,、,si,分别得到什么?,label,伪操作,格式:,variable,LABEL,type,说明:给同一个存储单元赋予不同的属性。,举例:,datb,label byte,datw,dw,3031h,3233h,mov,al,datb0,mov,ax,datw1,DOS,系统功能调用和,BIOS,中断调用,DOS,具有对,I/O,设备管理及磁盘与文件管理的功能,它们一部分被固化在系统的,ROM,中,可作为,ROM BIOS,模块。另一部分存放在系统磁盘上,在系统启动时被装入内存,用户的应用程序及,MS-DOS,的大部分命令都将通过软件中断调用它们。,DOS,系统功能调用,系统功能调用是,DOS,为系统程序员及用户提供的一组常用的子程序,用中断指令,INT 21H,作为进入这个功能调用的总入口,再为每个功能调用规定一个功能号,以便进入相应的子程序的入口,DOS,系统功能调用的使用方法,键盘输入/输出的,DOS,系统功能调用,DOS,系统功能调用的使用方法,在,AH,寄存器中存入要调用功能的功能号,根据调用功能的规定设置入口参数,用,INT 21H,指令转入子程序入口,相应的子程序运行完后,可以按规定取得返回参数,键盘输入/输出的,DOS,系统功能调用,功能号,功能,入口参数,返回参数,01,H,从键盘上输入一个字符,无,AL,输入字符的,ASCII,码,02,H,在屏幕上显示一个字符,DL,输出字符的,ASCII,码,无,09,H,显示字符串,DS:DX,串地址,字符串以$结束,无,0,AH,从键盘上输入一个字符串,DS:DX,缓冲区首地址,(,DS:DX),缓冲器最大字符数,(,DS:DX+1),实际输入的字符数,字符的输入和输出,从键盘上输入一个字符,并判断该字符的种类:数字、大写字母、小写字母和其他字母,在屏幕上显示字符,$,日期和时间的设置,功能号,功能,入口参数,返回参数,2,BH,设置日期,CX:,年,DH:,月,DL:,日,AL=0,成功,AL=0FFH,失败,2,DH,设置时间,CH:,时,CL:,分,DH:,秒,DL:1/100,秒,AL=0,成功,AL=0FFH,失败,日期和时间的获取,功能号,功能,入口参数,返回参数,2,AH,取得日期,CX:,年,DH:,月,DL:,日,2,CH,取得时间,CH:,时,CL:,分,DH:,秒,DL:1/100,秒,BIOS,中断调用,驻留在,ROM,中的,BIOS,提供了如下三项功能:,自检及初始化程序,硬件中断处理程序,程序服务请求,如,CMOS,设置程序,BIOS,中断类型,中断类型号,功能,中断类型号,功能,10H,显示器,16H,键盘,11H,设备检验,17H,打印机,12H,内存大小,18H,驻留,BASIC,13H,磁盘,19H,引导,14H,通讯,1AH,时钟,15H,I/O,系统扩充,键盘中断调用(,INT 16H,),功能号,AH,功能,返回参数,0,从键盘读一个字符,AL=,字符,,AH=,扫描码,1,读键盘缓冲区字符,ZF=0,AL=,字符,ZF=1,缓冲区空,2,取特殊功能键状态,AL=,特殊功能键状态,显示中断调用(,INT 10H,),INT 10H,功能调用可以进行屏幕设置,在屏幕上绘图,AH,存放功能号,并在指定寄存器中存放入口参数。,时间中断调用(,INT 1AH,),AH,功能,入口参数,出口参数,0,读取时间,无,CH:CL=,时,:,分,DH:DL=,秒,:1/100,秒,1,设置时间,CH:CL=,时,:,分,DH:DL=,秒,:1/100,秒,无,程序设计方法,顺序结构,分支结构,循环结构,子程序结构,顺序结构,概述:程序顺序执行,无分支,无循环,举例,1,:内存中,TABLE,开始的存储单元中存放09的平方值,从键盘上任意输入一个09之间的数,X,,查表得该数的平方,并输出。,分析:,键盘输入;,ASCII,码,数字;,验证输入的正确性;查表,顺序结构举例,2,编程计算,(V-(X*Y+Z-187)/X,的值,其中,XYZV,均为带符号,16,位数据变量,要求将结果存放在双字变量,W,之中,分支结构,概述:在程序的执行过程中,经常要求程序根据不同条件选择不同的处理方法,实现:汇编程序使用条件转移指令,Jxx,和无条件转移指令,JMP,实现分支结构程序,,LOOP,指令也可以看作实现分支结构的指令,分支程序设计举例,分支程序设计举例1,从键盘上输入一个字符串,存入首地址为,string,的缓冲区,字符串长度,n,小于256,要求分别计算其中的数字字符,小写字母,大写字母和其他字符的个数,并分别将这三个数存入三个存储单元中,分析:,正确定义缓冲区用于存放输入的字符串;从键盘上输入字符串;,统计字符,从键盘上输入一个字符串,开辟一个缓冲区,从键盘输入一个字符串,将输入的字符数送入,CX,BX,指向字符串的第一个字符。,Buffer db 30,?,30 dup(0),缓冲区,Buffer,包括三个部分:,第一个字节存放最大字符数,由用户给出,第二个字节存放实际输入的字符个数,字符串输入结束后,由,DOS,调用的10号功能自动填充,从第三个字节开始存放输入的字符串,以回车结束,分支程序设计举例,2,判断某年是否为闰年,算法:,判断是否为闰年的条件是:能被,4,整除但不能被,100,整除;或能被,400,整除,分支程序设计举例,3,跳跃表实现分支:适用于分支较多的情况,相当于高级语言当中的,switchcase,结构,循环结构,概述:重复执行某一程序段若干次,直到满足一定的条件为止,循环程序结构包括四个部分:,初始化:设置循环次数,设置变量的初始值,循环体:循环结构中反复执行的部分,参数的修改:修改操作数的值,循环控制:修改循环次数,判断循环控制条件,决定是否推出循环,循环程序设计举例,循环程序设计举例1,BX,中的16进制数转换为,ASCII,码,存放到,BUF,开始的内存单元中去,并在屏幕上显示数值,例如:,BX=12ABH,,则在屏幕上显示12,AB,分析:,BX,中4位十六进制数如何分离;,数字如何转换为,ASCII,码;,ASCII,码的显示;,流程图,BX,中4位16进制数如何分离,设置一个循环计数器,CH,CH,初始值为4,表示,BX,中的4位16进制数分4次显示,每次显示一位;,设置移位位数计数器,CL,CL,初始值为4,表示每次循环移位的二进制位数为4(因为一位16进制数由4位二进制组成);,由于在屏幕上显示的时候,最高位最先显示,然后再显示次最高位,最后显示最低位,显示的顺序是从左到右,所以采用,循环左移,的方法,把最高位移到最低位(最右边),然后屏蔽其他3位,把最低位转换为,ASCII,码后在屏幕上显示。,数字如何转换为,ASCII,码,由于16进制数有两种情况:,在09范围内;在,AF,之间。,如果是第一种情况,则转换为09的,ASCII,码需要加上30,H,如果是第二种情况,则转换为,AF,的,ASCII,码需要加上37,H,ASCII,码的显示,功能号为2,,2AH,要显示字符的,ASCII,码,DL,调用,DOS,中断,流程图,开始,设置循环计数,CH=4,设置移位计数,CL=4,BX,循环左移,CL,位,取出最右边的数位,在09范围内吗,加上30,H,加上37,H,在屏幕上显示,CH,CH-1,CH=0,结束,是,是,否,否,循环程序设计举例2,AX,寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到,CL,寄存器中,循环程序设计举例3,多重循环,各循环的初始控制条件,内循环可以嵌套在外循环中,也可以几个内循环并列在外循环中,但各层之间不能交叉,可以从内循环中跳到外循环,不可以从外循环直接跳到内循环中,冒泡法排序,冒泡法排序,存储器数据段从,BUF,开始存放一个字数组,数组中第一个字中存放该数组的长度,N,,编制一个程序使此数组中的数据按从小到大的次序排序,分析:,冒泡算法描述;,冒泡算法分析;,外循环和内循环的分工;,流程图,冒泡算法描述,例如,如果数组为8 5 32 16 7,现在对其升序排序,整个算法描述如下:,原顺序:,8 5,32 16 7,5,8 32,16 7,5 8,32 16,7,5 8 16,32 7,5 8,16 7,32,5,8 16,7 32,5 8,16 7,32,5 8,7,16,32,5,8 7,16 32,5 7,8,16 32,5,7,8 16 32,第一轮比较,第二轮比较,第三轮比较,第四轮比较,说明:,红色字体为每一轮比较之后得到的最大数,这是“冒泡”得名的缘由;,带下画线的是下一次进行比较的两个数。如果左边的数大于右边的数,则交换位置;反之,不发生交换,冒泡算法分析,对于,N,个元素的数组,要对其进行排序,则需要进行:,N-1,轮比较,在第,i,轮比较里面,,,需要进行,N-i,次比较,其中,i,1,N-1,总共需要进行比较的次数,N(N-1)/2,外循环和内循环的分工,外,循环控制比较的轮数,外循环的次数与数组元素的个数,N,有关,为,N-1。,每一轮比较结束之后,将会得到一个最大的数。,内循环控制每一轮比较里面的比较次数。内循环次数与当前进行比较轮数的序号,i,有关,为,N-i,,其中,i,1,N-1,,所以随着比较轮数的序号,i,的增大,内循环的次数逐渐减小,为一个等差数列,方差为1。,例如:对于,N=5,则外循环的次数为4;在第1轮比较里面,需要进行,N-1,次比较,在最后一轮比较里面,即第4轮比较里面,只需要进行,N-i=1,次比较;总共需要进行的比较的次数为,N(N-1)/2=54/2=10,流程图,开始,COUNT1,N-1,COUNT2,COUNT1,I,0,AI,AI+1,AI,AI+1,I,I+1,COUNT2,COUNT2-1,COUNT2=0,COUNT1,COUNT1-1,COUNT1=0,结束,否,否,否,说明:,COUNT1,为外循环次数;,COUNT2,为内循环次数;,I,为数组,A,的下标,子程序设计,子程序概述,子程序意义,过程定义伪操作,子程序的调用和返回,子程序的参数传递,子程序举例,子程序概述,汇编语言中多次使用的程序段可写成一个相对独立的程序段,称为“过程”或“子程序”,需要执行这段程序时,就进行“过程”调用,执行完毕后再返回原来调用它的程序。,子程序意义,子程序又称为过程,相当于高级语言中的过程和函数。,在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构都相同,只是某些变量的赋值不同。此时就可以把这些程序段写成子程序。,过程定义伪操作,格式:,Procedure_name,PROC,Attribute,Procedure_name,ENDP,其中,,Attribute,表示过程的属性,:FAR NEAR,过程属性的确定原则,如调用程序和过程(子程序),在同一个代码段,,则使用,NEAR,属性;,如调用程序和过程(子程序),不在同一个代码段,,则使用,FAR,属性。,子程序说明,通常编写子程序时,写一个子程序说明,子程序说明包括:,功能描述:子程序的名称,功能和性能,子程序中用到的寄存器和存储单元,子程序的入口参数、出口参数,子程序中调用其他子程序的名称,过程调用,调用程序使用,CALL,指令,要处理好三件事情:,保护调用程序的返回地址,(,现场保护,),保护某些寄存器内容,主程序与子程序间的参数传递,保护现场和恢复现场,现场保护由,CALL,指令本身完成,保护的内容:,如果是段内调用,即近调用,将当前指令指针,IP,入栈保护;,如果是段间调用,即远调用,除了将当前的指令指针,IP,入栈保护外,还要将代码段的段基地址,CS,入栈保护,入栈的顺序为,CS,先,,IP,后,当遇到,RET,指令,则自动将,IP,和,CS,弹出堆栈,恢复现场,保存和恢复寄存器,为了避免寄存器冲突,进入子程序后就应该把子程序所需要的寄存器内容,保存,在堆栈中,而在退出子程序前把寄存器内容恢复原状。,但是,在下面两种情况下,不应该把寄存器入栈:,使用寄存器在主程序和子程序之间,传送参数,子程序中利用寄存器向主程序,传送结果,子程序的参数传递,通过寄存器传递参数:适用于参数较少的情况,传递速度较快,通过存储器传递参数:适合参数较多的情况,需要事先在存储器中建立一个参数表,通过堆栈传递参数:适合参数较多的情况,尤其是在子程序嵌套与递归调用的情况下使用时不易出错,寄存器传递参数子程序举例,以十进制的形式显示,AX,中的数(二进制,十进制,例如,AX=0001001000110100,即,1234H,转换为十进制数,4660,在屏幕上显示,),子程序名:,BIN2DEC,入口参数:,AX,出口参数:在屏幕上显示,算法描述,AX,与,10,相除,保存余数,再把商除以,10,,再保存余数,继续进行,直到商为,0,时为止,内存传递参数子程序举例,数据段定义两个数组,编程实现数组分别求和(不计溢出),子程序名称:,SUM,功能:实现求一个数组元素之和,入口参数:数组的首地址;数组元素的个数,出口参数:数组元素的和存放在变量中,参数传递的方式:主要采用存储器传递参数,程序结构,定义数据段,数据段里面的变量能够被主程序和子程序使用,即作为主程序和子程序之间传递的参数,定义代码段,代码段的结构,Code segment,Main proc far;,主程序,Call sum,;,调用子程序,sum,Main,endp,Sum proc near;,子程序,Sum,endp,Code ends,堆栈传递参数子程序举例,通过堆栈传递参数,求有符号字数组,ARRAY,中元素的最小值,数组元素的个数存放在,COUNT,字单元中,此例的关键:,程序运行过程中堆栈的变化情况,。,子程序的嵌套和递归,一个子程序也可以作为调用程序去调用另一个子程序,称为子程序的嵌套,如果一个子程序调用的子程序是它本身,称为递归调用,多模块程序设计,在汇编中,一个模块就是和一个源文件(,asm,文件)相对应,各模块之间相互调用是,标识符(变量、标号、过程名)的定义,多模块的汇编、连接和可执行文件的生成,标识符的定义,局部标识符:在本模块中定义,仅供本模块使用,外部标识符:在本模块中定义,而在另一个模块中使用,PUBLIC,伪指令,格式:,PUBLIC,标识符,1,标识符,2,说明:,在本模块中定义,在其他模块中使用,则在本模块中用,PUBLIC,进行标识,EXTRN,伪指令,格式:,EXTRN,标识符,:,类型,说明:,在另一个模块中定义,而在本模块中使用,则在本模块中用,EXTRN,声明,PUBLIC,和,EXTRN,两个伪指令的使用必须相匹配,即,EXTRN,中所说明的标识符必须在其定义的模块用,PUBLIC,声明为外部标识符,并且类型一致,多模块调用举例,求,N,的阶乘,总调用模块,MAIN,(,ex438a.asm,),输入数字模块,STDIN,(,ex438b.asm,),计算阶乘,FACT,(,ex438c.asm,),输出显示,DISP,(,ex438d.asm,),可执行文件的生成,汇编:分别汇编各模块文件,得到各模块的目标文件,连接:多个目标文件连接成一个可执行文件,即,D:link ex438a+ex438b+ex438c+ex438d,最终生成的可执行文件名默认为第一个模块的名称,注意事项:多个模块中,只有主模块程序的最后一行定义程序的执行入口点,如,end main,;其他被主模块调用的模块的程序的最后一行为,end,,,end,后不能加程序的入口点,宏汇编,什么是宏,宏定义,宏调用,宏展开,宏操作符,Local,伪操作,什么是宏,宏(,Macro,)是源程序中一段有独立功能的程序代码。只需要在源程序中定义一次就可以多次调用它,调用时只需要用一个宏指令即可。,宏定义,格式:,宏指令名,MACRO,形参表,;,宏定义体,ENDM,说明:,宏名是符合语法的标识符,唯一,MACRO,表示开始,,ENDM,表示结束,形参可选,每个形参之间用逗号分隔,举例说明,宏指令,MOVE,完成字传送的功能,宏调用,经宏定义后的宏指令就可以在程序中调用。宏调用的格式为:,宏指令名,实参数表,宏展开,用宏定义体替代源程序中的宏指令,宏定义体中的形参用宏调用提供的对应实参取代,在宏展开时,实参和形参是一一对应的,二者的个数应该相等,若实参个数大于形参个数,多余的实参不予处理,若实参个数小于形参个数,则多余的形参作“空”处理,宏定义中的形参可以是指令的操作数、标号,也可以是指令的操作码或操作码的一部分。,宏和子程序的区别,子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间;而宏调用则是在汇编期间展开的,每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间也越大,子程序的调用、返回、保存和恢复寄存器、参数的传递都要增加程序的开销,用宏调用可以免去执行时间上的开销,子程序代码可以放在调用程序的后面和前面;宏定义体放在程序代码的最前面,宏的使用场合,当程序段较段或要求较会执行时,应选用宏,当程序段较长或为减小目标代码时,选用子程序,宏操作符,连接操作符,&,表达式操作符,%,文本操作符,字符操作符,!,宏注释符,;,Local,伪操作,如果宏定义体中使用了标号和变量,在同一源程序中又多次被宏调用,就会出现多个相同标号或出现变量的重复定义,从而产生汇编错误。使用,Local,对标号或变量进行说明以解决这个问题,格式:,Local,标号或变量表,说明:,多个标号或变量用逗号隔开,Local,紧跟在,macro,后面,在宏展开时,将自动以,?0000,?0001,替代,local,列出各个标号和变量,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服