资源描述
1,主讲教师:范新民,第三章:8086汇编语言程序设计,2,8086汇编语言程序设计,3,8086汇编语言程序设计,3.2.1汇编语言源程序的格式,一、基本概念,1、机器语言、汇编语言和高级语言,机器语言:用0、1代码表示的机器指令形式,是机器硬件唯一能识别和执行的语言。例:机器指令01000000;表示(AX)1AX,汇编语言:用符号表示指令的操作码、操作数。又称符号语言。例:INCAX;增1指令,4,汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。机器指令与机器代码是一一对应的。汇编语言机器语言均属于低级语言。,高级语言:接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。,汇编语言源程序的格式,5,2、汇编语言的特点代码长度短,执行速度最快可直接有效的控制机器的运行准确掌握机器运行时间可最有效的利用CPU、内存、I/O资源直接控制机器运行的场合汇编语言常用于:需要准确控制运行时间的场合运行速度要求很高的场合,汇编语言源程序的格式,6,汇编语言源程序的格式,3、语句的类别与结构分段结构:最多可由4种段组成:代码段、数据段、堆栈段、附加段。语句类别:,(1)指令语句:由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。,(2)宏指令语句:允许用户为多次重复使用的程序段命名的一个名字。即将一个程序段定义为一宏指令。,7,第三章:汇编语言程序设计,(3)伪指令语句:伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。,伪指令与指令性语句的区别:伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。,8,例3-1:对10个字节数据a1a10求和。DATASEGMENTAT2000HARRAYDBa,a,a,aCOUNTEQUARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACKSTACKSTAKDB10DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,汇编语言源程序的格式,9,START:MOVAX,DATAMOVDS,AXMOVAX,MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,BXADCAH,INCBXLOOPLOPMOVDI,AXMOVAH,4CHINT21HCODEENDSENDSTART,汇编语言源程序的格式,10,二、指令性语句,标号:操作码操作数;注释项,操作码:指明操作的性质,说明计算机要执行的具体操作。用助记符表示。操作数:指明指令执行过程中所需的数据。可有0个、1个或者多个表达式组成,并由它提供执行指定操作所需要的操作数或地址。注释项:必须以分号开头,主要用来说明程序或重要语句的功能。,汇编语言源程序的格式,11,标号:对应的标识符后面必须跟有冒号,标号在汇编以后分配有地址。标号又称为符号地址,可作为转移指令或子程序调用的目标地址。,汇编语言源程序的格式,12,汇编语言源程序的格式,三、指示性语句指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。格式:,名字/变量命令参数;注释项,命令:指示汇编程序进行某种汇编操作参数:汇编操作有关的数据,13,汇编语言源程序的格式,3.2.2常量、标识符和表达式,1、常量:数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号括起来的ASCII字符其值是该字符的ASCII代码值。例:MOVAX,A;AX=41H符号常量是用符号定义的常量。例:采用符号定义语句PORTAEQU80HMOVAL,PORTA与指令MOVAL,80H等价,14,标识符可用作符号常量、名字、变量和标号等。组成标识符有如下规定:组成标识符的字符有:大写字母:AZ;文小写字母:az;数字09;字符?、_、$;字符长度不超过3l个;首字符不能是数字;?不能单独作为一个标识符;不能把保留字用作标识符,保留字包括助记符、寄存器名等。,2、标识符,汇编语言源程序的格式,15,3、表达式由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。,汇编语言源程序的格式,数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式,16,表达式中的运算符:,17,汇编语言源程序的格式,3.2.3指示性语句(5条),程序开始和结束语句段定义语句过程定义语句数据定义语句符号定义语句,18,(1)给程序模块命名NAME命令格式:NAME名字名字是程序员按标识符规定所取的程序模块名。(2)标题命名语句TITLE命令格式:TITLE名字名字作为每页标题打印出来,标题名字符不大于60个(3)程序结束END命令格式:END标号标号指示程序开始执行的起始地址的标号。,1、程序开始和结束语句,汇编语言源程序的格式,19,说明:如果程序中没有NAME伪指令,可使用TITLE伪指令。程序中既无NAME也无TITLE伪指令,汇编程序将用源程序名作为模块名。一般情况下使用TITLE伪指令,可在列表文件中能打印出来END伪指令中,如果程序中第一句指令性语句有标号,则END语句的标号应与其相同否则可无标号。,汇编语言源程序的格式,20,2、段定义伪指令存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。,汇编语言源程序的格式,21,(1)段定义伪指令SEGMENT格式:段名SEGMENT定位类型组合类型类别段名ENDS,段名由程序员定义,汇编时由系统为该段分配一个段基值。参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。,汇编语言源程序的格式,22,一般情况下,定位类型、组合类型和类别说明可以不用。,注意:SEGMENT和ENDS语句必须成对使用。,例:定义一数据段DATADATASEGMENTADB1234BDW12HDATAENDS,汇编语言源程序的格式,23,(2)偏移地址定位语句ORG,格式:ORG数值表达式功能:指定在它之后的程序段或数据块所存放的起始地址的偏移量。,无ORG语句时,段偏移地址从0000H开始。,例.DATASEGMENTORG100HXDB12HYDW?ZDD1122HDATAENDS,$,$表示汇编地址计数器的当前值,汇编语言源程序的格式,24,(3)指定段址伪指令,格式:ASSUME段寄存器:段名,段寄存器:段名,.功能:指明段和段寄存储器的对应关系,且段名必须是由SEGMENT定义的段名。,说明:ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。ASSUME指令必须跟在SEGMENT语句之后。,汇编语言源程序的格式,25,例:DATASEGMENTXDB12HDATAENDSSTACKSEGMENTDW100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXCODEENDS,汇编语言源程序的格式,26,3.过程定义伪指令,格式为:过程名PROCNEAR/FARRET过程名ENDP功能:过程定义伪指令用于定义子程序。段内调用使用NEAR属性,段间调用使用FAR属性。省略为NEAR,汇编语言源程序的格式,27,CODESEGMENTCOUNTPROCNEARADDCX,1RETCOUNTENDPSTART:MOVAX,100CALLCOUNTCALLCOUNTHLTCODEENDSENDSTART,COUNTPROCERET,子程序:,汇编语言源程序的格式,28,4.数据定义伪指令格式:变量名数据定义伪指令操作数项表功能:定义数据存储区,其类型由伪指令指定。,数据定义伪指令常用的有以下五种:变量名DB操作数项表;定义字节变量名DW操作数项表;定义字变量名DD操作数项表;定义双字变量名DQ操作数项表;定义8个字节变量名DT操作数项表;定义10个字节,操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。,汇编语言源程序的格式,29,给变量赋初值或指定变量类型例:COUNTDB100ARRAYDW-1,1024,汇编语言源程序的格式,30,定义一个ASC码的字符串,为字符串的每个字符分配一个存储单元,并从左到右将字符的ASC码按地址递增顺序存放在内存中。,例1:STRDBABCD例2:STR1DWAB,汇编语言源程序的格式,31,用?号预留内存单元例:SUB1DB?;预留一个字节单元RESUDW?;预留二个字节单元,汇编语言源程序的格式,32,用DUP重复因子初始化一个数据区格式:NDUP(表达式),例1:DA1DB2DUP(0)DA2DB2DUP(AB)DA3DW2DUP(1),例2:DUP的嵌套使用DATADB10DUP(10DUP(0)定义了100个字节全部初始化为0。,重复次数重复装入的内容,?、数值、数值表达式字符等,汇编语言源程序的格式,33,汇编语言源程序的格式,5、符号定义语句,(1)EQU赋值伪指令格式:变量名EQU表达式功能:将右边表达式的值赋给左边的变量。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。,例:PORT1EQU100;符号PORT1代表常数100CONTEQUCX;为CX重新命名ABDREQUPORT1+1ABCEQUDAA注:同一程序中,不能重复定义,34,(2)=等号伪指令格式:符号名=表达式功能:与EQU基本相同,两者的区别在于“=”伪指令可对同一标识符作重新定义。,例:EMP=12;定义EMP等于12EMP=EMP+1可以对同一个符号名重复定义。,汇编语言源程序的格式,35,(3)PURGE命令格式:PUREG名字功能:用来撤消已定义的符号常量。可同时撤消几个己定义的名字例3-10:COUNTEQU20MOVAL,COUNTPURGECOUNTCOUNTEQU10MOVBL,COUNT,汇编语言源程序的格式,36,(1)名字名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。段命在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。例:MOVAX,DATAMOVDS,AX,6、名字与变量,汇编语言源程序的格式,37,过程名在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有NEAR和FAR之分。符号常量由符号定义语句EQU、=来定义,对符号常量给以赋值。例3-13,汇编语言源程序的格式,38,(2)变量变量的定义和属性变量由数据定义语句DB/DW/DD/DQ/DT来定义变量有三属性:段属性、偏移属性和类型属性:段属性表示变量所在段的起始地址。偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为BYTE,长度为2B的变量,类型为WORD等。,汇编语言源程序的格式,39,分析运算符(5个)用于把变量的三个属性分别取出来作为操作数。,OFFSET取偏移地址操作符格式:OFFSET变量或标号功能:返回该变量或标号在其段内的偏移地址。,例:MOVSI,OFFSETBUF将BUF在数据段内的偏移地址作为立即数送到SI中。,汇编语言源程序的格式,40,SEG取段址操作符。格式:SEG变量或标号功能:返回变量或标号所在段的段基址。例:MOVAX,SEGBUF,汇编语言源程序的格式,41,TYPE取类型操作符格式:TYPE变量或标号功能:当TYPE置于变量前面时,返回变量的类型数字。即DB为1,DW为2,DD为4,DT为10。当TYPE置于标号前面时,返回标号的类型属性值;当该标号为NEAR属性时,返回值为1,标号为FAR属性时,返回值为2。,例:数据段中有如下定义:DATADW75H,134H。执行:ADDSI,TYPEDATA。该语句在汇编后相当于指令ADDSI,2。,汇编语言源程序的格式,42,取变量所含的数据存储单元个数操作符LENGTH格式:LENGTH变量功能:只对变量起作用,取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如为重复子句“nDUP(表达式)”,返回外层重复因子n,其他形式的表达式,则返回1。,汇编语言源程序的格式,43,MOVAL,LENGTHA1MOVCX,LENGTHA2MOVBX,LENGTHA3MOVDX,LENGTHA4,汇编后相当于指令:MOVAL,1MOVCX,10MOVBX,1MOVDX,5,例:DATASEGMENTA1DBABCD,5DUP(0)A2DW10DUP(1),1234HA3DW10,20DUP(?)A4DW5DUP(3DUP(2),5)DATAENDS,汇编语言源程序的格式,44,取变量所含的数据存储区大小操作符SIZE格式:SIZE变量功能:汇编程序用该操作符返回的值表示该变量所分配的总字节数。例:A2DW10DUP(1),1234HMOVCX,SIZEA2汇编后相当于有指令:MOVCX,14H,汇编语言源程序的格式,SIZE=LENGTHTYPE,45,合成运算符,属性定义操作符PTR格式:类型PTR地址表达式功能:PTR操作符的作用是将地址表达式的原类型属性临时修改成PTR操作符前面所指定的类型。指定的类型可以是BYTE、WORD或DWORD。,可用来指定内存操作数的类型例:MOVBYTEPTRSI,20H;占一个字节或MOVWORDPTRSI,20H;占两个字节,汇编语言源程序的格式,46,用于临时改变变量或标号的类型属性例如:BUFWDW1234H,5678HMOVAX,BUFWMOVAL,BYTEPTRBUFW可用EQU和PTR定义一个新的变量例如:BUFWDW1234H,5678HBUFBEQUBYTEPTRBUFW则MOVAX,BUFW和MOVAL,BUFB都是合法的。,汇编语言源程序的格式,47,格式:标号:操作码操作数,操作数;注释一、标号标号是一条指令在内存中的符号地址。标号一定要用:结束。标号具有三种属性:段属性:表示标号所在段的段基值格式:SEG标号,3.2.4指令型语句,汇编语言源程序的格式,48,汇编语言源程序的格式,偏移量属性:表示标号所在位置的偏移地址格式:OFFSET标号类型属性:表示标号所在指令是允许段内跳转还是段间跳转格式:TYPE标号当标号的属性为NEAR属性时,TYPE=-1。当标号的属性为FAR属性时,TYPE=-2。,49,操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如:MOVAX,DATA;DATA是段名MOVCX,COUNT;COUNT是符号常量MOVBL,BUFFER;BUFFER是变量MOVSI,OFFSETARRAY;OFFSETARRAY是属;性表达式CALLSBRT1;SBRT1是过程名JMPDONE;DONE是标号,2、操作数,汇编语言源程序的格式,50,宏定义:格式:宏指令名MACRO形式参数表ENDM宏调用:格式:宏指令名实际参数,,宏指令体,宏指令源程序中一个能多次可重复使用的具有独立功能的代码段。,1、宏指令的定义和使用宏指令的使用过程有宏定义、宏调用、宏展开。,3.2.5宏指令,汇编语言源程序的格式,51,例:完成AX的内容乘以2X的宏定义及宏调用定义宏:MULXMACROPX形式参数宏指令名MOVCL,PXSALAX,CLENDM,宏调用:MULX2;MULX4;MULX5;,实际参数,AX(AX)*22,AX(AX)*24,AX(AX)*25,汇编语言源程序的格式,52,宏调用:MULT120,BL,SAVE,宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指令所在的位置,并用实际参数代替形式参数。,例:两数相乘,返回积。宏定义:MULTMACROOPR1,OPR2,RESULTMOVAL,OPR1IMULOPR2MOVRESULT,AXENDM,MOVAL,120IMULBLMOVSAVE,AX,汇编语言源程序的格式,53,2、宏指令与子程序(过程)的区别:宏指令调用无返回地址,执行速度略快。通过形参、实参结合传递函数宏指令不能压缩目标代码长度,占用内存较子程大。,汇编语言源程序的格式,54,3.3.1概述3.3.2顺序程序3.3.3分支程序3.3.4循环程序3.3.5子程序3.3.6汇编语言程序举例3.3.7系统功能调用,3.3汇编语言程序设计基础,55,3.3.7常用的DOS与BIOS中断功能调用,1.DOS中断DOS除了给用户提供了命令行服务以外,还为汇编语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为DOS功能调用。,一、DOS中断与系统功能调用,56,DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令INT进行调用。,随着DOS的发展,所提供的功能(子程序)越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。,常用的DOS与BIOS中断功能调用,57,2.DOS系统功能调用(1)DOS功能调用的方法设置入口参数,如果所调用的子程序不需参数,则可省略此步。欲调用的子程序编号AH。发中断调用指令INT21H。,常用的DOS与BIOS中断功能调用,58,(2)DOS基本I/O功能调用01功能键盘输入入口参数:无出口参数:所读取的字符ASCII码在AL内。,功能:扫描键盘,若有按键按下,将字符ASCII码放入AL中,同时在屏幕上显示这个字符,然后返回。若无键按下,该调用等待直到有键按下为止。,例:MOVAH,01INT21H,常用的DOS与BIOS中断功能调用,59,08功能键盘输入。入口参数:无出口参数:所读取的字符ASCII码在AL内。功能:同01号类似,但是不在屏幕上显示输入的字符,在读取密码时常用本功能。,例:MOVAH,08INT21H,常用的DOS与BIOS中断功能调用,60,10号功能字符串输入入口参数:DS:DX指向输入缓冲区。输入缓冲区具有如下格式:第一个字节:指明准备接收的最大字符数,包括回车符。第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数(不包括最后的回车符)。用户输入的字符串从第三个单元开始存放出口参数:用户实际输入字符个数在缓冲区第二个单元中,常用的DOS与BIOS中断功能调用,61,DATASEGMENTBUFDB8;指明最大字符数DB?;保留,供DOS填入实际字符数DB8DUP(?);用户输入的字符存放区DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETBUFMOVAH,10INT21H;其他操作MOVAH,4CHINT21HCODEEND,常用的DOS与BIOS中断功能调用,62,02H功能显示字符(一个字符)调用方法:DL要显示的字符或其ASC代码AH02HINT21H注:如果字符是控制符,则实际执行相应的功能。例:在屏幕上显示一个换行符(0AH)MOVDL,0AHMOVAH,02INT21H;实际上将光标转到下一行上去。,常用的DOS与BIOS中断功能调用,63,09H功能字符串输出显示调用方法:DX要显示的字符串首地址AH09H(调用号)INT21H注:预先将字符串存放于DX表示的首地址区域,字符串必须以“$”作为结束符,常用的DOS与BIOS中断功能调用,64,4CH功能终止当前程序并返回操作系统。调用方法:MOVAH,4CHINT21H,常用的DOS与BIOS中断功能调用,65,例:编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。程序如下:,DATASEGMENTMESSAGEDBPLEASEINPUTASTRING:$;定义输入提示BUFDB10,?,10DUP(?)DATAENDS,MOVDX,OFFSETMESSAGEMOVAH,9INT21H;显示输入提示信息,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,DOS功能调用举例,66,MOVDX,OFFSETBUFMOVAH,10INT21H;接收用户输入,MOVAH,4CHINT21HCODEENDSENDSTART,MOVDX,OFFSETBUF+2;用户实际输入字符起始处DXMOVAH,9INT21H;显示用户输入的字符,MOVBL,BUF+1;用户实际输入字符数BLMOVBH,0;将BX高8位清0,使BX=用户实际输入字符数MOVBYTEPTRBUF+2BX,$;在用户输入的字符结束处放置一个“$”,MOVAH,2MOVDL,0AH;0AH为换行符ASCII码INT21H;屏幕换行,DOS功能调用举例,67,3.3.1概述程序:是完成特定功能的一组指令的有序集合一、程序设计的步骤分析课题确定算法画流程图编写程序上机调试、修改,二、程序的基本结构顺序结构、分支结构、循环结构和子程序结构。,汇编语言程序设计基础,68,3.3.2顺序程序设计程序有3种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计。特点:这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。硬件支持是IP自动加1,从内存取出一个指令字节,IP自动加1。,顺序程序设计,69,例3-17查表求平方值,程序分析:(1)在内存中建平方表TABL;在XX单元放置015的数;在YY单元预留存储平方值的单元。(2)计算表启始地址的偏移量(3)计算所查数值在表中的偏移地址,从该地址取出单元的内容送YY单元。,70,DATASEGMENTTABLDB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225XXDBX;X为015的正整数YYDB?DATAENDSSTACKSEGMENTPARASTACKSTACKDB50DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,顺序程序设计举例,例3-17查表求平方值,71,BEGIN:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLMOVAH,0MOVAL,XXADDBX,AXMOVAL,BXMOVYY,ALMOVAH,4CHINT21HCODEENDSENDBEGIN,顺序程序设计举例,72,例31:从键盘输入两个一位数,在屏幕显示它们的积。程序分析:(1)从键盘上输入两个数,调用DOS01功能。(2)把AL中的ASCII码转换为数值。(3)两数相乘,把积用ASCII码表示。(除10)(4)把积显示在屏幕上,调用02功能。,顺序程序设计举例,73,CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,1INT21HMOVBL,ALINT21HSUBAL,30HSUBBL,30HMULBLMOVBL,10DIVBL,顺序程序设计举例,74,ADDAX,3030HMOVBX,AXMOVDL,BLMOVAH,02HINT21HMOVDL,BHINT21HMOVAH,4CHINT21HCODEENDSENDBEGIN,顺序程序设计举例,75,例:字节存储单元DAT中有2位数据为65H,要求将该数据显示到屏幕上。,DATASEGMENTDATDB65HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,DATMOVBL,DL;暂存至AL寄存器MOVCL,4SHRDL,CLADDDL,30H;高位十六进制数据6转换为ASCII码MOVAH,02HINT21H;显示MOVDL,BLANDDL,0FHORDL,30H;低位十六进制数据5转换为ASCII码INT21H;显示MOVAH,4CHINT21HCODEENDSENDSTART,76,1.分支程序二要素(1)判断:运算结果的状态标志CF,PF,ZF,SF,OF;(2)转移:主要是条件转移指令Jcc单标志位判断JC,JZ,JO,JP,JS,JAE等;多标志位判断JA,JG,JGE等。,3.3.3分支结构程序,分支结构程序,77,分支结构程序,2.采用比较指令和转移指令实现分支CMPDest,src;Dest-srcJcc标号,78,例:在字节存储单元X、Y中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示XY或XY。,分析:用CMP指令比较两个无符号数大小,根据其对标志位的影响用无符号条件转移指令实现转移。1、比大小:XAL,比较AL与Y的大小。2、调用02功能显示比较结果。,分支结构程序举例,79,DATASEGMENTXDB98HYDB0A0HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPY,AL;比较JAYGX;Y大于X则转YGEXMOVAL,JMPDISP,分支结构程序举例,80,YGX:MOVAL,DISP:MOVDL,X;显示比较结果MOVAH,2INT21HMOVDL,ALINT21HMOVDL,YINT21HMOVAH,4CHINT21HCODEENDSENDSTART,分支结构程序举例,81,例3-20:数据块传送程序,程序分析:(1)用字符串传送指令MOVSB实现数据块传送。目的串偏移地址送DI,源串偏移地址送SI。(2)如何判断源数据块与目的数据块是否有交叠:两数据块不交叠的条件是:源数据块末地址目的数据块首地址不重叠DF置0,重叠从末地址开始传送DF置1,分支结构程序举例,82,DATASEGMENTSTRGDB1000DUP(?)STG1EQUSTRG+7STG2EQUSTRG+25STRSEEQU50DATAENDSSTACKSEGMENTPARASTACKSTACKSTARNDB100DUP(?)STACKENDS,例3-20:数据块传送程序,分支结构程序举例,83,COSEGSEGMENTASSUMECS:COSEG,DS:DATA,ES:DATA,SS:STACKMOVAX,DATAMOVDS,AXMOVES,AXMOVCX,STRSEMOVSI,OFFSETSTG1MOVDI,OFFSETSTG2CLDPUSHSIADDSI,STRSE1,分支结构程序举例,84,CMPSI,DIPOPSIJBOKSTD;减量方式传送ADDDI,STRSE1;指向数据块底部ADDSI,STRSE1OK:REPMOVSB;重复传送50个数据MOVAH,4CHINT21HCODEENDSENDBEGIN,分支结构程序举例,85,在内存中连续存放的一系列跳转地址、跳转指令或关键字组成一个决定程序分支的跳转表。主要问题是计算表地址表地址=表基地址+偏移量,3、利用跳转表实现分支,分支结构程序举例,86,例3-21:某工厂有8种产品的加工程序R0R7,分别放在以SBR0、SBR1SBR7为首地址的内存区域中,8个地址的偏移地址放在以BASE为首地址的跳转表内。,跳转地址组成的跳转表:,分支结构程序举例,87,DATASEGMENTBASEDWSBR0,SBR1,SBR2,SBR3DWSBR4,SBR5,SBR6,SBR7BNDBX;X为07之间的正整数DATAENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,BN,分支结构程序举例,88,MOVAH,0ADDAL,ALMOVBX,OFFSETBASEADDBX,AXMOVAX,BXJMPAXMOVAL,4CHINT21HCODEGENDSENDBEGIN,分支结构程序举例,89,3.3.4循环结构程序,在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。,1、循环程序的结构循环程序一般由4部分构成:,循环结构程序,90,(1)初始化部分为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。(2)循环工作部分是循环结构的主体。,(3)参数调整部分地址指针或循环次数的修改等,以便继续循环。,(4)循环控制部分循环条件的检查,以判断是否继续循环。,循环结构程序,91,(a)先工作后判断循环条件,(b)先判断循环条件后工作,循环结构程序,2、循环程序结构,92,DATASEGMENTTABLEDWa1,a2,a3,a4,a5,a6,a7,a8,a9,a10DWa11,a21,.a20.DWa91,a92,a100YYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AX,3、循环程序举例,i=1,2,100,例3-23计算Y=,循环结构程序,93,MOVAX,0MOVBX,OFFSETTABLMOVCX,100LOP:ADDAX,BXINCBXINCBXDECCXJNZLOPMOVYY,AXMOVAH,4CHINT21HCODEDEGMENTENDBEGIN,循环结构程序,94,例3-4统计数组中负元素的个数分析:(1)在数据段中放入若干个带符号数,并计算个数。(2)设计一个计数器(2)从数据段中取数并判断是否负数,若是计数器加1。设计成循环程序。初始化:计数器清0,用OFFSET取偏移地址,置循环次数。与0相比,用带符号跳转指令JGE判正负,满足条件,计数器加1,修改参数。否则直接修改参数。,循环结构程序,95,数据块的定义如下:DATASEGMENTD1DB-1,-3,5,6,-9;定义数组COUNTEQU$-D1RSDW?;存放负数个数DATAENDS,循环结构程序,96,代码段程序为:CODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVBX,OFFSETD1;建立数据指针MOVCX,COUNT;设置计数器初值MOVDX,0;设置结果初值,循环结构程序,97,LOP1:MOVAL,BXCMPAL,0JGEJUSINCDXJUS:INCBXDECCXJNZLOP1;或LOOPLOP1MOVRS,DXMOVAH,4CHINT21HCODESEGMENTENDBEGIN,98,MOVCX,0LOP:ANDAX,AXJZSTPSALAX,1JNCLOPINCCXJMPLOPSTP:HLT这是一个”先判断后执行“的结构。,例3-25统计寄存器AX中1的个数,循环结构程序,99,3.3.5子程序定义及结构一、概述1、子程序结构(1)结构:子程序的第一条语句前有过程名入口地址的符号表示出口是返回指令RET。(2)调用与返回:主程序用CALL指令调用子程序,子程序用RET指令返回主程序(3)子程序文件:子程序说明与子程序清单。,子程序定义及结构,100,子程序说明:功能描述:包括子程序名称、功能以及性能指标(如执行时间)等;所用寄存器和存储单元;子程序的入口、出口参数;子程序中又调用的其它子程序;调用实例(可无)。,子程序定义及结构,101,主程序与子程序的连接寄存器和工作单元中内容的保护,即保护现场,用PUSH指令和POP指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。参数的传递,即主程序如何把入口参数带入子程序,子程序又如何把出口参数带回主程序。,子程序应用中应注意的问题:,子程序定义及结构,102,主程序名为MAIN,子程序名为SUM。采用堆栈传递参数,即主程序把参数压入栈,子程序出栈。(1)在存储器中开辟一个20个字的堆栈段,并计算栈顶偏移地址:STACKSEGMENTPARASTACKSPAEDW20DUP(?)TOPEQULENGTHSPAESTACKENDS,例3-28求数组之和,子程序定义及结构,103,DATASEGMENTARY1DB100DUP(?)SUM1DW?ARY2DB150DUP(?)SUM2DW?COUNT1EQUSUM1-ARY1COUNT2EQUSUM2-ARY2DATAENDS,(2)在内存数据段中放置两个数组ARY1,ARY2,预留求和单元并计算数组的长度。,子程序定义及结构,104,定义代码段:MAINSEGMENTASSUMECS:MAIN,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX传递参数调用子程序:MOVAX,SIZEARY1PUSHAXMOVAX,OFFSETARY1PUSHAXCALLSUM,(3)数据求和主程序,子程序定义及结构,105,MOVAX,SIZEARY2PUSHAXMOVAX,OFFSETARY2PUSHAXCALLSUMHLTMAINENDSENDSTR,子程序定义及结构,106,求数组之和,定义子程序代码段并保护现场:PROCESEGMENTASSUMECS:PROCE,DS:DATA,SS:STACKSUMPROCFARPUSHAXPUSHBXPUSHCXPUSHBPPUSHFMOVBP,SP,(4)求和子程序,子程序定义及结构,107,通过堆栈传递数组的个数和偏移地址:MOVCX,BP+16MOVBX,BP+14数组求和:MOVAX,0ADN:ADDAL,BXINCBXADCAH,0LOOPANDMOVBX,AX,子程序定义及结构,108,恢复现场返回主程序:POPFPOPBPPOPCXPOPBXPOPAXRETSUMENDPRPOCEENDS,子程序定义及结构,109,汇编语言程序举例,3.2.6汇编语言程序举例,例3-30将ASCII码表示的两位十进制数转换成一字节二进制数。(37H,39H),分析:39H是个位,用减法指令SUB减30即可得。37H是十位,70=7X(23+2)可得。把所得的十位和个位数相加即可。,110,DATASEGMENTASDECDB37H,39HBINDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,(1)定义数据段和代码段:,汇编语言程序举例,111,MOVSI,OFFSETASDECMOVAL,SI;取第一个数(十位数)SUBAL,30H;十进制数ASCIISALAL,1;乘2MOVBL,AL;BL=7X2MOVCL,2SALAL,CL;7X23ADDBL,AL;7X2+7X23=70,(2)取第一个数并转为2进制数方法:37H07H70=7X(23+2)+(39H09H),汇编语言程序举例,112,INCSIMOVAL,SI;取第二个数(个位数)SUBAL,30H;二进制数ASCADDAL,BL;十位数+个位数MOVBIN,AL;存入BINMOVAH,4CHINT21HCODEENDSENDSTART,(3)取第二个数,ASCII二进制数,两数相加。,汇编语言程序举例,113,算法:二进制十进制ASCII。二进制十进制:二进制数反复减100,够减计数器加1,直到不够减为止。计数器中的数就是100的个数,即百位数。十位数相同。最后一次的结果(差)为负,要加10以恢复原值,这就是个位数。然后将这三个数(百、十、个)转换成ASCII码。,例3-32将一字节二进制数转换成三位ASCII码表示的十进制数。,汇编语言程序举例,114,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,(1)定义数据段,把需转换的数放入内存BIN单元,DATASEGMENTBINDB01111111BASDECDB3DUP(?)DATAENDS,(2)、定义代码段,并初始化,汇编语言程序举例,115,MOVDI,OFFSETASDECMOVAL,BIN,(3)取需转换的数送AL中,(4)求二进制数所含十进制数百位数的个数,MOVBL,0AGAIN1:SUBAL,100JBNEXT1INCBLJMPAGAIN1NEXT1:ADDAL,100,汇编语言程序举例,116,MOVAH,0AGAIN2:SUBAL,10JBNEXTINCAHJMPAGAIN2NEXT:ADDAL,10,(4)求十位数的个数,(5)把百、十、个位数转换为ASCII码,ADDBL,30HADDAH,30HADDAL,30H,汇编语言程序举例,117,MOVDI,BLINCDIMOVDI,AHINCDIMOVDI,AL,(6)把转换好的ASCII码送存储器中,MOVAH,4CHINT21HCODEENDSENDSTART,(7)程序结束,汇编语言程序举例,118,有一个若干个字节的数据表,存放在数据段中,首地址为TAB,表内各数已按升序排列好。今给定一关键字,试编程从表内查找该关键字,若有,则结束;若无,将该关键字顺序插入表中,并修改表长(表长在LTH中)。算法:将给定关键字依次同数据表中的数据比较,若大于表中的数据,则继续同下一个数据比较,若小于表中数据,则先将从该数据开始的数据全部下移一个地址,然后将关键字插入表中空格,并将表长数加1。,例3-36查找,汇编语言程序举例,119,(1)在数据段中放置数据表及需查找的数据并计算表长,DATASEGMENTTABDB0FH,12H,14H,TEMDB57HLTHEQUTEM-TABDATAENDS,(2)定义代码段并初始化,CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AX,汇编语言程序举例,120,(3)循环初始化(取偏移地址、次数,取需查找的字),MOVBX,OFFSETTABMOVCX,LTHMOVAL,TEM,(4)用循环程序实现查找关键字,LOP:CMPAL,BXJESOPJLINSTINCBXLOOPLOPJMPJUST,汇编语言程序举例,121,(4)把关键字插入表中(插入位置后的数据依次后移),INST:MOVDI,OFFSETTABSTDADDDI,LTHMOVSI,DIDECSIREPMOVSB,(5)把关键字按顺序插入数据表中并修改表长,JUST:MOVBX,ALINCLTH,(6)程序结束,SOP:MOVAH,4CHINT21HCODEENDSENDSTART,汇编语言程序举例,122,汇编语言程序举例,123,ThankYou!,
展开阅读全文