第5章+汇编语言程序设计.ppt_第1页
第5章+汇编语言程序设计.ppt_第2页
第5章+汇编语言程序设计.ppt_第3页
第5章+汇编语言程序设计.ppt_第4页
第5章+汇编语言程序设计.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1,第5章汇编语言程序设计,5.1宏汇编语言的基本语法5.2伪指令5.3宏指令5.4汇编语言程序的结构5.5DOS系统功能调用5.6汇编语言程序设计方法5.7软件调试技术习题,2,汇编语言是用意义明确的助记符来表示指令的操作码、操作数。汇编语言是面向机器的语言,不同的机器有不同的汇编语言。用汇编语言编写的程序具有执行速度快、占用存储空间小、实时性能好等特点。汇编语言被大量用于编写计算机系统程序、实时控制程序等。用汇编语言编写的程序称为汇编语言源程序(简称汇编语言程序)。计算机必须将汇编语言程序翻译成由机器代码组成的目标程序才能执行。这个翻译过程称为汇编。自动完成汇编过程的软件叫汇编程序。,3,5.1宏汇编语言的基本语法,5.1.1常数、变量和标号1.常数常数没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化。它可以有以下几种类型:,二进制数:以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B。八进制数:以字母o或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、十进制数:由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略字母D。例如:1234D或1234。,4,十六进制数:以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且必须以数字开头。例如:56H,0B3FH。字符串常数:用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。例如A的值是41H,而B的值是42H。因此串常量与整数常量可以交替使用。,5,总之,常数主要以立即数、位移量的形式出现在指令语句或数据定义伪指令中。,注意:为了区别由AF组成的一个字符串是十六进制数还是英文符号,规定凡以字母AF为起始字符的十六进制数,必须在前面冠以数字“0”。,6,变量变量通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。,变量的三个属性:(1)段属性(SEGMENT):表示变量所在段的段首地址(2)偏移属性(OFFSET):表示变量的偏移地址(3)类型属性(TYPE):表示变量占用存储单元的字节数。,变量名表示数据在段中的有效地址,由用户指定。变量名是可选的,如果使用变量名,它代表数据区中第一个数据项的地址。,7,变量是用数据定义伪指令DB、DW、DD等定义的。DB字节DW字(2字节)DD双字(4字节)注意:变量也可以定义为一个数据区或存储区,但变量名仅表示该数据区或存储区的第一个数据单元(即数据区或存储区的首地址)。,8,标号表示一条指令所在的地址,也是指令语句的地址符号,常用作转移指令(包含子程序调用指令)的操作数,即目标地址。通常由字母数字串组成,但第一个字符必须为字母。最多允许使用31个字符,且可以使用下划线(-)使标号容易阅读。,9,标号的三个属性:(1)段属性(SEGMENT):表示标号所在段的段基址(2)偏移属性(OFFSET):表示标号的偏移地址(3)距离属性(类型属性TYPE):表示标号作为段内或段间的转移属性,距离属性分为两种:NEAR(近):表示本标号只能被标号所在段内的转移和调用指令访问(即段内转移)。FAR(远):表示本标号可以被其他段(不是标号所在段)的转移和调用指令访问(即段间转移)。,10,5.1.2运算符与表达式,11,运算符主要包括以下6种类型:算术运算符包括:+、-、*、/、MOD(求余)、SHL(左移)和右移(SHR)例:CONT=14*4CONT=CONT/8MOVAL,21HSHL2,2.逻辑运算符包括:AND、OR、XOR和NOT。只适用于对常数进行逻辑运算。例:ANDDX,PORTAND0FEH,12,3.关系运算符包括:EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。结果:若关系为假(不成立),结果为0;若关系为真(成立),结果为0FFH或0FFFFH。例:MOVBX,PORTLT5例:MOVBX,(PORTLT5)AND20)OR(PORTGE5)AND30)当PORT5时,等价MOVBX,30,13,分析操作符(数值返回运算符)取地址的偏移量格式:OFFSET变量名或标号功能:取变量名或标号所在段的段内偏移量。取段基址格式:SEG变量名或标号功能:取变量名或标号所在段的段首地址。,14,求变量名或标号的类型值格式:TYPE变量名或标号功能:返回一个数字值。若TYPE加在变量名前,返回该变量的类型属性;若加在标号前,返回该变量的距离属性。,存储器操作数的类型值,15,求长度格式:LENGTH变量名功能:返回一个变量名所占存储单元(字节、字或双字)的数目。若变量是用重复定义子句说明的,则返回DUP前面的数值;其余返回1。,求大小格式:SIZE变量名功能:返回变量名所占存储单元的字节数,它等于LENGTH和TYPE两个运算符返回值的乘积。,16,综合运算符(1)PTR运算符格式:类型PTR表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令内有效。,例:MOVBYTEPTRDI,4;指明目的操作数为字节类型JMPDWORDPTRBP;指明目的操作数为双字类型,17,(2)THIS运算符格式:THIS类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。例:AEQUTHISBYTEBDW20DUP(?)说明:A、B对应同一存储器地址,对变量A为字节访问,对变量B为字访问,且A和B具有相同的段基址和偏移量。,18,例:将数据表原来按字节定义使用,现改为按字定义使用。WBUFFER1EQUTHISWORDBUFFERDB100DUP(0)二者段地址,偏移地址相同,类型不同。,注:THIS使下面的原标号或原变量有新的名字和类型,但不分配新的存储单元。,19,其他运算符HIGH和LOW运算符格式:HIGH表达式LOW表达式功能:从运算对象中分离出高字节或低字节。例:K1EQU1234HMOVAL,LOWK1;AL34HMOVBL,HIGHK1;BL12H,20,SHORT运算符格式:SHORT标号功能:当转移的目标地址与本转移指令的下一条指令之间的字节距离在-128127范围时,可以用SHORT运算符进行说明。例10:L1:JMPSHORTL2L2:MOVAX,BX,7.运算符的优先级别(P122表5-2),21,5.2伪指令8086宏汇编语言有两种类型的语句:指令语句:在汇编过程中被翻译成相应的目标代码,经连接后生成可执行的机器指令代码。伪指令语句:(指示性语句)在汇编时被解释执行,由汇编程序来处理的一类操作,如数据定义,分配存储器等。,在伪指令语句的前面,可以是常量名、变量名、段名和过程名等。标号后用“:”在指令语句中,表示该语句的伪操作功能。定义符由汇编程序规定,宏汇编程序中使用了数十种定义符。,可以是常数(二、十、十六进制等)、字符串、常量名、变量名、标号和一些专用符号等。,任选字段,必须以分号开始,和指令语句的注释的功能一样。,5.2.1伪指令语句的格式格式:符号名定义符操作数;注释,22,5.2.2常用伪指令符号定义伪指令(赋值语句)等值伪指令格式:符号名EQU表达式功能:将表达式的值赋给符号名。例:ALFAEQU100COUNTEQUALFA注意:符号名一旦被EQU定义,就不能再赋值,即不能用EQU再为符号名重新赋值。,23,等号伪指令格式:符号名=表达式功能:将表达式的值赋给符号名。说明:可以在程序中不同的地方多次使用以重新为符号名赋值。例:ALFA=100MOVAL,ALFA;AL100ALFA=ALFA+2;ALFA=102,24,(3)定义符号名伪指令格式:符号名LABEL类型功能:定义一个标号或变量,并指定其类型。例:BARYLABELWORD;定义BARY为字类型,25,数据定义伪指令格式:变量名DB表达式;定义字节变量名DW表达式;定义字变量名DD表达式;定义双字变量名DQ表达式;定义8个字节变量名DT表达式;定义10个字节表达式是赋给变量的初始值,可以有一个,也可以有多个,常见的有以下几种:,26,数值表达式实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。若要定义多个相同类型的数据,可用逗号把这些数据隔开,并依次分配在相邻的存储单元。,例:BUFDB20H,30HBUF1DW100DATDW1234H,5678H;字变量DAT的内容为1234H,占用两个字节单元,下一个字单元即DAT+2单元的内容为5678H,仍是低字节存在低地址单元。,BUF,DAT,BUF1,27,ASCII字符串字符串必须用引号括起来,并且不超过256个字符,它们在内存中按地址递增顺序自左向右依次存放字符的ASCII码。例:STRINGDBABCSTRING1DBHowareyou?,STRING,STRING1,28,?为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。例:RESULTDB?;预置一个字节单元,其值不定ABCDB12H,?,?,24HDEFDW?,895H,?,29,重复定义子句DUP可以为若干个重复数据分配存储单元。格式:nDUP(表达式)说明:n:重复次数表达式:重复的内容例:CDB100DUP(0)TABDB100DUP(5DUP(1),2)注意:(1)DUP操作可以嵌套。(2)在定义变量及存储单元的同时,也定义了它们的类型属性。同一数据定义语句所定义的各存储单元具有相同的类型。,30,例:DA1DB3DUP(5,?,6);从DA1地址单元开始存放三组“05H,预留,06H”共9个地址单元DA2DW40DUP(?);从DA2地址单元开始保留40个字共80个地址单元DA3DB10DUP(1,2,3DUP(30,4);从DA3地址单元开始存放十组“01,02,30,04,,30,04”,共占用80个字节。,31,DA1,DA3,共10组,32,段定义伪指令格式:段名SEGMENT定位类型组合类型类别名段体段名ENDS功能:把模块化分为若干个逻辑段。每个SEGMENT/ENDS可定义一个逻辑段。,段体为段内的语句序列,33,4.段寄存器说明伪指令格式:ASSUME段寄存器:段名,段寄存器:段名功能:向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段的对应关系。注意:本伪指令只是指示各逻辑段使用寄存器的情况,并没有对段寄存器内容进行装填。段寄存器的实际值(CS除外)还要由MOV指令在程序中装填数据。也可用来取消段寄存器与段之间的对应关系(用NOTHING),然后再建立新的对应关系。,34,例:ASSUMEDS:NOTHINGASSUMEDS:DATABMOVAX,DATABMOVDS,AX,35,过程定义伪指令过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。格式:过程名PROCNEAR/FAR过程体RET过程名ENDP,自定义符,开始、结束要相同;有三个属性(段地址,偏移地址和距离属性),可有多个RET,一般作为最后一条指令,36,例:CODESEGMENTAPRCPROCNEARADDAX,BXRETAPRCENDPSTART:MOVAX,NOMCALLAPRCCALLAPRC.CODEENDSENDSTAR,37,模块定义及通信伪指令汇编语言可以把程序划分成许多模块,并对每个模块独立地进行汇编和调试。模块开始伪指令格式:NAME模块名功能:指明程序模块的开始,并指出模块名。说明:模块名是自定义符,不能是系统保留字。若该项缺省,则取TITLE语句中的页标题6个字符;若没有TITLE语句,则取源程序文件名为模块名。,38,模块结束伪指令(源程序结束伪指令)格式:END启动标号或过程名功能:END表示一个模块(源程序)的结束。通知汇编程序源程序到此结束,并给出执行程序的入口位置。例:START:MOVAX,DATAENDSTART,注意:1)END与NAME联合使用,当NAME缺省时,END只表示源程序的结束。2)汇编处理只进行到END为止。,39,5.3宏指令宏定义及其调用宏定义格式:宏指令名MACRO形参,形参,宏体ENDM宏调用的格式为:宏指令名实参,实参,例:为了实现ASCII码和BCD码之间的相互转换,往往需要把AL中的内容左移或右移4位。设左移4位,可用下列指令序列实现:MOVCL,4SALAL,CL,40,若多次使用,则可用一条宏指令来代替,宏定义如下:SHIFTMACROMOVCL,4SALAL,CLENDM例24:MOVAL,DIADDAL,SISHIFT;宏调用MOVBX,AL,41,2.带参数的宏SHIFTMACROXMOVCL,XSALAL,CLENDMSHIFT4,42,5.4汇编语言程序的结构5.4.1汇编语言源程序的结构一个标准的汇编语言源程序的框架结构:DATASEGMENTDATAENDSSTACKSEGMENTPARASTACKSTACK;STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AX,定义堆栈段,定义数据段,定义代码段,43,MOVAX,STACKMOVSS,AXMOVAH,4CHINT21HPRAPROCNEARPRAENDPCODEENDSENDSTART,44,5.4.2汇编语言和DOS操作系统之间的接口,操作系统为每一个用户程序建立了一个程序段前缀区PSP,长度为256个字节,主要存放执行程序的有关信息以及程序和操作系统的接口。在PSP的开始处(偏移地址IP=0000H)安排了一条INT20H软中断指令,执行该服务程序后控制就转移到DOS。代码段在程序段前缀区PSP后面,之后是数据段,堆栈段。,45,CODESEGMENT:STARTPROCFARPUSHDSMOVAX,0PUSHAX:RETSTARTENDPCODEENDSENDSTART,46,结束用户程序返回DOS有两种方法:1:MOVAH,4CHINT21H2:INT20H,47,5.5DOS系统功能调用MS-DOS系统中设置了几十个内部子程序,在汇编语言源程序中可采用软中断指令调用它们。MS-DOS中常用的软中断有8条,系统规定它们的中断类型码为20H27H,INT21H是DOS系统功能调用。INT21H中断本身包含很多子程序,调用它们时采用统一的格式:1)传送入口参数到指定寄存器中2)功能号送入AH寄存器3)INT21H,48,1.键盘输入单字符1号系统功能调用格式:MOVAH,1INT21H功能:无入口参数,执行时,系统等待键盘输入,待按下任何一键,系统先检查是否是CtrlBreak键。若是则退出,否则将键入字符的ASCII码置入AL中,并在屏幕上显示该字符。,49,2.键盘输入字符串0AH号系统功能调用功能:将键盘输入的字符串写入到内存缓冲区中,必须事先定义一个缓冲区。缓冲区的第一个字节:该缓冲区存放的字节数。第二个字节:预留,系统填写实际的字符数。从第三个开始:存放字符串,回车(0DH)表示结束。,格式:BUFDB20DB?DB20DUP(?)MOVDX,OFFSETBUFMOVAH,0AHINT21H,50,3.输出单字符2号系统功能调用格式:MOVDL,AMOVAH,2INT21H功能:将DL中的字符送屏幕显示。,51,输出字符串9号系统功能调用功能:将指定的内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串以“$”为结束标志。格式:BUFDBGOODBYE$MOVDX,OFFSETBUFMOVAH,9INT21H结果:显示GOODBYE,5.返回操作系统4CH号系统功能调用格式:MOVAH,4CHINT21H,52,例:利用DOS系统功能调用实现简单人机对话。DATASEGMENTBUFDB100DB?DB100DUP(?);定义键入缓冲区MSGDBWHATISYOURNAME?$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,53,DISP:MOVDX,OFFSETMSGMOVAH,9;调用9号功能调用INT21H;显示字符串KELBD:MOVDX,OFFSETBUFMOVAH,0AH;调用0AH功能调用INT21H;接收键入的字符串MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART,54,5.6汇编语言程序设计方法5.6.1汇编语言程序设计步骤1)分析问题2)建立数学模型3)确定算法4)绘制程序流程图5)内存空间分配6)编制程序与静态检查7)程序调试,55,5.6.2汇编语言程序设计方法1.简单程序设计例:假设有多项式形如:f(X)=5X3+4X2-3X+2,要求编制程序计算自变量X=5时函数f(X)的值。,DATASEGMENTXDW5RESULTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,分析:f(X)=(5X+4)X3)X+2,程序:,56,MOVAX,5MULXADDAX,4MULXSUBAX,3MULXADDAX,2MOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART,57,(1)简单分支结构有两种,相当于高级语言中的IF-THEN和IF-THEN-ELSE结构;例:比较两个无符号数的大小。(在A和B单元各有一个8位无符号数,要求比较这两个无符号数,并根据比较结果在屏幕上显示AB或BA(假设这两个数不相等)。,2.分支程序设计,DATASEGMENTADB20HBDB92HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,58,MOVAL,ACMPB,ALJABGAMOVDL,AMOVBL,BJMPDISPBGA:MOVDL,BMOVBL,ADISP:MOVAH,2INT21HMOVDL,INT21HMOVDL,BLINT21H,MOVAH,4CHINT21HCODEENDSENDSTART,59,(2)多分支程序设计多分支结构则相当于高级语言中的DO-CASE结构。,60,3.循环程序设计循环程序的结构与组成循环的初始化部分循环工作部分循环控制部分循环结束部分相当于高级语言中的DO-UNTIL结构DO-WHILE结构。循环控制方法计数法条件控制法在汇编语言程序设计中常采用CX作为循环计数器,61,例:统计负数个数并显示。已知从BUF单元开始存有20个8位带符号数,要求统计其中的负数个数放在NEGA字节单元,并显示在CRT上(设负数个数在09之间)。,DATASEGMENTBUFDB2,-1,56,-38,4,COUNTEQU20NEGADB?DATAENDS,CODESEGMENTASSUMECS:CODE,DS:DATA,62,START:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFMOVDL,0;计数器清0MOVCX,COUNT;置循环次数LP:MOVAL,SIANDAL,AL;置标志位JNSNEXT;SF=0(正数),转NEXTINCDL;为负,计数器+1NEXT:INCSILOOPLPMOVNEGA,DL;存结果ORDL,30H;转换成ASCII码MOVAH,2INT21H;显示,63,MOVAH,4CHINT21HCODEENDSENDSTART,64,例:统计字符串长度。已知在内存中从STR单元开始放有一串字符,以$作为结束标志,长度不超过100字节,要求统计该字符串的长度,并存于LEN单元。,DATASEGMENTSTRDBABCDJKLLHH$LENDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,65,LEADI,STR;字符串首地址DIMOVAL,$;结束标志ALLP:CMPAL,DI;比较,是否为$JZSTOP;是$(ZF=1),转STOPINCLEN;不是,串长+1INCDIJMPLPSTOP:MOVAH,4CHINT21HCODEENDSENDSTART,66,5.6.3程序设计举例例1:多字节压缩型十进制数加法(减法)已知有两个多字节的压缩型十进制数分别存于从A和B单元开始的数据区中,试将其相加并将十进制结果存于从C单元开始的数据区中。设压缩型十进制数长度为10个字节,被加数、加数和结果的低字节均存于低地址单元。,67,DATASEGMENTADB12H,38H,63H,BDB88H,27H,42H,CDB11DUP(?)NEQU10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETAMOVDI,OFFSETBMOVBX,OFFSETC,68,MOVCX,NCLCNEXT:MOVAL,SIADCAL,DIDAAMOVBX,ALINCSIINCDIINCBXLOOPNEXTMOVAL,00HADCAL,00HMOVBX,AL,MOVAH,4CHINT21HCODEENDSENDSTART,69,例2:已知从A单元开始存有10个字节的压缩BCD码,要求编程将其转换

温馨提示

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

评论

0/150

提交评论