您好,欢迎访问三七文档
第4章汇编语言程序设计本章学习目标通过本章的学习,应当掌握以下内容:•了解汇编语言的基本知识和特点。•了解汇编语言的程序结构、段定义以及语句的格式。•掌握汇编语言常用伪指令的使用方法。•了解汇编语言程序设计的基本方法:顺序结构、•分支结构、循环结构和子程序结构。•掌握程序设计中的宏指令和常用的系统功能的调用方法。4、1机器语言、汇编语言与高级语言程序设计语言通常分为3类:机器语言(MachineLanguage)汇编语言(AssemblerLanguage)高级语言(HighLevelLanguage)4、1、1机器语言和汇编语言1.机器语言(1)机器指令机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。(2)指令系统和机器语言指令系统是指特定计算机上机器指令的集合。机器语言是由指令系统以及机器指令的使用规则构成的。机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。(3)机器语言的主要特点机器语言主要具有下列两个特点:①机器语言与机器密切相关②机器语言设计程序非常困难,但容易实现高性能2.汇编语言以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。指令和伪指令的集合及其程序设计规则便构成了汇编语言。用汇编语言编写的程序就是汇编语言源程序。4、1、2汇编语言与高级语言机器语言和汇编语言都是面向机器的,是低级语言。高级语言在程序设计的简易性与代码的可移植性等方面有了质的飞跃。当然,用高级语言编写的源程序必须经过编译和连接,将其转变为可执行程序或借助于解释程序方可在计算机上运行。语言汇编语言高级语言代码效率高较低源程序可读性较差好对硬件的依附性高低程序员硬件知识高较低应用范围较广广泛汇编语言和高级语言的比较:4、1、3汇编与连接1.汇编程序汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。汇编程序是完成汇编任务的程序。2.连接程序连接程序的主要功能是实现多个目标文件及库文件的连接,并完成浮动地位的重定位。从汇编语言源程序到可执行程序的生成过程如图所示。汇编语言源程序汇编目标程序连接可执行程序4、2汇编语言源程序的结构4、2、1汇编语言的语句格式汇编语言源程序中的每个语句可以由4项组成,格式如下[name]operationoperand[;comment][名字项]操作项操作数项;注释项下面分别说明各项的表示方法。1.名字项源程序中用下列字符表示名字:字母:A~Z或a~z;数字:0~9;专用字符号:?、•、@、―、$;一般来讲,名字项可以是标号或变量。(1)标号:在代码段定义,后面跟冒号:它有三种属性:段、偏移及类型。①段属性:定义标号的段起始地址,在CX寄存器中。②偏移属性:16位无符号数。③类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。(2)变量:变量在除代码以外的其他段中定义,后面不跟冒号。它也可以用LABLE或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。①段属性定义变量的段起始地址,此值必须在一个段寄存器中。②偏移属性变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。③类型属性变量的类型属性定义该变量所保留的字节数。2.操作项操作项可以是指令、伪操作或宏指令的助记符。3.操作数项操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。4.注释项注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。4、2、2汇编语言源程序的段定义段定义伪操作的格式如下:segment-nameSEGMENT…segment-nameENDS其中删节号部分,对于DS、ES和SS来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作。此外,还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为:ASSUMEassignment,…,assignment其中assignment说明分配情况,其格式为:〈段寄存器名〉:〈段名〉其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。4、2、.3汇编语言源程序的结构汇编语言源程序的程序基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序至少要有一个代码段,通常还可能有数据段和堆栈段。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。其一般结构如下:SSEGSEGMENTSTACK〈堆栈段的内容〉SSEGENDSDSEGSEGMENTDATA〈数据段的内容〉DSEGENDSCSEGSEGMENTCODE〈代码段的内容〉CSEGENDSEND〈启动标号〉对于一般程序来说,定义太多的段只会增加程序设计的复杂性,通常需要一个代码段、一个数据段和一个堆栈段,有时可包含一个附加段。1.为什么要用ASSUME语句指令movbl,xdmovxe,bl被汇编为movbl,byteptr[0000h]movbyteptres:[0000h],bl其中,在变量xe前增加了段超越前缀ES:,这就是ASSUME的作用,也仅此而已。2.设置段寄存器的初值(1)CS与IPCS与IP的初值不能在程序中显示设置,由系统自动设置为END后指定的起始地址。(2)DS和ES、DS和ES的初值必须在程序中设置。设置方法如下:MOVAX,SEGNAMEMOVDS,AX(3)SS与SPSS与SP初值的设置方法有下列两种:在程序中显示设置,类似于DS,例如:MOVAX,SSEGMOVSS,AXMOVSP,ST_TOP若堆栈段定义时给出了参数STACK,则连接器LINK自动将SS:SP指向栈底;若未定义堆栈段,则由系统指定堆栈,SS:SP也由系统自动设置。[例4.2]:在数据段定义首地址为A的10个字符,将这10个字符以相反次序传送到附加段首地址为B的内存单元中。DSEGSEGMENTADB‘1234567890’DSEGENDSESEGSEGMENTBDB10DUP(?)ESEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXLEASI,ALEADI,BADDDI,9MOVCX,10MOVE:CLDLODSBSTDSTOSBLOOPMOVEMOVAH,4CHINT21HCSEGENDSENDSTART4、3汇编语言的运算符1.算术运算符算术运算符主要包括+、-、*、/和MOD、[]等。其中MOD是指除法运算后得到的余数。语法格式为:expr1[expr2]等价于expr1+expr2。2.逻辑运算符逻辑运算符主要包括AND、OR、XOR、NOT、SHR及SHL。逻辑操作符是按位操作的,它只能用于数字表达式中。3.关系运算符关系运算符主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于时为真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种。4.数值回送(Valuereturning)操作符它有TYPE、LENGTH、SIZE、OFFSET、SEG5种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。(1)TYPE格式:TYPEVariable或label如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。(2)LENGTH格式为:LENGTHVariable对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况则回送1。(3)SIZE格式为:SIZEVariable其汇编的值为LENGTHVariable*TYPEVariable,即回送直接分配给该变量的总的字节数。(4)OFFSET格式为:OFFSETVariable或label汇编程序将回送变量或标号的偏移地址值。(5)SEG格式为:SEGVariable或label汇编程序将回送变量或标号的段地址值。5.属性操作符属性操作符主要包括PTR、段操作符、SHORT、THIS、HIGH和LOW6种。(1)PTR格式为:typePTRexpressionPTR用来建立一个符号地址,但它本身并不分配存储器,只是用来对已分配的存储地址赋予另一种属性,使该地址具有另一种类型。(2)段操作符:用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOVAX,ES:[BX+SI]。可见它是用段寄存器地址表达式来表示的。(3)SHORT用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址±127个字节范围之内。(4)THIS格式为:THISattribute或type(5)HIGH和LOW称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。4.4伪指令构成汇编语言源程序的语句主要包括两类:指令和伪指令。指令是在程序运行期间有CPU执行的,汇编后由对应的机器代码所取代。伪指令是不可执行的,它只是在源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等信息。1、变量定义伪指令变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值,其形式为:[变量名]变量定义符操作数[,…,操作数]变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。变量定义符主要包括下列几种:(1)DB(DefineByte):定义字节,后面的每个操作数占1个字节。(2)DW(DefineWord):定义字,后面的每个操作数占1个字。(3)DD(DefineDWord):定义双字,后面的每个操作数占2个字。(4)DQ(DefineQWord):定义四字,后面的每个操作数占4个字。(5)DT(DefineTbyte):定义十字节,后面的每个操作数占10个字节。操作数可以为:(1)数值表达式;(2)ASCⅡ码字符串;(3)地址表达式;(4)?(只保存内存空间,未定义初始值);(5)DUP子句,其格式为:重复次数DUP(操作数,…,操作数),DUP子句可以嵌套。2、符号定义伪指令符号定义伪指令的基本形式为:符号名EQU表达式符号名=常数表达式功能:给表达式指定一个等价的符号名。说明:(1)=后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。(2)EQU后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。(3)EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。3、段定义伪指令汇编语言源程序由一个段或多个段组成,多数程序采用一个代码段、一个数据段和一个堆栈段。段定义由SEGMENT与ENDS伪指令实现,基本形式如下:段名SEGMENT[STACK]〈语句序列〉段名ENDS4、程序开始和结束伪操作在程序的开始可以用NAME或TITLE为模块的名字,NAME的格式是:NAMEmodule_name作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:TITLEtext表示源程序结束的伪操作的格式为:END〈启动标号〉其中标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。这里要说明两点:(1)其中关于建立过程的PROC和ENDP伪操作对将在以后的章节中说明。这里只要知道利用这一对伪操作把程序段分为若干个过程,使程序的结构更加清晰就可以了。(2)这里只定义了最基本的代码段和数据段
本文标题:微机原理11.
链接地址:https://www.777doc.com/doc-2435583 .html