您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 建筑材料 > 微机原理与接口技术第四版第四章
第四章汇编语言程序设计通过本章的学习,应掌握以下内容:•熟悉汇编语言的程序结构、语句的格式。•掌握汇编语言常用伪指令的使用方法。•掌握顺序、分支、循环、串操作、子程序的设计方法§4.1汇编语言程序格式4.1.1指令性语句和伪指令语句一、汇编语句的类别⑴指令语句用助记符表示的机器指令,能有汇编程序会变为相应的能被CPU识别并执行的目标代码。如:MOV、SUB等指令指令语句经汇编后产生机器代码⑵伪指令语句指示性语句,向汇编程序提供汇编过程要求的辅助信息,经汇编后不产生机器代码。如:给变量分配内存单元地址二、汇编语言的语句格式1、汇编源程序中的指令语句一般由4项组成:[标号:]操作项[操作数项][;注释项]如:START:MOVA,30H;A←(30H)2、汇编源程序中的伪指令语句格式:[变量名]伪指令定义符项[参数…参数][;注释项]如:BUFDW1,3三、汇编语句的组成部分1.标号和变量名标号是指令性语句中反映指令地址的标识符,后跟冒号分隔变量名是伪指令语句中是反映伪指令位置和属性的标识符,后跟空格分隔⑴源程序中用下列字符表示标号和变量名①字母:A~Z或a~z②数字:0~9③特殊字符:?、•、@、―、$⑵注意①标号或变量名第一个字母必须是字母或特殊字符②?不能单独作为标号或变量,•号若出现必须置于第一位③标号或变量最多由31个字符组成④汇编语言对大小写不敏感⑤一个程序中,标号和名字的定义是唯一的,不能是汇编语言采用的保留字保留字保留字(ReservedWord)是汇编程序已经利用的标识符,主要有:o硬指令助记符——例如:MOV、ADDo伪指令助记符——例如:DB、EQUo操作符——例如:OFFSET、PTRo寄存器名——例如:AX、CSo预定义符号——例如:@data2.操作项操作项可以是指令、宏指令或伪操作的助记符。它是指令语句中的关键字,不可缺省。必要时可在指令助记符的前面加上一个或多个“前缀”,从而实现某些附加操作。3.操作数项操作数是本指令执行需要的数据。操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。常见形式:常数、寄存器、标号、变量、表达式等4.注释项注释项为可选项,用来说明程序或语句的功能,增加程序可读性。在翻译源程序时跳过该部分,不做任何处理必要时,一个语句行也可以由分号开始作为阶段性注释一、常数在8086源程序运行期间不会变化的值称为常量。常量有数字常量和字符串常量两种。1、数值常数Ⅰ.二进制常量:以字母B结尾Ⅱ.十进制常量:以字母D作结尾Ⅲ.八进制常量:以字母Q或O结尾。Ⅳ.十六进制常量:以字母H结尾,凡是以字母A~F开始的十六进制数,必须在前面加上数字0。例如56H、0BA3FH等。2、字符串常量用单引号括起来的一个或多个字符的序列,也可用ASCII码表示字符,此时不用单引号。如:MOVAH,‘C’等价于MOVAH,43HCMPAX,‘ab’等价于CMPAX,6162H4.1.2数据项二、变量定义变量即是给变量分配内存单元。有段、偏移及类型三种属性。同一个变量在一个程序中只能定义一次。①段属性:定义变量的段起始地址。②偏移属性:表示段内偏移地址。③类型属性:代表该变量能存放的数据长度。(DB、DW、DD、DQ)三、标号出现在指令语句之前,后面跟冒号:,表明该指令在存储器中的位置。具有三种属性。①段属性:定义标号的段起始地址,一定在CS寄存器中。②偏移属性:表示标号在代码段内的偏移地址,16位无符号数。③类型属性:指出该标号是在本段引用(NEAR)还是在其他段内引用(FAR)1、数值表达式由算术运算符、关系运算符、逻辑运算符连接常数所组成的有意义的式子。运算结果通常是数值常数,只有大小,没有属性。2、地址表达式由变量、标号、常数、寄存器的内容和运算符连接起来组成的有意义的式子。运算结果通常不是单纯的数值,从物理意义来说,代表存储器单元的地址,或总是和存储地址相联系。4.1.3表达式Ⅰ.运算符a.算术运算符(+、-、*、/、MOD、SHL、SHR)如:①MOVAH,2*4-5;MOVAH,3②MOVAL,0101BSHL2*2;MOVAL,01010000Bb.逻辑运算符(AND、OR、XOR、NOT)如:ORAL,03HAND05H;ORAL,01Hc.关系运算符①EQ(相等Equal)②NE(不相等Notequal)③LT(小于Less)④LE(小于或等于LessorEqual)⑤GT(大于Greater)⑥GE(大于或等于GreaterorEqual)用两个表达式比较,比较结果为逻辑值,关系成立用全“1”表示,关系不成立用全“0”表示,即0如:①MOVAX,1354HGE1024H;MOVAX,0FFFFH②MOVAL,1354HGE1024H;MOVAL,0FFH③MOVAL,1354HEQ1024H;MOVAL,0Ⅱ.数值返回运算符a.SEG—取段基址运算符格式:SEG变量或标号功能:回送变量或标号的段地址值。例:MOVAX,SEGBUFb.OFFSET—取偏移地址运算符格式:OFFSET变量或标号功能:回送变量或标号的偏移地址值,功能类似于LEA指令例:MOVSI,OFFSETBUF类似:LEASI,BUFc.TYPE—取类型运算符格式:TYPE变量或标号功能:以数值形式返回变量或标号的类型⑴变量:回送变量以字节数表示的类型,DB为1,DW为2,DD为4⑵标号:则回送代表该标号类型的数值:NEAR为-1,FAR为-2例:设有定义DA1DB75H,0AH执行指令MOVAL,TYPEDA1d.LENGTH—取变量含数据存储单元个数运算符格式:LENGTH变量功能:取出变量的长度;取决于数据定义伪指令后面第一个表达式的形式(无DUP时为1,为DUP时为DUP前面的值)。例:设定义①A1DB‘ABCD’,6DUP(0)②A1DB6DUP(0),‘ABCD’执行MOVBL,LENGTHA1e.SIZE—取变量含数据存储区大小运算符格式:SIZE变量功能:回送LENGTH分配给该变量的总的字节数=LENGTH*TYPE。例:设定义A1DW6DUP(0),4321H执行MOVBL,SIZEA1Ⅲ.PTR—属性定义运算符格式:类型PTR地址表达式功能:将地址表达式类型属性临时修改为指定类型例:⑴MOV[SI],20H⑵MOVBYTEPTR[SI],20H⑶MOVWORDPTR[SI],20H注意:PTR操作不分配存储单元,只能暂时强制指定变量或标号的类型Ⅳ.其他运算符()功能:用来改变运算符的优先级别,()中的运算符具有最高优先权[]功能:用来表示地址表达式或多重变量的下标值优先级(),[],LENGTH,SIZEPTR,OFFSET,SEG,TYPE,*,/,MOD,SHL,SHR+,-EQ,NE,LT,LE,GT,GENOTANDOR,XOR§4.2伪指令语句伪指令是不可执行的,它只是在源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等信息,不属于指令系统,不产生机器代码。4.2.1数据定义伪指令一、变量定义的作用功能:变量定义伪指令用来为数据分配内存空间,并可根据需要设置相应内存单元的初始值格式:[变量名]变量定义符操作数[,…,操作数]说明:1、变量名为可选项,是一个符号地址,表示该语句定义操作数项的首地址2、变量定义符的种类⑴DB:定义字节,后面的每个操作数占1个字节。⑵DW:定义字,后面的每个操作数占2个字节。⑶DD:定义双字,后面的每个操作数占4个字节。⑷DF:定义三字,后面的每个操作数占6个字节。⑸DQ:定义四字,后面的每个操作数占8个字节。⑹DT:定义五字,后面的每个操作数占10个字节。3、操作数形式⑴数值表达式例:DATADB18H,30⑵ASCII码字符串功能:定义字符串须将字符串用单或双引号括起,并使用DB伪指令,将串中的每一个字符的ASCII码依次存储例:STRDB‘A’,‘B’,‘C’等价于:①STRDB‘ABC’②STRDB“ABC”③STRDB41H,42H,43H⑶?功能:定义没有初值的操作数项。只分配存储单元,不定义初始值例:DATA2DB5,?,?,8⑷DUP子句功能:重复定义某操作数格式:重复次数DUP操作数项例:BUFDW1,3,3DUP(6)DUP子句的嵌套:例:DATADW0,3,3DUP(1,2,6DUP(0))例:用示意图表明变量定义内存单元的分配情况假设该数据段从07001H开始:DATASEGMENTVAR1DB2DUP(0)VAR2DW1234HVAR3DB0,6,3DUP(1,2DUP(8))VAR4DB‘BABY’DATAENDS4.2.2表达式赋值伪指令一、等值伪指令——EQU格式:符号名EQU表达式使用说明:⑴用符号代表数值表达式或地址表达式例:①N1EQU5②N2EQU4*N1⑵用符号代表一个字符串例:STREQU“HOWAREYOU”⑶重新定义汇编语言的关键字或助记符例:①YIDONGEQUMOV②COUNTEQUDX二、等号伪指令——=格式:符号名=数值表达式例:①EMP=12②YY=20+300/4比较:⑴=后的表达式只能是常数,EQU后的表达式形式多种多样⑵EQU不能重复定义,而“=”伪指令可以重复定义。例:X=7;XEQU7X=X+3;XEQUX+34.2.3段定义伪指令定位伪指令——ORG格式:ORG〈常数表达式〉功能:指定紧跟在后的程序段存放的起始地址偏移量,即如常数表达式的值为n,则ORG伪操作可以使后续程序段的偏移地址为n。例:……ORG100HSTART:MOVAX,1234HORG500HXDW12……从0100H单元开始分配存储器。从0500H单元开始分配存储器。一、段定义伪指令汇编语言的源程序是分段的,由若干个段形成一个源程序。格式:段名SEGMENT[定位类型][组合类型][类别说明]〈…语句序列…〉段名ENDS例:DATASEGMENTADB‘ABCD’BDW12HDATAENDS说明:1、段名为本段起始名字,一定要有。程序中的段名可以与其它段同名。在同一模块中,如果有二个段同名,则后者被认为是前段的后续,属同一段。2、SEGMENT/ENDS为该段的起始和结束,必须成对使用。3、定位类型、组合类型和类别说明为可选项,可以不用,仅仅在需要连接本程序和其他程序模块时使用.二、ASSUME—段分配伪指令功能:8086必须按段来组织程序和利用存储器,设定段和段寄存器的关系,指定段分配给对应段寄存器必须是CS、DS、ES、SS中的一个格式:ASSUME段寄存器名:段名,段寄存器名:段名,…例:NAME1SEGMENT…..NAME1ENDSNAME2SEGMENT…..NAME2ENDSNAME3SEGMENTASSUMECS:NAME3,DS:NAME1,SS:NAME2BEGIN:……NAME3ENDSENDBEGIN说明:1、该伪指令指明了段与段寄存器之间关系,每组关系用逗号隔开。2、该指令出现在代码段中可执行汇编指令之前,用于指明逻辑段应以相应段寄存器寻址。一个汇编语言源程序至少有一个ASSUME伪指令指出CS对应的逻辑代码段。3、ASSUME语句中的段名可以是NOTHING,代表某个段寄存器不与任何段有对应关系例:ASSUMECS:CODE,DS:NOTHING三、汇编语言程序的结构数据段名SEGMENT变量定义数据空间预置数据段名ENDS附加段名SEGMENT变量定义数据空间预置附加段名ENDS堆栈段名SEGMENT堆栈段空间预置堆栈段名ENDS代码段名SEGMENTASSUMECS:代码段名,DS:数据段名,ES:附加段名,SS:堆栈段名START:指令1指令2……指令n代码段名ENDSENDSTART说明:⑴任一汇编程序由数据段、附加段、堆栈段、代码段组成,其中代码段必不可少。⑵变量定义和预置数据空间在数据段和附加段中进行。⑶代码段中用ASSUME指令只能指出段
本文标题:微机原理与接口技术第四版第四章
链接地址:https://www.777doc.com/doc-3156067 .html