




已阅读5页,还剩83页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-1,1,第三章汇编语言程序设计,3.2伪指令语句,3.3汇编语言程序设计入门,3.1汇编语言的基本语法,-2,2,3.1汇编语言的基本语法,3.1.1汇编语言源程序结构3.1.2汇编语言的语句格式3.1.3汇编语言的数据3.1.4表达式与运算符,-3,3,3.1.1汇编语言源程序结构,80X86/Pentium系列MPU汇编语言都是以逻辑段为基础,按段的概念来组织代码和数据的。因此,源程序结构与逻辑段的定义方法密切相关,而宏汇编语言MASM5.0以上的版本中,逻辑段既可用完整段定义,又可用简化段定义。,-4,4,1.标准的单模块源程序框架,.586DATASEGMENTUSE16/USE32;定义数据段;数据定义伪指令序列DATAENDSSTACKSEGMENTUSE16/USE32STACK;定义堆栈段;数据定义伪指令序列STACKENDSCODESEGMENTUSE16/USE32;定义代码段ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOVAX,DATA;取数据段基址MOVDS,AX;建立DS的可寻址性MOVES,AX;建立ES段的可寻址性;核心程序段MOVAH,4CH;返回DOS操作系统INT21HCODEENDSENDSTART,一个源程序由若干逻辑段组成。一般一个源程序具有数据段、附加数据段、堆栈段和代码段;但只有代码段是必不可少的。,3.1.1汇编语言源程序结构,-5,5,3.1.1汇编语言源程序结构,(1)使用DOS的4CH号功能调用这种方法是在代码段结束前加调用语句:MOVAH,4CH;功能号4CHAHINT21H;中断调用,(2)使用20H号软功能调用调用方式是在代码段结束前加调用语句:INT20H,(3)使用DOS的0号功能调用调用方式是在代码段结束前加调用语句:MOVAH,0INT21H,2.返回DOS状态的方法,-6,6,(4)将主程序定义为远过程,也称为“标准序”方法。这种方法是在代码段开始处按下述方式定义主程序:CODESEGMENTASSUME主过程名PROCFARPUSHDSSUBAX,AX;标准序PUSHAXRET主过程名ENDPEND主过程名,3.1.1汇编语言源程序结构,-7,7,3.1.2汇编语言的语句格式,1.语句种类,指令语句是可执行语句,由硬件(CPU)完成其功能,汇编时产生目标代码。,伪指令语句不可执行语句,其功能由相应软件完成,不产生目标代码。,宏指令语句用户定义的新指令,汇编时产生相应的目标代码。,-8,8,3.1.2汇编语言的语句格式,指令语句:标号:助记符操作数;注释伪指令语句:名字定义符操作数;注释,标号和名字分别是给指令单元和伪指令起的符号名称,统称为标识符。(注意组成的语法规则),助记符和定义符分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,统称操作符。,2.语句格式,-9,9,操作数,3.1.2汇编语言的语句格式,操作数允许有多个,这时各操作数之间要用逗号“,”隔开。,伪指令语句中操作数的格式和含义则随伪操作命令不同而不同,有时是常量或数值表达式,有时是一般意义的符号(如变量名、标号名、常数符号等),有时是具有特殊意义的符号(如指令助记符、寄存器名等)。,指令语句中的操作数提供该指令的操作对象,并说明要处理的数据存放在什么位置以及如何访问它,它可以是常量操作数、寄存器操作数、存储器操作数和表达式。,-10,10,3.1.3汇编语言的数据,汇编语言中使用的数据有常数、变量和标号。,1.常数常数是指那些在汇编过程中已有确定数值的量,分为数值常数和字符串常数两类。主要用作:,指令语句中的立即操作数,基址、变址或基址加变址寻址中的位移量,伪指令语句中用于给变量赋初值,-11,11,3.1.3汇编语言的数据,标号是指令的符号化地址,一定在代码段,而变量是数据的符号化地址,一般在数据段,有时也可在代码段定义。,变量与标号有三个共同属性:,段基址:所在段的起始地址(SEG),偏移值:相对于段基址的位移量(OFFSET),类型:所占字节数(TYPE),2.变量与标号,-12,12,3.1.3汇编语言的数据,(1)标号可以用作转移控制类指令的操作数,但变量不能。,(2)变量可以用作基址、变址或基址加变址寻址的位移量,但标号不能。,变量与标号区别,-13,13,例3.1假设VAR1和VAR2为字变量,LAB为程序中的一个标号,判断下列指令是否正确,若错误请指出错误之处:,ADDVAR1,VAR2SUBAL,VAR1JNZVAR1JMPLABSIJMPNEARLABMOVAX,VAR1BXJMPVAR2BX,3.1.3汇编语言的数据,错,不允许存储器变量间直接传数,错,源与目的操作数类型不一致,错,变量不能用作条件转移指令的操作数,错,标号不能用作变址寻址的位移量,错,缺PTR运算符,正确,正确,-14,14,3.1.4表达式与运算符,表达式由运算符和运算对象组成。,-15,15,数值表达式指在汇编过程中能够由汇编程序计算出数值的表达式。可作为指令中的立即操作数和数据区中的初值使用。例如:MOVBX,0FFF0HAND0B234HMOVAL,4CHEQ2MOVAH,4CHGT1MOVAX,SEGLABLE,3.1.4表达式与运算符,表达式是汇编语句操作数的基本形式,分为数值表达式和地址表达式。,-16,16,3.1.4表达式与运算符,地址表达式其值表示存储器地址,一般都是段内的偏移地址。与变量一样,地址表达式也具有段值、偏移值和类型属性。地址表达式主要用来表示指令语句中的操作数,例如:MOVAX,BASEEAXEBXJMPBASEEAXLEABX,BASE+12,-17,17,3.2.1方式选择伪指令3.2.2逻辑段定义伪指令3.2.3数据伪指令语句3.2.4模块定义伪指令3.2.5过程与宏定义伪指令3.2.6结构定义伪指令,3.2伪指令语句,-18,18,3.2.1方式选择伪指令,方式选择伪指令用于通知汇编程序,当前的源程序指令是哪一种CPU指令,经过汇编链接之后生成的目标程序在哪一种CPU机型上运行。不属于选定CPU的指令均为非法指令。所以,方式选择伪指令本质上也就是指令集选择伪指令。通常,方式选择伪指令放在程序的头部,作为源程序的第一条语句。缺省时默认8086指令集。,-19,19,3.3.2逻辑段定义伪指令,1.完整段定义伪指令,80X86/Pentium系列微处理器汇编语言有两种逻辑段定义方法:完整段和简化段定义,采用完整段定义伪指令可具体控制汇编程序(MASM)和链接程序(LINK)在内存中组织代码和数据的方式。主要包括段定义语句和段寄存器说明语句。,-20,20,3.3.2逻辑段定义伪指令,格式:段名SEGMENT定位类型,组合类型,字长选择,类别段体;由指令、伪指令和宏指令语句组成段名ENDS,段定义语句,说明:(1)SEGMENT/ENDS是一对段定义语句,一个逻辑段从SEGMENT语句开始,到ENDS语句结束。,(2)段名是用户定义的段的标识符,用于指明段的基址。,(3)4个可选参数用于为源程序的汇编、连接提供必要的信息,特别是模块化程序,各个模块如何定位,彼此之间如何连接,将较多地涉及到定位类型和组合类型的选择。,-21,21,3.3.2逻辑段定义伪指令,举例:,模块2(从模块):DSEGSEGMENTCOMMONARRAY_BDW200DUP(?)DSEGENDSSSEGSEGMENTSTACKDW50DUP(?)SSEGENDSCSEGSEGMENTPUBLICCSEGENDSEND,模块1(主模块):DSEGSEGMENTCOMMONARRAY_ADW100DUP(?)DSEGENDSSSEGSEGMENTSTACKDW50DUP(?)SSEGENDSCSEGSEGMENTPUBLICASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXCSEGENDSENDSTART,-22,22,段寄存器说明语句,格式:ASSUME段寄存器:段名,段寄存器:段名,,功能:说明源程序中定义的段由那个段寄存器去寻址。,说明:CS只能用于包含有程序的段,反之含有程序的段也只能以CS作为段寄存器。SS也一样,只能与堆栈段对应。,CS所对应的段名必须在该语句之前有定义。,该语句是说明性语句。,3.3.2逻辑段定义伪指令,-23,23,简化段有利于实现汇编语言程序模块与Microsoft高级语言程序模块的连接,它可以由操作系统自动安排段序,自动保证名字定义的一致性。但是命令文件(.COM)的编程不能使用简化段定义。,段次序语句(DOSSEG)内存模式语句(.MODEL)段语句,简化段定义有三种语句:,3.3.2逻辑段定义伪指令,2.简化段定义伪指令,-24,24,使用简化段定义的独立汇编语言源程序框架:DOSSEG.MODELSMALL.STACK长度.DATA;数据语句.CODE启动标号:MOVAX,DATA;或MOVAX,DGROUPMOVDS,AX;可执行语句MOVAH,4CH;返回DOSINT21HEND启动标号,3.3.2逻辑段定义伪指令,-25,25,3.2.3数据伪指令语句,格式:,赋值语句:符号名EQU表达式,功能:都是用符号名代替表达式的值。但赋值语句定义的符号名不能重新定义,而等号语句允许。,1.符号定义伪指令,等号语句:符号名=表达式,-26,26,例3.2赋值语句与等号语句举例。赋值语句:XEQU50YEQUX+10COUNTEQU$-ARRY等号语句:CON=5BASE=200HBASE=BASE+10H;重新定义BASE,3.2.3数据伪指令语句,-27,27,2.数据定义伪指令,功能:是为数据项或项表分配存储空间,给它们赋初值,并用一个符号名(称为变量)与之相联系。,3.2.3数据伪指令语句,-28,28,使用说明:,给变量赋初值可以是赋确定的值,也可以是赋不确定的值(用“?”表示),还可以是用DUP运算符建立的多次拷贝。,例3.3使用80X86汇编语言的伪操作命令定义:VALDB93DUP(5,2DUP(2DUP(1,2DUP(3),4)则在VAL存储区内前10个字节单元的数据是?,解:由内向外逐层展开,分别相当于:93DUP(5,2DUP(2DUP(1,3,3),4)93DUP(5,2DUP(1,3,3,1,3,3,4)93DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4)即表示重复93个数据序列:5,1,3,3,1,3,3,4,1,3,3,1,3,3,4,3.2.3数据伪指令语句,-29,29,使用SEG、OFFSET、TYPE、LENGTH和SIZE运算符求变量的各种属性时,特别要注意:,对LENGTH运算符,如果变量是用重复数据操作符DUP说明的,则返回外层DUP给定的值;如果没有DUP说明,则返回值总是1。对SIZE运算符有:SIZE=TYPELENGTH,使用说明:,3.2.3数据伪指令语句,-30,30,解:此题有两层DUP定义,但最外层DUP给定的值为100,所以:(BX)=数组ARRAY的偏移地址;(CX)=数组ARRAY的长度=100;(SI)=数组ARRAY的类型=2。,例3.4若数组ARRAY在数据段中已作如下定义:ARRAYDW100DUP(123H,3DUP(?),1234H试指出下列指令执行后,有关寄存器的内容是多少?,MOVBX,OFFSETARRAYMOVCX,LENGTHARRAYMOVSI,0ADDSI,TYPEARRAY,3.2.3数据伪指令语句,-31,31,操作符“$”是取地址计数器的当前值,常用于表达式定义数组长度。,例3.5已知:ORG0100HARYDW3,$+4,5,6CNTEQU$-ARYDB7,8,CNT,9下列指令执行后,AX、BX寄存器的值为多少?MOVAX,ARY+2MOVBX,ARY+10,解:画出数组ARY的内存分配图。,(AX)=ARY+2=0102H=0106H(BX)=ARY+10=010AH=0908H,3.2.3数据伪指令语句,使用说明:,-32,32,使用DB、DW、DD定义串数据(用定义的字符串)时,允许定义的串长度不同,字符的存放顺序也不相同:,DB是从左至右顺序为每个字符分配一个字节单元;DW是从左至右顺序为每2个字符分配一个字单元,且前面的字符在高字节,串长度不能超过2;DD是从左至右顺序为每4个字符分配一个双字单元,也是按前面的字符在高字节顺序存放,串长度不能超过4。,3.2.3数据伪指令语句,-33,33,例3.6今需在变量名为STRING的数据区中顺次存放数据A、B、C、D、E、F、G、H,请写出分别用汇编命令DB、DW和DD实现的语句。,解:用DB、DW和DD实现的语句分别为:STRINGDBABCDEFGHSTRINGDWBA,DC,FE,HGSTRINGDDDCBA,HGFE,3.2.3数据伪指令语句,-34,34,3.2.4模块定义伪指令,模块定义伪指令包括模块开始和模块结束语句。1.模块开始语句(NAME)格式:NAME模块名功能:指示源程序开始,并指出该源程序的模块名。2.模块结束语句(END)格式:END标号/过程名功能:模块结束语句表示源程序到此结束。,-35,35,3.2.5过程与宏定义伪指令,过程定义伪指令宏定义伪指令宏和过程的比较,-36,36,格式:过程名PROC属性;过程体RETRET过程名ENDP,说明:,过程允许嵌套调用,还可以递归调用。,过程与逻辑段也可以相互嵌套,但决不允许过程与段交叉覆盖。,过程又称为子程序。它是一段必须通过CALL指令调用才能执行的程序段,执行完后通过一条RET指令返回原调用处。过程需先定义才能调用。,过程体中必须至少包含一条RET指令,这是过程的出口。但也允许过程有多条RET指令,即过程有多个出口。,1.过程定义伪指令,3.2.5过程与宏定义伪指令,-37,37,宏定义格式:宏名MACRO形式参数表;宏体ENDM,说明:宏定义的宏名必须唯一,称为宏指令。宏指令一经定义就可以在源程序的任何地方调用。相当于由用户给汇编程序提供了一个新的操作码。,宏调用格式:宏名实际参数表,3.2.5过程与宏定义伪指令,宏的概念与过程很相似,也是用一个宏名字来代替源程序中经常要用到的一个程序模块。,2.宏定义伪指令,-38,38,3.2.5过程与宏定义伪指令,使用宏定义和宏调用时要注意两个问题:,对带参数的宏指令,宏调用时实际参数与形式参数的类型要一致,以免产生无效调用。,宏调用是用宏体中定义的指令序列替换宏指令,所以宏体内的标号要用LOCAL伪指令说明为局部标号,以免多次调用宏时,发生标号重复定义错误。,LOCAL伪指令格式:LOCAL标号1,标号2,,-39,39,解:宏定义如下:MOVEMACROSARY,DARYLOCALLPMOVSI,0MOVCX,100LP:MOVAL,SARYSIMOVDARYSI,ALINCSILOOPLPENDM,例3.7定义宏MOVE,其功能是将一个有100个字节元素的数组搬移到另一个数据区。,进行宏调用:MOVEFIRST,SECOND宏展开如下:MOVSI,0MOVCX,100?0000:MOVAL,FIRSTSIMOVSECONDSI,ALINCSILOOP?0000,3.2.5过程与宏定义伪指令,-40,40,3.宏和过程的比较,宏和过程都可简化源程序的书写,因而也减少了程序出错的可能性。但两者使用上也有区别:,3.2.5过程与宏定义伪指令,(1)宏操作可以直接传递和接收参数,而过程不能直接带参数。当过程之间需要传递参数时,必须通过堆栈、寄存器或存储器来进行,编程比宏要复杂。,所以,宏汇编适合于代码较短,传送参数较多的子功能段使用,子程序适合于代码较长,调用比较频繁的子功能段使用。,(3)引入宏操作并不会在执行目标代码时增加额外的时间开销,但过程调用由于要保护和恢复现场及断点,因此会延长目标程序的执行时间。,(2)子程序不管被调用多少次它都只被汇编一次,即有唯一的一段目标代码;而宏指令则调用多少次就汇编多少次,每次调用都要在程序中展开并保留宏体中的每一行。,-41,41,3.2.6结构定义伪指令,在一些应用中,常需要将一些不同类型的数据组合成一个有机整体。这时就要用到汇编语言的结构化数据结构。,与前述的字节、字类型数据不同,一个结构必须先经定义后才可以说明属于这种结构类型的变量,这是因为结构的组成是千变万化的。所以围绕结构定义,有两种伪指令语句:,2.结构变量说明与赋初值语句,1.结构类型说明语句(STRUC/ENDS),-42,42,3.2.6结构定义伪指令,语句格式:结构名STRUC;结构体,由数据定义语句构成结构名ENDS,DATESTRUCMONTHDB?DAYDB?YEARDW?DATEENDS,结构的定义明确地描述了该结构的组织形式,它告诉汇编程序属于这种组织形式的变量使用内存的模式。例如:,1.结构类型说明语句(STRUC/ENDS),-43,43,语句格式:变量名结构名域值表,例如:VARDATE,3.结构的引用有两种方法:结构变量名.域名基址或变址寄存器.域名,MOVAX,VAR.YEARMOVCL,VAR.DAY上述引用也可用如下方法:MOVBX,OFFSETVARMOVAX,BX.YEARMOVCL,BX.DAY,3.2.6结构定义伪指令,2.结构变量说明与赋初值语句,-44,44,3.3汇编语言程序设计入门,3.3.1汇编语言程序的开发过程3.3.2基本结构程序设计3.3.3子程序设计与调用技术3.3.4DOS/BIOS功能调用,-45,45,3.3.1汇编语言程序的开发过程,与其它程序设计语言一样,汇编语言程序的开发过程可归结为:,就需求分析、模块划分和算法确定等工作而言,各种程序设计语言是类似的,均可按软件工程的方法进行,但编程和调试则因程序设计语言而异。,需求分析,根据需求和规模等因素划分模块,确定各功能模块的求解算法、并定义所需的数据结构,进行编程和调试,-46,46,对汇编语言而言,根据数据结构和算法进行编码到形成可用程序的过程如下:,3.3.1汇编语言程序的开发过程,-47,47,3.3.2基本结构程序设计,程序的基本结构形式有三种:,顺序结构,分支结构,循环结构,理论上,三种基本结构是完备的,即任何功能的程序都可由顺序、分支和循环三种结构实现。,-48,48,1.顺序程序设计,在实际应用中,纯粹用顺序结构编写的完整程序很少见,但是在程序段中它却是大量的存在。所以掌握它是编写复杂应用程序的基础。,顺序程序又称直线程序。,其特点是顺序执行的,无分支,无循环,也无转移,只作直线运行。,3.3.2基本结构程序设计,-49,49,2.分支程序设计,在许多实际问题中,往往需要根据不同的情况和给定的条件做出不同的处理。要设计这样的程序,必须事先把各种可能出现的情况及处理方法都编写在程序中,以后计算机运行程序时,可自动根据运行的结果做出判断,有条件地选择执行不同的程序段,按这种要求编写的程序称为分支程序。,3.3.2基本结构程序设计,-50,50,分支程序的结构有三种形式:,IF条件THEN分支程序,IF条件THEN分支1ELSE分支2,3.3.2基本结构程序设计,-51,51,利用比较与条件转移指令实现分支,程序如下:DATASEGMENTXDB0F8HYDB?DATAENDS,3.3.2基本结构程序设计,-52,52,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,X;取变量X的值CMPAL,0;X与0比较JGBIGRJEFINISH;X=0,Y=0MOVAL,0FFH;X0,Y=1FINISH:MOVY,AL;保存函数值YMOVAH,4CHINT21HCODEENDSENDSTART,3.3.2基本结构程序设计,-53,53,利用跳转表实现分支,适于多分支结构。有三种跳转表:,3.3.2基本结构程序设计,-54,54,使用跳转表实现分支时,要特别注意表内地址分支和表内指令分支两种结构跳转表的定义方法和正确的寻址方式。,表内地址分支在数据段定义跳转表,用存储器间接寻址;表内指令分支在代码段定义跳转表,用寄存器间接寻址。,3.3.2基本结构程序设计,-55,55,解:这是一个多分支结构程序,适合于用跳转表实现。假设用表内地址分支实现,此时,跳转表在数据段定义,转移要用存储器间接寻址的跳转指令。程序如下:,例3.10设某控制程序可完成8种产品的加工,每种加工程序对应一个数字(18)。现要求根据输入的值去加工相应产品。假设8种加工程序段与主程序在同一代码段中。,3.3.2基本结构程序设计,-56,56,例3.10表内地址分支程序,.486DATASEGMENTDATADISPDBErrorrepeatinputDB0AH,0DH,$BASEDDSBR1,SBR2,SBR3,SBR4DDSBR5,SBR6,SBR7,SBR8DATAENDSCODESEGMENTCODEASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;输入数字序号INT21HCMPAL,1JBERRCMPAL,8JAERRSUBAL,1,ANDEAX,0000000FHJMPBASEEAX*4SBR1:SBR2:SBR8:ERR:CMPAL,EJZEXITMOVDX,OFFSETDISPMOVAH,09HINT21HJMPINPUTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART,此题也可用表内指令分支实现。这时,跳转表要在代码段定义,转移则要用寄存器间接寻址的跳转指令。程序如下:,3.3.2基本结构程序设计,-57,57,.486DATASEGMENTUSE16DATADISPDBErrorrepeatinputDB0AH,0DH,$DATAENDSCODESEGMENTUSE16CODEASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;输入数字序号INT21HCMPAL,1JBERRCMPAL,8JAERRSUBAL,1ANDAX,000FHMOVBX,AXSHLBX,1ADDAX,BXMOVBX,OFFSETBASE,ADDBX,AXJMPBXBASE:JMPSUB1;跳转表JMPSUB2JMPSUB8SUB1:SUB2:SUB8:ERR:CMPAL,EJZEXIT;按E键结束MOVDX,OFFSETDISPMOVAH,09H;显示提示信息INT21HJMPINPUT;转重输入字符EXIT:MOVAH,4CHINT21HCODEENDSENDSTART,例3.10表内指令分支程序,3.3.2基本结构程序设计,-58,58,3.循环程序设计,初始化部分,循环体,循环修改,循环控制,凡要重复执行的程序段都可按循环结构设计。采用循环结构,可简化程序书写形式,缩短程序长度,减少占用的内存空间。,循环结构的程序一般包括下面几个部分:,3.3.2基本结构程序设计,-59,59,循环程序的两种组织方式,3.3.2基本结构程序设计,-60,60,计数控制,条件控制,状态控制,逻辑尺控制,循环结束的控制方式:,3.3.2基本结构程序设计,-61,61,(1)计数控制循环程序设计循环次数已知时用计数控制循环,这时常用CX作循环计数器,用循环指令LOOP控制循环。也可用其他通用寄存器作循环计数器,用DEC和JNZ指令控制循环。,例3.11某存储区中存放着80名同学某科目的成绩(099分),假定此成绩以压缩BCD码形式存放。要求统计及格(60分以上)和不及格人数,统计结果仍以压缩BCD码形式存放。,解:此题循环次数已知,下面用CX作循环计数器,使用LOOP指令控制循环。BCD计数器加1用宏指令实现,程序如下:,3.3.2基本结构程序设计,-62,62,例3.11程序,;定义宏,BCD加1计数BCD_ADD_1MACROADDRMOVAL,ADDRADDAL,1DAAMOVADDR,ALENDMDATASEGMENTBLOCKDB87H,60H,57H,90HCNTEQU$-BLOCKNUM1DB0;定义计数器NUM2DB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,START:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBLOCKMOVCX,CNTAGAIN:MOVAL,SICMPAL,60H;比较JNCNEXTBCD_ADD_1NUM2JMPNEXT1NEXT:BCD_ADD_1NUM1NEXT1:INCSI;修改指针LOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART,3.3.2基本结构程序设计,-63,63,例3.12编写程序,将ASCII码表示的5位十进制数(65535)转换成16位二进制数,并存储起来。,解:设X=Xn-1X1X0为十进制数,则X转换为二进制数的一般方法为:X=Xn-110n-1+X110+X0,该式可用计数循环结构从低位到高位依次对每位十进制数进行转换处理,求出每位十进制数对应的二进制数(Xi10i),并累加求和。,假定用变量MULTIPLE保存第i位十进制数Xi对应的权值10i,变量BINAY保存转换的二进制数,ASCII码数的存放顺序是高位在前、低位在后。程序如下:,3.3.2基本结构程序设计,-64,64,例3.12程序,DSEGSEGMENTASCDECDB23333BINAYDW0MULTIPLEDW1DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10;SI指向ASCII码数首址LEASI,ASCDECDECSI;BX指向ASCII码数个位MOVBX,5,NEXT:MOVAL,BX+SIANDAX,0FH;计算当前十进制位对应的二进制数MULMULTIPLEADDBINAY,AX;累加求和MOVAX,MULTIPLE;计算下一十进制位对应的权值MULCXMOVMULTIPLE,AXDECBXJNZNEXT;未完继续MOVAH,4CHINT21HCSEGENDSENDSTART,3.3.2基本结构程序设计,-65,65,当循环次数未知时,就要用条件或状态信号来控制循环。用条件控制时,常用比较指令CMP与条件转移指令Jcc结合控制循环结束.用状态控制时,状态信号既可由外设提供,也可由其他任务或过程提供,这时常用测试指令TEST与条件转移指令Jcc结合控制循环结束。,条件/状态控制循环程序设计,3.3.2基本结构程序设计,-66,66,例3.13编程统计AX寄存器中1的个数。,解:要统计AX中1的个数,一个比较简单直观的办法是用移位的办法把各数位逐次移到最高位去,然后根据最高有效位是否为1来计数;循环结束采用计数值16来控制。但考虑到AX的值或者某次移位后AX的值可能为0的情况,为了缩短程序的执行时间,下面采用测试AX的值是否为0来作为循环结束的控制条件。程序如下:,3.3.2基本结构程序设计,-67,67,CODESEGMENTASSUMECS:CODESATRT:MOVCX,0;统计计数器清0AGAIN:CMPAX,0;(AX)=0?JZEXIT;为0,结束JNSNEXTINCCX;AX最高位为1,统计NEXT:SHLAX,1;AX左移1位JMPSHORTAGAINEXIT:MOVAH,4CHINT21HCODEENDSENDSTART,例3.13程序,此例说明算法和控制条件的选择对程序的工作效率有很大影响,而循环控制条件的选择又是很灵活的,应该根据具体情况来确定。,3.3.2基本结构程序设计,-68,68,例3.14从FIRST开始的100个单元中存放着一个字符串,结束符为$。编写一个程序,统计该字符串中字母A的个数。,解:此例并不知道字符串的具体长度,所以不能直接使用计数循环。这时可用字符串结束标志(结束符$)来控制扫描或比较结束。当然,经过适当处理,此例也可用计数循环控制。下面给出这两种控制方法的程序。,3.3.2基本结构程序设计,-69,69,例3.14条件控制程序,DATASEGMENT;定义字符串,结束符为$FIRSTDBAGHJK$NUMBERDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBL,0LEADI,FIRST;取串首址,NEXT:MOVAL,DI;取一个字符INCDICMPAL,$;与$比较JEEXIT;等于,结束CMPAL,A;与A比较JNENEXT;不等于,不统计INCBL;找到,计数JMPNEXT;继续EXIT:MOVNUMBER,BLMOVAH,4CHINT21HCODEENDSENDSTART,3.3.2基本结构程序设计,-70,70,例3.14计数控制程序,DATASEGMENTFIRSTDBAGHJK$COUNTEQU$-FIRSTNUMBERDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;DS、ES指向同一数据段MOVES,AX,MOVBL,0LEADI,FIRSTMOVCX,COUNTMOVAL,ACLDNEXT:REPNESCASB;找字符AJNZEXIT;未找到,结束INCBL;找到,计数JMPNEXT;继续EXIT:MOVNUMBER,BLMOVAH,4CHINT21HCODEENDSENDSTART,3.3.2基本结构程序设计,-71,71,3.3.2基本结构程序设计,(3)逻辑尺循环程序设计,循环不规则时使用的一种循环控制方法,例3.15设有数组:X=x1,x2,x10,Y=y1,y2,y10。试编制程序,计算:z1=x1+y1z6=x6+y6z2=x2+y2z7=x7-y7z3=x3-y3z8=x8-y8z4=x4-y4z9=x9+y9z5=x5-y5z10=x10+y10其中,xi,yi,zi(i=1,2,10)均为16位补码数。,定义一个二进制位序列称为逻辑尺1100010011每个数组元素zi对应一位,该位为1,表示计算zi时对应数组元素相加,否则相减。,-72,72,例3.15程序,3.3.2基本结构程序设计,DATASEGMENTXDWx1,x2,x3,x4,x5DWx6,x7,x8,x9,x10YDWy1,y2,y3,y4,y5DWy6,y7,y8,y9,y10ZDW10DUP(?)SOCBEHDW1100010011000000BDATAENDSSTACKSEGMENTSTACKSTNDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATA,START:MOVAX,DATAMOVDS,AXMOVBX,SOCBEH;取逻辑尺MOVCX,10;置循环次数MOVSI,0AGAIN:MOVAX,XSI;取xiSHLBX,1JNCL1ADDAX,YSI;求和JMPL2L1:SUBAX,YSI;相减L2:MOVZSI,AX;保存ziADDSI,2LOOPAGAINEXIT:MOVAH,4CHINT21HCODEENDSENDSTART,-73,73,3.3.3子程序设计与调用技术,同一个程序中,往往有许多地方都需要执行同样的一项任务(一段程序),而该任务又并非规则情况,不能用循环程序来实现,这时可以对这项任务独立地进行编写,形成一个子程序或过程。,-74,74,子程序结构如图所示:,3.3.3子程序设计与调用技术,从子程序返回主程序则简称为“返主”,通常将主程序向子程序转移叫子程序调用或过程调用,简称“转子”,-75,75,设计或编写子程序时,着重要考虑两个问题:,3.3.3子程序设计与调用技术,主程序与子程序的接口,主程序与子程序间的参数传递,-76,76,正确使用CALL/RET指令,转子和返主过程中的现场保护和恢复,主程序与子程序所使用的存储单元和寄存器尽量分开,互不干扰。,这又有两种方法:,3.3.3子程序设计与调用技术,主程序与子程序的接口,-77,77,将“现场”通过堆栈保存和恢复。,SUBRPROCPUSHAXPUSHBX;子程序体POPBXPOPAXRETSUBRENDP子程序,这时,既可在子程序中保存和恢复,又可在主程序中保存和恢复。例如:,PUSHAXPUSHBXCALLSUBRPOPBXPOPAX主程序,3.3.3子程序设计与调用技术,-78,78,主程序在调用子程序时,往往要向子程序传递一些参数;同样,子程序运行后也经常要把一些结果传回给主程序。主程序与子程序之间的这种信息传递称为参数传递。,一般将子程序需要从主程序获取的参数称为入口参数,而将子程序返回给主程序的参数称为出口参数。入口参数使子程序可以对不同数据进行相同功能的处理,出口参数使子程序可送出不同的结果至主程序。,3.3.3子程序设计与调用技术,主程序与子程序的参数传递,-79,79,常用的参数传递方法有:寄存器传递法存储器传递法堆栈传递法,具体采用何种方法要根据情况事先约定好,有时可能同时采用多种方法。,3.3.3子程序设计与调用技术,-80,80,(1)利用寄存器传递参数,调用前,主程序将参数保存在某些通用寄存器中,子程序则直接引用寄存器中的参数。出口参数也可通过寄存器返回给主程序。这种方法简单快捷,但需占用通用寄存器,只适合参数较少的场合。,例3.16用子程序调用计算:X3+Y3。,用子程序计算:X3入口参数:AL出口参数:EAX,3.3.3子程序设计与调用技术,-81,81,.486DATASEGMENTXDB68HYDB0E6HRESULTDD?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCALLCUBICAL;计算X3MOVEBX,EAXMOVAL,YCALLCUBICAL;计算Y3ADDEAX,EBXMOVRESULT,EAX,MOVAH,4CHINT21HCUBICALPROCPUSHBX;保护现场PUSHDXMOVSXBX,AL;等值扩充ALIMULAL;计算X2IMULBX;计算X3PUSHDX;(DX:AX)EAXPUSHAXPOPEAXPOPDX;恢复现场POPBXRETCUBICALENDPCODE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外墙防水保修合同书
- 时间主题的课件
- 企业信用评级与授信咨询服务协议
- 产品推广代理合同协议
- 过春节的活动作文(8篇)
- 早期教育概论课件
- 《新编商务应用文写作》第一章 习题参考答案
- 水孩子读后感250字(9篇)
- 早教分离焦虑课件
- 2025年瑞典语等级考试B1试卷:2025秋季学期词汇拓展
- 学校法律服务协议书
- 夫妻流产同意协议书
- 小儿麻醉护理课件
- 2025至2030中国金属键合线行业战略规划及投融资动态研究报告
- 2025至2030中国硫酸钾市场销售规模及发展商机可行性报告
- DB22-T3409-2022-餐饮用醇基液体燃料安全使用技术规范-吉林省
- 培育战斗精神 砥砺血性胆气 -2024教育实践活动
- 降低留置针堵管发生率:PDCA质量持续改进
- 项目经理考核试题及答案
- 车载信息娱乐系统的设计与开发-全面剖析
- 安检岗位培训课件模板
评论
0/150
提交评论