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

下载本文档

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

文档简介

第4章80X86汇编语言程序设计,本章的内容有:MASM宏汇编语句结构以及开发过程MASM汇编语言表达式、运算符程序段的定义和属性复杂数据结构宏汇编基本汇编语言程序设计子程序设计高级汇编语言程序设计,DATASEGMENTW1DB00H,11H,22H,33H,$W2DW4142H,0A0BHDATAENDSSTACK1SEGMENTDW100HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXCODEENDSENDSTART,4.1MASM宏汇编语句结构以及开发过程,4.1.1汇编语言程序的语句类型和格式1语句的类型硬指令语句(指令性语句)是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成。伪指令语句(指示性语句)是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。所以伪指令语句是汇编程序在汇编时用的,不产生机器码。宏指令语句它是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。,指令性语句是计算机可执行的,而伪指令不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。这两种语句的差别:在形式上:带不带冒号,是否可转向它.在本质上:汇编时能否形成对应的机器码.,2语句的格式汇编语言源程序由语句序列构成。汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM6.0开始可以是512个字符),(1)执行性语句标号:硬指令助记符操作数,操作数;注释(2)说明性语句名字伪指令助记符参数,参数;注释,汇编语言中,用来标识某种数据结构名称(如变量、标号、过程名等)的有效字符序列称为标识符。MASM的标识符组成规则如下:(1)标识符有效长度131个字符;(2)标识符由字母(大写或小写的英文字母),数字或某些特殊字符如$:?等组成(3)第一个字符必须是字母,不允许用数字开头,也不允许用特殊符号单独作为标识符;(4)标识符不能使用系统专用字,如AX(寄存器名),MOV(助记符)等。,4.1.2汇编语言的程序格式,在实地址模式和虚拟8086模式下,按照逻辑段组织程序,具有代码段、数据段、附加段和堆栈段。一个汇编语言源程序可以包含若干个代码段、数据段、堆栈段或附加段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始位置,一个程序只有一个起始位置。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。,两种格式书写第一种格式是从MASM5.0开始支持的简化段定义格式(但其中的两个指令.STARTUP和.EXIT是6.0版本才引入的)。第二种格式是MASM5.0以前版本就具有的完整段定义格式。,例4.1简化段定义的源程序格式STACK;定义堆栈段DATA;定义数据段STRINGDBHello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串CODE;定义代码段STARTUP;说明程序起始位置,并建立DS、SS内容(注1)MOVDX,OFFSETSTRING;指定字符串在数据段的偏移地址MOVAH,9INT21H;利用DOS功能调用显示信息EXIT0;程序结束点,返回DOS(注2)END;汇编结束(注3),DATASEGMENTW1DB00H,11H,22H,33H,$W2DW4142H,0A0BHDATAENDSSTACK1SEGMENTDW100HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXCODEENDSENDSTART,完整段定义格式,4.1.3汇编语言程序的开发过程,4.2MASM汇编语言表达式、运算符,4.2.1常量、运算符及表达式1.常量(1)数字常量二进制常量,以B结尾八进制常量,以Q结尾十进制常量,以D结尾或省略十六进制常量,以H结尾,如0A8C6H,(2)字符串常量用单引号引起来的字符或字符串也代表常数。例如:A;汇编时被翻译成对应的ASCII码41HBCDE;汇编时被翻译成对应的ASCII码42H,43H,;44H,45H,(3)符号常量利用一个标识符表达的一个数值。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。MASM提供等价机制,用来为常量定义符号名,符号定义伪指令有“EQU”和“”。,2运算符,3、运算符的优先级,4.表达式表达式是常量、寄存器、标号、变量与一些运算符组合的序列,分数字表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。,(1)数字表达式(numberexpression)数字表达式一般是指由运算符连接的各种常量所构成的表达式。例如:MOVDX,(6*A-B)/2源操作数(6*A-B)/2是一个表达式。若设变量A的值为1,变量B的值为2,则此表达式的值为(6*1-2)/22,是一个数字结果,此表达式是数字表达式。,(2)地址表达式(addressexpressions)地址表达式的结果是一个存储单元的地址。例如,MOVAX,ES:BX+SI+1000H其中,BX+SI+1000H为地址表达式,结果是一个存储单元的地址。,4.2.2变量及其属性1变量定义伪指令变量是存储器中某个数据区的名字,在指令中可以作为存储器操作数。变量定义伪指令可为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。该类伪指令是最经常使用的伪指令。格式:变量名伪指令初值表,说明:变量名是用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。初值表是用逗号分隔的参数,主要由数值常量,表达式或?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为:重复次数DUP(重复参数),(1)定义字节单元伪指令DB功能:定义变量的类型为BYTE,给变量分配字节或字节串。要求:初值表中每个数据一定是字节量。例如:DATASEGMENT;数据段XDBa,5DB2DUP(100),?YDBABCDATAENDS,(2)定义字单元伪指令DW功能:定义变量的类型为WORD,给变量分配一个或多个字单元,并可以将它们初始化为指定值。要求:初值表中每个数据一定是字(Word)。(3)定义双字单元伪指令DD功能:定义变量的类型为DWORD,用于分配一个或多个双字单元,并将它们初始化为指定值。要求:初值表中每个数据是一个32位的双字。,2变量和标号的属性变量、标号、段名及过程名都表示的是地址,那么,这些标号和名字一经定义便具有以下三种属性:段值:标号和名字对应存储单元所在段的段地址。偏移值:标号和名字对应存储单元所在段的段内偏移地址。类型:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节),WORD(字)和DWORD(双字)等。,4.3程序段的定义和属性,1.段定义伪指令SEGMENT/ENDS2.指定伪指令ASSUME3.源程序结束伪指令,1.段定义伪指令SEGMENT/ENDS,格式:段名SEGMENT定位组合字长类别(段体);语句序列段名ENDS伪指令名SEGMENT和ENDS是本语句的关键字,不可以默认,并且总是成对出现的。语句中段名是必选项,定位类型、组合类型、字长选择、分类名为可选项。段名是程序员为该段起的名字,不能省略,用来指出为该段分配的存储区的段地址,一个段开始与结尾用的段名应一致。,2.指定伪指令ASSUME,格式:ASSUME段寄存器:段名,段寄存器:段名,功能:说明源程序中定义的段由哪个段寄存器去寻址。段寄存器可以是CS,SS,DS、ES注意:格式中,ASSUME是伪指令名,是语言中的关键字,不可默认。段寄存器名后面必须有冒号,如果分配的段名不止一个,则应用逗号分开。,下面是一段源程序:DATASEGMENTW1DB00H,11H,22H,33H,$W2DW4142H,0A0BHDATAENDSSTACK1SEGMENTDW100HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXCODEENDSENDSTART,问题:段寄存器的装入ASSUME语句只建立当前段和段寄存器之间的联系,但并不能将各段的段基值装入各个段寄存器。段基值的装入是用程序的办法,六个段寄存器的装入也不相同。除代码段CS和堆栈段SS外,其他定义的段寄存器(DS或ES)由用户在代码段起始处用指令进行段基址的装入。例如:MOVAX,DATAMOVDS,AX,3.源程序结束伪指令,格式:END表达式功能:该语句标志整个程序的结束,是源程序的最后一条语句。表达式为程序入口指令的标号。例如:ENDSTART,返回本节,4.6基本汇编语言程序设计,汇编语言源程序主体(代码段)可以有顺序、分支、循环、子程序和宏等结构。早期版本的汇编程序不直接支持结构化程序设计,可以用微处理器指令系统中的转移指令、循环指令、子程序调用及返回指令,实现程序的各种结构形式。,一概述,1汇编语言程序设计的一般步骤2流程图,返回本章首页,汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤:1分析问题,确定算法2绘制流程图3根据流程图编制程序4调试程序,返回本节,流程图,1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示(1)起止框:表示程序的开始和结束。,起止框,(2)判断框,(3)处理框,(4)调用框,(5)指向线,返回本节,二顺序程序设计,例4.16求两个数的平均值。这两个数分别放在X单元和Y单元中,而平均值放在Z单元中。DATASEGMENTXDB8CHYDB64HZDB?DATAENDS,START:MOVAL,X;AL8CHADDAL,Y;AL8CH+64HMOVAH,00H;AH00HADCAH,00H;进位送AHMOVBL,2;除数2BLDIVBL;AX除以BL的内容,;商AL,余数AHMOVZ,AL;结果送入Z单元,思考从键盘读入两个一位数(假设按下的肯定是数字键),编程序显示它们的乘积。,CODESEGMENTASSUMECS:CODESTART:MOVAH,1INT21HMOVBL,ALMOVAH,1INT21HSUBAL,30HSUBBL,30HMULBL;积在AX中MOVBL,10DIVBLADDAX,3030H,MOVBX,AXMOVDL,BLMOVAH,2INT21H;输出十位数MOVDL,BHMOVAH,2INT21H;输出个位数MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART,三分支程序设计,单分支IFTHEN双分支IFTHENELSE条件转移Jcc和无条件转移JMP指令用于实现程序的分支结构。JMP指令仅实现了转移到指定位置,Jcc指令则可根据条件转移到指定位置或不转移而顺序执行后续指令序列。,单分支与双分支,1单分支结构,例4.18计算AX中符号数绝对值的程序段。CMPAX,0JGENONNEG;分支条件:AX0NEGAX;条件不满足,负数,;执行分支体进行求补NONNEG:MOVRESULT,AX;条件满足,;为正数,保存结果,另一种方法:CMPAX,0JLYESNEG;分支条件:AX0思考:符号函数y=0 x=0其中x为8位带符号数。-1x0转移MOVAL,0;0送YYJMPJUS2;隔离JUSl:MOVAL,1;1送YYJUS2:MOVYY,ALMOVAH,4CHINT21HCODEENDSENDSTART,四循环程序设计,1循环结构循环初始部分:开始循环准备必要的条件,如循环次数、循环体需要的初始值等。循环体部分:是循环工作的主要部分,是为完成某种特定功能而设计的重复执行的程序段。修改部分:对循环条件、相关信息(如计数器的值、操作数地址等)进行修改的程序段。循环控制部分:判断循环条件是否成立,决定是否继续循环。,例:现将以AREA1为首地址的100个字节数据搬移到以AREA1为首地址的内存中去。,DATASEGMENTAREA1DB100DUP(?)AREA2DB100DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100AGAIN:MOVAL,SIMOVDI,AL,INCSIINCDILOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART,补充常用的DOS功能调用,DOS系统功能调用的方法一般可分为以下几步:设置所要调用功能的入口参数。在AH寄存器中存入所要调用功能的功能号。INT21H指令自动转入中

温馨提示

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

评论

0/150

提交评论