微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第1页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第2页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第3页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第4页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第5页
免费预览已结束,剩余95页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“十一五”国家级规划教材,微机原理与接口技术(第3版),第4章,8086汇编语言程序设计,本章主要内容,8086汇编语言中的伪指令,宏定义与宏调用,概述,汇编语言:用指令的助记符、符号地址、标号等书写程序的语言。用助记符来表示指令的操作码和操作数,用符号或标号代表地址、常量和变量。用汇编语言编写的程序称为汇编语言程序或源程序(SourceProgram)。源程序文件名后缀:.asm(不区分大小写)汇编语言源程序不能直接在计算机上运行,需要将它翻译成机器语言程序,即目标程序(ObjectProgram)。目标程序文件名后缀:.obj(不区分大小写),概述,汇编语言源程序目标程序的这个翻译过程为汇编。完成汇编任务的程序(软件)称为汇编程序。,汇编过程的含义如图:,概述,将汇编语言源程序翻译成目标代码程序;按指令要求自动分配存储区(包括程序区、数据区等);自动把源程序中以各种进制表示的数据都转换成二进制形式的数据;计算表达式的值;对汇编语言源程序进行语法检查,并给出语法出错的提示信息。,汇编程序完成的任务,概述,汇编语言程序由若干个段组成。按照各段功能的不同,分别有:代码段、数据段、堆栈段和附加段代码段是必须要定义的。,概述,【例5-1】若X、Y和RESULT为内存字单元的地址,请编写汇编程序,计算X+Y,并把和存入RESULT单元。DATASEGMENT;段定义XDW2010H;定义被加数YDW2011H;定义加数RESULTDW?;分配和数存放单元DATAENDS;段定义结束,概述,说明哪个段是数据段,哪个段是代码段,程序运行结束,关闭并返回操作系统,给除CS以外的其他用到的段的段寄存器赋值,源程序结束,处理并存结果,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,XADDAX,YMOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART,48086汇编语言程序设计,4.18086汇编语言的语句,指令性语句,指示性语句,例:MESSAGEDBTHISISASAMPLEPROGRAM.;定义变量MESSAGE在数据段DATA中的存放形式,汇编时,汇编程序将MESSAGE定义为一个字节类型数据区的首地址,并按字节存储字符串。,4.18086汇编语言的语句,1、指令性语句格式,48086汇编语言程序设计,表示可任选部分;,LOOPER:MOVAL,DATA2SI;取一个字节加数BB1:SHLAX,1;将AX逻辑左移1位LOOPBB1,标号:操作码操作数,操作数;注释,4.18086汇编语言的语句,1、指令性语句格式,48086汇编语言程序设计,表示可任选部分;,标号段:可选项,后跟冒号,在程序中作为JMP、LOOP指令的转移目标,与具体的指令地址相联系。在同一段程序中,同样的标号名只允许定义一次。由字母(不分大小写)、数字及特殊符号组成,名字可以用除数字外所有的合法符号开头,名字的有效长度不超过31个英文字符。标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等,标号:操作码操作数,操作数;注释,4.18086汇编语言的语句,1、指令性语句格式,48086汇编语言程序设计,表示可任选部分;,标号段:标号表示指令地址,是指令符号地址,一旦定义了具有3种属性:段地址属性:标号所在段的段地址(16位数),在CS中段内偏移量(或相对地址)属性:标号与CS段起始地址之间相距字节数,16位无符号数类型属性:标号所代表的指令的转移范围,分NEAR(近)与FAR(远)两种。,标号:操作码操作数,操作数;注释,4.18086汇编语言的语句,1、指令性语句格式,48086汇编语言程序设计,标号段:类型属性:代表的指令的转移范围,分NEAR(近)与FAR(远)两种NEAR类型的标号仅在同一段内使用,用2字节指针给出转移的偏移量属性(即只改变IP值,不改变CS值);FAR类型的标号无此限制,必须用字节指针指出转移的段地址与段内偏移量。当标号用作JMP或CALL等指令的目标操作数时,若为段内转移或调用则采用NEAR类型;若为段间转移或调用则应当采用FAR类型。,标号:操作码操作数,操作数;注释,48086汇编语言程序设计,操作码段:包括8086的指令助记符。语句中唯一不可缺少的部分。操作码助记符通常称为关键字或保留字,用户不能用这些字或词作为变量名、标号、标识符等。,4.18086汇编语言的语句,1、指令性语句格式,表示可任选部分;,标号:操作码操作数,操作数;注释,48086汇编语言程序设计,操作数段:表明操作的对象,操作数可以是常数、寄存器、标号、变量和表达式。对于8086的一般性执行指令,操作数表可以是一个或两个操作数。若是两个操作数,用逗号隔开,则称左边操作数为目标操作数,右边操作数为源操作数。,4.18086汇编语言的语句,1、指令性语句格式,标号:操作码操作数,操作数;注释,表示可任选部分;,48086汇编语言程序设计,操作数段:表明操作的对象,操作数可以是常数、寄存器、标号、变量和表达式。,4.18086汇编语言的语句,1、指令性语句格式,标号:操作码操作数,操作数;注释,表示可任选部分;,操作数可能为以下几种情况:常量操作数:如34等。寄存器操作数:如AX等。存储器操作数:如0100H等。表达式操作数:如AX+2、DAT+2、SEGNUM1等。,48086汇编语言程序设计,注释段:以“;”开始,用来简要说明该指令在程序中的作用(不是重复解释指令本身的功能),以便于程序的阅读、备忘和交流。,4.18086汇编语言的语句,1、指令性语句格式,标号:操作码操作数,操作数;注释,表示可任选部分;,4.18086汇编语言的语句,2、指示性语句格式,48086汇编语言程序设计,表示可任选部分;,DATA1DB0F8H,60H,0ACH,74H,3BH;定义一组数据DATASEGMENTAADB20H,-30H;在数据段定义一组字节数据DATAENDS,标识符(名字)指示符(伪指令)表达式;注释,4.18086汇编语言的语句,2、指示性语句格式,48086汇编语言程序设计,表示可任选部分;,标识符段:标识符由字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串。标识符定义的为常量名、变量名、过程名、段名等。默认情况下,汇编程序是不区分大、小写字母的注意:名字的后面没有冒号,这是指示性语句同指令性语句在格式上的主要区别。,标识符(名字)指示符(伪指令)表达式;注释,4.18086汇编语言的语句,2、指示性语句格式,48086汇编语言程序设计,标识符段:标识符,具有3种属性:段地址属性:标识符所在段的段地址(16位数)段内偏移量(或相对地址)属性:标识符与段起始地址之间相距字节数,16位无符号数类型属性:伪指令定义的变量的属性,指出变量所保留的字节数。BYTE(1字节的字节型),WORD(2字节的字型),DWORD(4字节的双字型)。,标识符(名字)指示符(伪指令)表达式;注释,4.18086汇编语言的语句,2、指示性语句格式,48086汇编语言程序设计,表示可任选部分;,指示符段:指示符又称伪指令,由汇编程序执行的命令。能将标识符定义为变量、程序段、常数、过程等,且给出其属性。,标识符(名字)指示符(伪指令)表达式;注释,4.18086汇编语言的语句,2、指示性语句格式,48086汇编语言程序设计,表示可任选部分;,表达式段:是常数、寄存器、标号、变量与一些操作符相结合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则,对表达式进行计算后得到一个数值或一个地址。,标识符(名字)指示符(伪指令)表达式;注释,4.28086汇编语言中的伪指令,48086汇编语言程序设计,伪指令又称伪操作,在汇编程序的指示性语句中作为指示符。伪指令可以对数据进行定义,为变量分配存储区域,定义一个程序段或一个过程,指示程序结束等。有符号定义语句、变量义语句、段定义语句、过程定义语句、结束语句等。,4.2.1符号定义语句,4.28086汇编语言中的伪指令,1等值语句,格式:符号名EQU表达式表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。功能:给表达式赋予一个名字。定义后,可用名字代替表达式。在同一源程序中,一个符号名只能用EQU定义一次。,例PORTEQU1234;常量BUFFEQUPORT+58;数值表达式MEMEQUDS:BP+20H;地址表达式COUNTEQUCX;变量ABCEQUAAA;指令助记符当程序中出现下面的语句时MOVAX,PORT=MOVAX,1234MOVBX,BUFF=MOVBX,1292BEQUBP+8BEQU20H不行!,4.28086汇编语言中的伪指令,4.2.1符号定义语句,4.28086汇编语言中的伪指令,2等号语句,格式:符号名=表达式表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。功能:与EQU基本相同,区别是它可以对同一个名字重新定义。,例NMU=34NUM=34+1,4.2.2变量定义语句,4.28086汇编语言中的伪指令,用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。格式:符号名DB/DW/DD表达式功能:当一个符号名用伪指令DB、DW或DD定义后,称为变量。DB变量为字节数据类型(8位)。DW变量为字数据类型(16位)。DD变量为双字数据类型(32位)。,4.2.2变量定义语句,4.28086汇编语言中的伪指令,格式:符号名DB/DW/DD表达式变量定义后具有如下属性:字节型、字型、双字型等数据类型。分配内存单元。存放时低字节数据存放在低地址单元,高字节数据存放在高地址单元。变量定义一般在数据段中,故一个变量被定义后,具有段地址和段内偏移地址属性。,4.2.2变量定义语句,4.28086汇编语言中的伪指令,1、定义一组数据:例如:BUFF1DW1234H,OABCDH,8EH,-79DHBUFF2DB12H,34H,CDH,8EH,MOVAX,BUFF1MOVBX,BUFF1+2MOVDL,BUFF2,MOVAX,0000HMOVBX,0002HMOVDL,0008H,MOVAL,BUFF1;类型不匹配MOVDX,BUFF2;,34,12,CD,AB,8E,00,63,F8,12,34,CD,8E,0000H,0001H,0002H,0003H,0004H,0005H,0006H,0007H,0008H,0009H,000AH,000BH,BUFF1,BUFF2,1234H,0ABCDH,8EH,-79DH,4.2.2变量定义语句,4.28086汇编语言中的伪指令,2、定义一串字符:例如:STRDBWelcome!每个字符的值为它的ASCII码值,所以用DB来定义。,字符ASCII码W57He65Hl6CHc63Ho6FHm6DHe65H!22H,57,65,6C,63,6F,6D,65,22,STR,W,e,l,c,o,m,e,!,4.2.2变量定义语句,4.28086汇编语言中的伪指令,3、定义保留存储单元:预留内存单元,但不赋值,以存放运算结果。当没有特定赋值时,其中有随机值。SUMDW?,?ADB?BDB?,4.2.2变量定义语句,4.28086汇编语言中的伪指令,4、复制操作:复制操作符DUP可以预置重复的数值。DUP之前的数字表示重复次数,DUP后括号内位重复的内容。ALL_ZERODB0,0,0,0,0等效为:ALL_ZERODB5DUP(0)例:BUFFERDB10DUP(?);分配10个字节,初值不确定ALL_ZERODW100DUP(0);分配100个字,初值都为0STRINGDB4DUP(ABC);连续分配4个ABC字符串,4.2.2变量定义语句,4.28086汇编语言中的伪指令,5、将已定义的地址存入内存单元:定义过的标号或用PROC过程定义过的过程名,都有段地址和段内偏移地址属性。若希望将变量、标号或过程名的段地址和偏移地址保存到存储单元,可用下列方式完成:例如:LITDDCYCCYC:MOVAX,BX;将CYC的段地址和偏移地址保存到存储单元LIT开始的4个字节单元中。,4.2.3段定义语句,4.28086汇编语言中的伪指令,一个汇编语言是有若干个逻辑段组成。所有的指令、变量均分别放在各个逻辑段中。段定义语句的用途是在汇编语言源程序中定义逻辑段。段定义语句可按段来组织和使用存储器。这些语句包括:SEGMENT、ENDS、ASSUME、ORG等。,4.2.3段定义语句,4.28086汇编语言中的伪指令,1、段定义语句格式,格式:段名SEGMENT定位类型组合类型类别段名ENDS功能:定义一个逻辑段。SEGMENT和ENDS必须成对使用,它们前面的段名必须是相同的。SEGMENT后面中括号中的内容为可选项,告诉汇编程序和连接程序如何确定段的边界、如何连接几个程序模块。,4.2.3段定义语句,4.28086汇编语言中的伪指令,1、段定义语句格式,定位类型:定位类型说明段的起始地址应有怎样的边界值,有以下4种。,4.2.3段定义语句,4.28086汇编语言中的伪指令,1、段定义语句格式,组合类型:说明链接不同模块中的同名段时采用的方式,有以下6种。NONE:不组合,该段与其他段逻辑上不发生关系,即使同名,各段拥有各自的段基值。组合类型的默认值为NONE。STACK:本段与其他模块中说明为STACK的同名的堆栈段链接起来,公用一个段地址,形成一个新的逻辑段。同时,系统自动初始化SS及SP。PUBLIC:本段与其他模块中说明为PUBLIC的同名同类别的段链接起来,公用一个段地址,形成一个新的逻辑段,所以偏移量调整为相对于新逻辑段起始地址的值。,4.2.3段定义语句,4.28086汇编语言中的伪指令,1、段定义语句格式,组合类型:说明链接不同模块中的同名段时采用的方式,有以下6种。MEMORY:与PUBLIC同义,只不过MEMORY定义的段装在所有同名段的最后。若连接时出现多个MEMORY,则最先遇到的段按组合类型MEMORY处理,其他段组合类型按PUBLIC处理。COMMON:同名段从同一个内存地址开始装入。所以,各个逻辑段将发生覆盖。连接以后,该段长度取决于同名段中最长的那个,而内容有效的是最后装入的那个。ATexp:段地址为表达式exp的值(长度为16位)。此项不能用于代码段。例如:AT0530H,表示本段从物理地址0530H开始。,4.2.3段定义语句,4.28086汇编语言中的伪指令,1、段定义语句格式,类别:说明链接不同模块中的同名段时采用的方式,有以下6种。类别名必须用单引号括起来。类别的作用是在连接时决定各逻辑段的装入顺序。当几个程序模块进行连接时,其中具有相同类别名的段,按出现的先后顺序被装入连续的内存区。没有类别名的段,与其他无类别名的段一起连续装入内存。典型的类型名有:“STACK”,“CODE”,“DATA”。,4.2.3段定义语句,4.28086汇编语言中的伪指令,2、段假设语句ASSUME,格式:ASSUME段寄存器名:段名,段寄存器名:段名段寄存器可以是:CS、DS、ES、SS。段名为已定义的段。凡是程序中使用的段,都应说明它与段寄存器之间的对应关系。功能:用于明确段与段寄存器的关系。,例:ASSUMECS:SEGA,DS:SEGB,SS:NOTHING,4.2.3段定义语句,4.28086汇编语言中的伪指令,2、段假设语句ASSUME,格式:ASSUME段寄存器名:段名,段寄存器名:段名使用说明:ASSUME伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS进行赋值,但不允许对CS赋值。,4.2.3段定义语句,4.28086汇编语言中的伪指令,3、ORG伪指令与地址计数器,在汇编程序中,有一个软件计数器(LC)地址计数器。在每个段定义开始处,它被复位为0。当汇编程序逐行扫描语句时,用LC保存当前指令的地址。格式1:ORG格式2:ORG$+表达式使用说明:强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏移地址。ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。此语句本身并不占内存。,4.28086汇编语言中的伪指令,A5,47,C9,23,01,56,0010H,0011H,0014H,0015H,0016H,001EH,001FH,0020H,47A5H,0C956H,0123H,例MY_DATASEGMENTORG10DAT1DW47A5HORG20DAT2DW0C956HORG$+8(跳过8个字节的存储区)DAT3DW0123HMY_DATAENDS,16H+8=1EH,若省略ORG,则从本段起始地址开始连续存放,4.2.3段定义语句,4.28086汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,当一个程序由多个模块组成时,必须通过命令将各模块连接程一个完整的、可执行的程序。程序模块,是单独编译和汇编的,能够完成某个功能的程序,如主程序模块、各种功能的子程序模块。由PUBLIC说明的名字是全局的,可以在其他模块中使用,EXTRN表明本模块中使用的名字在别的模块中定义过,且类型一致。PUBLIC和EXTRN配对使用。,4.2.3段定义语句,4.28086汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,(1)PUBLIC伪指令格式:PUBLIC名字,使用说明:名字可以是变量、符号常量、标号或过程名。由PUBLIC定义的名字,可以被其他模块引用,即由其定义的名字是公共名字,可以被外部模块引用。,4.2.3段定义语句,4.28086汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,(1)EXTRN伪指令格式1:EXTRN名字:类型,使用说明:名字是在其他模块中已由PUBLIC所定义。类型指的是名字的类型,应与原模块中定义的类型一致。可以是:内存变量型:BYTE、WORD、DWORD过程型:NEAR、FAR数值型:ABS定义本模块中将要引用的外部模块中的名字,它们应在各自的模块中已用PUBLIC伪指令进行了定义。,4.2.4过程定义语句,4.28086汇编语言中的伪指令,汇编语言中,用过程的定义来实现子程序功能。过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。格式:过程名PROCNEAR/FAR过程体RET过程名ENDP功能:完成过程定义,在过程体中实现过程的操作功能,4.2.4过程定义语句,4.28086汇编语言中的伪指令,格式:过程名PROCNEAR/FAR过程体RET过程名ENDP功能:完成过程定义,在过程体中实现过程的操作功能说明:PROC与ENDP必须成对出现,PROC开始一个过程,ENDP结束一个过程。成对的PROC与ENDP的前面必须有相同的过程名。类型取值为:NEAR(为默认值)或FAR,表示该过程是段内调用或段间调用。一个过程中,至少有一条过程返回指令RET,一般放在ENDP之前。过程可以嵌套,但不可以交叉。,COD1SEGMENTASSUMECS:COD1,;代码段中的其它语句(主程序)SUB1PROCFAR;名为SUB1的FAR过程开始RET;返回SUB1ENDP;SUB1结束SUB2PROC;名为SUB2的NEAR过程开始RET;返回SUB2ENDP;SUB2结束;可能定义的其它过程COD1ENDS;代码段结束,4.28086汇编语言中的伪指令,4.2.5结束语句,4.28086汇编语言中的伪指令,格式:END标号功能:表示源程序的结束。标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子模块则只用END而不必指定标号。END是汇编语言源程序中最后一条语句。,DATASEGMENT;定义数据段D1DB5DUP(?);连续的字节单元CCEQU$D1;对单元计数SUMDW0;为结果保留一个字DATAENDS;数据段定义结束STACKSEGMENTPARASTACKSTACK;定义堆栈段DB100DUP(?);100字节的栈空间STACKENDS;堆栈段定义结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE;对各段进行说明BEGIN:MOVAX,DATA;DS初始化为DATAMOVDS,AXLEASI,D1;预置源数据的指针,例多个连续字节单元的累加,段定义语句,MOVCX,CC;预置次数LODSBYTEPTRSI;取一个数并修改指针MOVAH,0;清AX的高字节CLC;清CF位BEGIN:ADCSUM,AX;累加LODSBYTEPTRSI;再取数并修改指针LOOPBEGIN;控制循环MOVAH,4CH;完成,返回DOSINT21HCODEENDS;代码段结束ENDBEGIN;整个程序结束,4.38086汇编语言中的运算符,48086汇编语言程序设计,8086指示性语句中可以采用表达式。表达式中可以使用3种运算符和2中操作符算术运算符逻辑运算符关系运算符分析操作符综合运算符(合成操作符),算术运算符,(只能用于数值表达式),4.3.1常用运算符和操作符,4.38086汇编语言中的运算符,算术运算符,4.3.1常用运算符和操作符,算术运算符的使用特点:数值表达式中可使用所有算术运算符地址表达式仅使用+、-算术运算符算术运算符不影响标志位,例1:完成80H+90H解:MOVAL,80H+90H;使用数值表达式;(AL)=10H、CF=不变MOVAL,80HADDAL,90H;使用加法指令;(AL)=10H、CF=1,4.38086汇编语言中的运算符,等效,4.3.1常用运算符和操作符,逻辑运算符,(只能用于数值表达式),4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,逻辑运算符的使用特点:逻辑指令助记符与逻辑运算符形同意不同逻辑指令助记符出现在指令语句的开始ANDCX,00FFHAND10AEH逻辑运算符出现在指令语句的操作数段ANDCX,00FFHAND10AEH注:指令ANDCX,00AEH,逻辑运算符,例:MOVAX,756AHAND2465H;(AX)=2460HMOVAL,NOT25H;(AL)=DAH,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,关系运算符,关系不成立时,结果为全0;关系成立时,结果为全1。(关系式的两个操作数必须是数字或是同一段内的两个地址单元)。设(AI)=6。,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,关系运算符的使用特点:两性质相同的操作数间的比较若关系正确为真(T),有全1操作数若关系错误为假(F),有全0操作数,关系运算符,MOVBL,(PORTLT5)AND20H若PORT=2,(PORTLT5)=FFH,为真原式为MOVBL,20H若PORT=7,(PORTLT5)=00H,为假原式为MOVBL,00H,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,分析操作符,用来把存储器操作数(变量或标号)分解为它的组成部分(段地址、偏移值、类型、数据字节总数、数据项总数等),并以数值形式回送给存储器操作数(变量或标号)。,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,分析操作符,SIZE返回值=LENGTH返回值*TYPE返回值,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,分析操作符,例:DATA1DW100DUP(?)则LENGTHDATA1;值为100SIZEDATA1;值为200TYPEDATA1;值为2,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,综合运算符(合成操作符),(1)PTR运算符格式:类型PTR表达式功能:临时修改或指定存储器操作数的类型属性,而保持原有的段、偏移地址属性,且原定义的类型属性不变。例如,有如下数据定义:BUFWDW1234H,5678H则下列指令合法:MOVAX,BUFWMOVAL,BYTEPTRBUFW;临时改变BUFW的字属性为字节属性,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,综合运算符(合成操作符),(1)PTR运算符例:INCBX;INCBYTEPTRBXINCWORDPTRBX例:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4MOVBX,WORDPTRARRAY13MOVCL,BYTEPTRARRAY26MOVWORDPTRSI,4,4.38086汇编语言中的运算符,4.3.1常用运算符和操作符,综合运算符(合成操作符),(2)THIS操作符格式:标号或变量名EQUTHIS类型(或属性)功能:可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。例如:FIRSTEQUTHISBYTE;从本语句开始变量ABC的类型属性指定为字节,不管它原来的类型是什么SECONDDW100DUP(?)此时FIRST的偏移地址和SECOND完全相同,但它是字节类型的;而BUFW则是字类型的。,4.38086汇编语言中的运算符,4.3.2运算符的优先级别,4.38086汇编语言中的运算符,4.4汇编语言程序设计,48086汇编语言程序设计,程序设计首先要将问题分解成一个一个的步骤,每步都可以用汇编语言中的指令性语句,按照先后顺序表达。设计一个好的程序,不仅要满足设计要求,能正常运行,实现预定功能,还应满足:程序结构化简明、易读、易调试、易维护执行速度快占用存储空间尽量少,4.4.1汇编语言程序设计基本步骤,4.4汇编语言程序设计,程序设计步骤:分析问题,抽象出数学模型,确定解决问题的合理算法;绘制描述程序的流程图,或写出程序步骤,确定实现数学模型的算式;分配内存单元和分配寄存器,根据流程图编写程序;静态检查,修改完善程序;上机运行调试。,4.4.2汇编语言程序设计的基本结构,4.4汇编语言程序设计,程序的基本结构形式有4种:顺序结构分支结构循环结构子程序,1、顺序结构:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,对应简单程序,顺序执行,无转移、无循环。指令指针IP值线性增加。,1、顺序结构:,4.4汇编语言程序设计,DATASEGMENT;定义数据段BLOCKDW0ABCDH;定义一个字数据BUFFDD?;定义一个双字数据,未赋值DATDENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA;段属性说明START:;这里是程序的入口MOVAX,DATAMOVDS,AX;初始化DSMOVDX,BLOCKMOVAX,DX;将BLOCK中数据送入AX中ANDAX,0F0FH;(AX)=0B0DHANDDX,0F0F0H;(DX)=0A0C0H,按事件发展的先后,选择合适的指令有序地加以组合。,1、顺序结构:,4.4汇编语言程序设计,MOVCL,4SHRDX,CL;(DX)右移四位,(DX)=0A0CHLEABX,BUFF;将BUFF的偏移地址送入BX中MOVBX+0,AL;将(AL)=0DH送入(BUFF+0)中MOVBX+1,DL;将(DL)=0CH送入(BUFF+1)中MOVBX+2,AH;将(AH)=0BH送入(BUFF+2)中MOVBX+3,DH;将(DH)=0AH送入(BUFF+3)中MOVAX,4C00HINT21H;程序结束,返回DOSCODEENDS;代码段结束ENDSTART;汇编程序结束,指定程序入口地址,2、分支结构:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,依据不同条件分支到各程序段,有双分支和多分支两种。IP值受标志位的影响而跳变。分支程序利用比较、转移指令来实现:用于比较、判断的指令有:CMP、CMPS、SCAS用于实现转移的指令:JMP及各类转移指令分支程序根据条件判断,满足条件转到标号指示的程序部分执行,不满足条件则执行下一条指令。,双分支结构,多分支结构,4.4汇编语言程序设计,2、分支结构:,4.4汇编语言程序设计,例:判断MEMS单元数据,将结果存入MEMD单元。若数据0,结果为1;若数据0,结果为-1;若数据=0,结果为0,2、分支结构:,4.4汇编语言程序设计,例:判断MEMS单元数据,将结果存入MEMD单元。若数据0,结果为1,;若数据0,结果为-1;若数据=0,结果为0,MY_DSEGMENT;定义数据段MEMSDB08H;定义一个字节数据MEMDDB?;定义一个字节数据,未赋值MY_DENDS;数据段结束MY_CSEGMENT;定义代码段ASSUMECS:MY_C,DS:MY_D;段属性说明START:;这里是程序的入口MOVAX,MY_DMOVDS,AX;初始化DSMOVAL,MEMS;将MEMS中数据送入AL中CMPAL,0;将(Al)=08H与0进行比较JGENEXT;0,转到标号NEXT处执行,2、分支结构:,4.4汇编语言程序设计,MOVAL,-1;0,结果为-1JUMDONE;无条件跳转到标号DONE处执行NEXT:JEDONE;=0,跳转到标号DONE处执行MOVAL,1;0,结果为1DONE:MOVMEMD,AL;将(AL)内容送入(MEMD)中MOVAX,4C00HINT21H;程序结束,返回DOSMY_DENDS;代码段结束ENDSTART;汇编程序结束,指定程序入口地址,3、循环结构:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,循环程序是在满足某些条件时对一段程序的重复执行:即用同一组指令,每次替换不同的数据,反复执行这一组指令。使用循环结构,可以缩短程序代码,提高编程效率。,3、循环结构:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,基本结构形式(1)先执行后判断(dowhile)至少进入一次循环体。常用于循环次数已知时。(2)先判断后执行循环体可一次都不执行。常用于循环次数未知,根据具体情况找出控制循环体结束的条件时常用。,4.4汇编语言程序设计,先执行后判断,先判断后执行,3、循环结构:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,循环程序设计中,循环控制有如下3种:计数控制(减1计数):当循环次数已知,将循环次数送入CX寄存器,没做完一次循环,利用LOOP指令减1计数,并判断循环是否结束。条件控制当循环次数未知时,通过比较,满足比较条件,则结束循环,否则继续循环操作。状态控制当循环内又套循环时,设OFFF为结束标志。,3、循环结构:,4.4汇编语言程序设计,例1:编程统计BUFF缓冲区数据中负数的个数。,DATASEGMENT;定义数据段BUFFDB67H,9EH,-6AH,0ABH,6DH;定义一个字节数据MEMDB?;定义1个字节数据,用于存储负数个数MY_DENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA;段属性说明START:;这里是程序的入口MOVAX,DATAMOVDS,AX;初始化DSMOVCX,5;将BUFF中数据个数送入CXLEABX,BUFF;获取BUFF单元偏移地址XORDL,DL;统计计数器清0,3、循环结构:,4.4汇编语言程序设计,NEXT:MOVAL,BX;取数据ADDAL,O;与0做加法,影响SF标志位JNSAA1;判断是否为正数,是,则转移INCDL;是负数,统计+1AA1:INCBX;移动指针,执行BUFF中下一个数据LOOPNEXT;循环控制MOVMEM,DL;保存统计结果MOVAX,4C00HINT21H;程序结束,返回DOSCODEENDS;代码段结束ENDSTART;汇编程序结束,指定程序入口地址,3、循环结构:,4.4汇编语言程序设计,例2:编程统计AX寄存器中“1”的个数。,CODESEGMENT;定义代码段ASSUMECS:CODE;段属性说明START:;这里是程序的入口MOVCX,16;循环控制次数设置XORDL,DL;统计计数器清0CMPAX,0;AX内容与O比较,结果是否为0?JZDONE;是0,跳转,结束循环BB1:SHLAX,1;AX内容左移,影响CF标志位ADCDL,0;统计“1”的个数LOOPBB1;循环控制DONE:MOVAX,4C00HINT21H;程序结束,返回DOSCODEENDS;代码段结束ENDSTART;汇编程序结束,指定程序入口地址,4、子程序:,4.4汇编语言程序设计,4.4.2汇编语言程序设计的基本结构,在许多应用程序中,常常需要多次用到一段程序。这时,为了避免重复编写程序,节省内存空间,可以把该程序段独立出来,以供其他程序调用,这段程序称为“子程序”或“过程”。子程序是可供其他程序调用的具体特定功能的程序段(或代码块)。调用子程序的程序体,称为“主程序”或“调用程序”。当主程序与子程序在同一段,此时子程序具有NEAR属性。主程序调用时,只将IP寄存器值入栈保存。当主程序与子程序在不用段,此时子程序具有FAR属性。主程序调用时,CS和IP寄存器值入栈保存。,4、子程序:,例:用子程序结果编写AX寄存器内容乘10,结果仍在AX中。,XXEQU1000CODESEGMENTASSUMECS:CODESTART:MOVAX,XX;给AX赋值为1000=03E8HCALLMUL10;调用把AX内容乘10子程序MOVAH,4CHINT21HMUL10PROC;AX乘10子程序,入口参数为AX,出口参数AXPUSHF;保护现场,标志寄存器值入栈PUSHBX;保护现场,BX内容入栈ADDAX,AX;2XXAXMOVBX,AX;2XXBXADDAX,AX;4XXAXADDAX,AX;8XXAXADDAX,BX;8XX+2XXAXPOPBX;恢复现场,参数出栈到BXPOPF;恢复现场,参数出栈到标志寄存器RET;过程返回指令MUL10ENDPCODEENDSENDSTART,4.4汇编语言程序设计,4.6DOS功能调用,48086汇编语言程序设计,MS-DOS叫磁盘操作系统。它不仅提供了许多命令,还给用户提供了100多个常用子程序。DOS功能调用就是对这些子程序的调用,也叫系统功能调用。子程序的功能主要是进行磁盘读/写,控制管理,内存管理,基本输入/输出管理等。子程序的顺序编号称为功能调用号。,4.6DOS功能调用,48086汇编语言程序设计,DOS功能调用号送入AH寄存器如果需要,按要求给定输入参数(有的不需要输入参数)写入中断指令“INT21H”调用结束,按功能使用其输出参数。,DOS功能调用过程:,4.6DOS功能调用,48086汇编语言程序设计,在所有DOS功能调用中,将INT2lH软中断命令实现的所有子程序调用称为DOS系统功能调用,它体现了DOS的核心功能,对应100多个子程序。常用如下:,单字符输入(01H、07H、08H功能)显示单字符(02H、05H功能)单字符输入或显示(06H功能)字符串输入(0AH功能)显示字符串(09H功能)检测键盘状态(0BH功能),1、单字符输入01H:,4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论