您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 建筑材料 > 微机原理与接口技术――第4章
1第四章汇编语言•汇编语言基础•汇编语言的指令与伪指令•PC机汇编语言程序的基本结构•汇编语言程序设计基本技术2汇编语言•汇编语言是面向机器的程序设计语言。因计算机而异•汇编语言的一条可执行语句对应机器语言的一条指令。•汇编语言比机器语言更易阅读、编写和修改。是面向编程人员的最低级语言。•汇编语言能全面地反映计算机硬件的功能与特点。•汇编语言编写的程序的优点是,运行速度快、能充分利用硬件资源、占用存储空间少。•汇编语言广泛用于计算机系统的硬件操作程序和核心系统软件,是一切高级语言编译程序的开发工具。•汇编语言程序开发周期长,对人员素质要求高。3高级语言•脱离了(微)处理器硬件,更符合人们的习惯。•与(微)处理器硬件无关,具有很好的通用性和可移植性。•采用高级语言编程,具有比用汇编语言编程高得多的程序设计效率。•高级语言是面向应用的语言。容易学习和使用。4汇编语言程序•汇编语言:用指令的助记符、符号地址、标号等符号书写程序的一种计算机语言。一般情况下,汇编语言程序的一条语句就是计算机的一条指令。•汇编语言源程序:用汇编语言编写的程序(简称源程序)。.asm•汇编:把源程序翻译成机器语言程序(目的程序)的过程。.obj•汇编程序(assembler):完成汇编任务的程序。•连接(LINK):将程序的各个组成部分结合成一整体的程序。.exe5汇编过程(1)输入汇编语言的源文件。其扩展名为:.asm。(2)用汇编程序把.asm源文件汇编成目标文件,其扩展名为.obj,(3)用连接程序(LINK)把目标文件.Obj,及所用到的库文件或其它目标文件转换成可执行文件.EXE。6基本汇编程序和宏汇编(MacroASseMbler)•汇编程序是将汇编语言源程序翻译成机器语言的程序。•按用户要求自动分配存储区(包括程序区、数据区、堆栈区等);数制转换;计算常数表达式的值;对源程序进行语法检查,给出错误信息等功能。基本汇编程序。•宏汇编(MacroASseMbler):在基本汇编程序的基础上,允许将一组汇编语言语句序列定义为一条宏指令的汇编程序。7宏指令或宏命令•将一组汇编语言语句序列定义为一个功能块,并赋予一个名字,其表示形式尤如一条计算机指令,并且在随后的汇编语言源程序中,可以象CPU的其它指令一样使用。•宏指令或宏命令简称为“宏”MACRO。•宏可以用与原来的计算机指令一样的符号。8宏汇编程序的主要功能1)检查和编排源程序,2)对源程序中的宏指令进行展开,3)检查源程序中的语法错误,并给出出错信息,4)把源程序翻译成目标程序.obj,并产生源程序列表文件。.lst9连接程序(LINK)•把目标文件.obj,及所用到的库文件或其它目标文件转换成可执行文件,.exe文件(IBMPC)•.exe文件为可执行文件,在DOS操作系统下,直接键入该文件名即开始执行。•库文件:独立的函数过程等文件。•集成环境WAVE6000:将汇编,连接、调试、运行等集成在一个系统中。10汇编程序结构•汇编语言语句结构:标号:指令语句;注解A1:MOVAX,1234H;立即数寻址•汇编程序结构(8088MASM为例)数据段(扩展数据段)堆栈段执行代码段结束11最简单的汇编程序结构codesegmentassumecs:codestart:movax,100haddax,100hmovbx,axcodeendsendstart最简单的汇编程序只有一个段,即代码段。完整的汇编程序可以有四个段组成,分别是代码段,堆栈段,数据段和扩展数据段。12一般汇编程序结构datasegmenta1db12h……dataendsexdatasegmente1dd1234h……exdataendsstacksegment'stack'stdw100hspointequ200hstackendscodesegmentassumecs:code,ds:data,es:exdata,ss:stackstart:movax,datamovds,axmovax,exdatamoves,axmovax,stackmovss,axmovsp,spoint…………codeendsendstart13dos汇编程序结束……MOVAH,4CH;DOS功能调用INT21H;返回DOS操作系统在DOS操作系统下运行程序的过程:输入运行程序名(.exe)文件,按返回键,开始运行。运行到程序结束时执行上面指令后,DOS重新获得控制权。实验系统没有DOS操作系统,为了防止系统崩溃,程序的最后一条为:JMP$;等待14汇编程序•汇编程序中一部分语句即为用助记符表示的计算机指令系统所组成,它经过汇编后成为计算机能执行的语句。•另一部分语句不是由计算机指令组成。但它控制和指导汇编程序的工作过程。这类非计算机可直接执行的汇编语言指令称伪指令。•伪指令中最值得提到的就是所谓的宏定义。15段定义伪指令•一个完整的汇编语言源程序,通常有三个部分组成,即代码部分,数据部分和堆栈部分。8086/8088的数据部分还可进一步分为(基本)数据部分(DS)和扩展数据部分(ES)。•段定义伪指令用于对它们进行定义。•汇编时,按段生成浮动目标代码;连接时,将各模块中同名段进行组合。•8088/8086中有四个段寄存器:CS,DS,ES,SS。16段定义伪指令的格式段名segment[定位类型][组合类型][‘类别名’]…………段名ends其中,segment和ends是段定义伪指令,表示段的起始和结束,必须联合使用。由[]括起来的部分可有可无。省略号部分表示的是段主体部分。segment前的段名必须有,而ends前的段名可省略。段名只是一个符号。17段定位类型•Byte:本段可以从任意一个字节边界起始。•Word:本段必须从字的边界起始。•Para:段基址的最低4位的二进制数值必须为全0。隐含为该类型。•Page:段基址的最低8位的二进制数值必须为全0。18段类型说明•public:与其它同名段连接在一起,形成一个新的逻辑段•common:与其它的同名段具有相同的起始地址,重叠,按最大的分配空间。•None:与其它段没有关系•atexpression:本段的起始地址为由atexpression计算出来的值。它不能用来指定代码段的段基址。•stack:产生堆栈段,并把所有同名段连成一个新的逻辑段。•Memory:表示本段应被放置在所有其它段的前面(最高地址处)。第一个段作为memory段,其他段都作为common段19代码段定义伪指令codesegmentpublic‘code’;定义一个代码段assumecs:code……Start:……codeendsendstart20数据段定义伪指令DATASEGMENNTMDB2DUP(0,0);定义两个两字节的单元,并赋初值0,0XDB2DUP(30H,2DUP(4));定义两个以字节为单元的空间,每个空间又定义为,1个字节单元,并赋初值3;和两次重复的2个字节单元,赋初值4。因此共定义了6个字节的存储空间。YDW100DUP(?);定义100个字的单元。DATAENDS21堆栈段stacksegment‘stack’;定义一个堆栈段dw100dup(?)stackends定义一个堆栈段,并赋100字(200个字节)空间的。注意堆栈在存储器中的位置。22其它有关段的伪指令•assume段寄存器名:段名[,段寄存器名:段名……]•8088/8086中,段寄存器名必须是CS,DS,ES或SS之一。段名必须是用segment/ends伪指令定义过的段名。•本伪指令的功能是将定义的段与段寄存器关联起来。在assume语句中,对于CS段寄存器,它不仅把相应的段分配给CS寄存器,还由操作系统直接将段基址装入到CS寄存器中。对于其它段寄存器(DS,ES,SS),则是指定把某个段分配给哪一个寄存器,而没有将段基址装入到相应的段基址中,因此,要在程序中对DS,ES,SS赋值。•程序中不必也不能对CS寄存器赋值23程序结束标志伪指令:END•END[标号]•END表示程序结束。其中,标号用来告诉操作系统,本程序开始执行的起始地址。若有多个程序模块,连接时,只有主模块的END要带标号。其它仅用END,不带标号。•汇编程序应尽量按照程序规定的格式编写。24等值语句伪指令等值语句是为常量、变量、表达式等定义的符号名,它并不分配存储单元,换句话说等值语句定义的是一个常数值。语句格式:名字(符号)EQU表达式完成操作:把EQU右边表达式的值赋给其左边的名字(符号)。表达式可以是常数、数值表达式、地址表达式、变量、标号名或助记符等。EQU语句左边的符号名不能使用已定义过的符号名。25等值语句伪指令datasegmenta1db12hb1equa1c1equ12h+34one=1close=0night=1d1=c1VAR1EQU[BP-10]dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovbp,14movax,var1nopcodeendsendstart26等值语句伪指令•符号名以字母开头,可以包括字母、数字、下划线等。汇编语言中有一些保留的关键词,不能用作符号名。•等值语句最简单的用法是定义常数。27数据定义伪指令数据定义伪指令用于定义符号的数据类型,并且可以指明元素个数,在各分段中的相对位置,以及数据的初值等属性。它不仅定义符号,并且还分配存储单元。因此定义的是变量。数据定义语句格式:[变量名]数据定义伪指令表达式1[,表达式2,……[;注释]]定义数据类型有字节变量、字变量、双字变量、字符串变量、8个字节和10个字节的变量等。28DB伪指令以字节为单位分配或保留若干个连续存储单元。如果定义的数据是字符串,则字符串中字符的个数要小于255个。字符串用引号括起来,每一个字符分配一个字节的存储单元。按照地址递增顺序依次分配。DATA1DB15,10;定义两个字节单元,并赋初值15和10(0fh,0ah)CHARDB‘HELLO’;定义一个5个字节的字符串,并赋初值chardb‘abcde’,‘ABCDE’,1,2,3,4,‘1,2,3,4’29DW伪指令以字(两个字节)为单位分配或保留若干连续存储单元。对一个字来说,低位字节存放在低地址中,高位字节在高地址中。DATA2DW4H,3010H;定义两个字单元,并赋初值0004H,3010HDATA3DW2DUP(4888H);定义两次重复的字单元,并赋初值4888H。CHARDW2DUP(4000H,5000H)ASCIIDW‘A’,’AB’,‘ABCD’30DD伪指令•以双字(4个字节)为单位分配或保留若干个连续存储单元。同样,最高字节在内存的最高地址,依次存储。DDATA2DD4H,3010H;定义两个双字单元,并赋初值。00000004H,00003010HDDATADD0,0,?,?31DQ、DT伪指令•DQ:以4个字(8个字节)为单位分配或保留若干连续存储单元。•DT:以5个字(10个字节)为单位来定义或分配若干个连续的存储单元。•CHARDQ‘ABCDEFGH’,78H•CHARDB‘ABCDEFGH’,78H32datasegmentadb10h,2dup(0EEH),2dup(?)db2dup(30h,0afh)strdb'abcde','hello'wdw0abcdh,2345h,2dup(8765h)qqdq012345678httdt0112233445566778899aahdataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axnopnopcodeendsendstart33过程定义伪指令•专门的程序块称为过程,也称为子程序。在需要的时候通过调用指令(CALL)调用。在汇编语言中,过程用过程定义伪指令来定义和实现。其语法为:过程名PROC[类型属性](FAR/NEAR)……过程名ENDP•过
本文标题:微机原理与接口技术――第4章
链接地址:https://www.777doc.com/doc-3204232 .html