ch5汇编语言程序设计.pptx
《ch5汇编语言程序设计.pptx》由会员分享,可在线阅读,更多相关《ch5汇编语言程序设计.pptx(274页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、任何计算机实际上只能直接识别设计微处理器时所规定好的,一整套用“0”、“1”数字代码表示的机器指令。这些机器指令的全体是指令系统。不同类型的CPU,其机器语言必然是不同的。这种直接用机器指令来编制计算机程序的方法就称为机器语言程序设计。微机原理及应用课程实验教学用的单板计算机就是直接采用机器语言编程的机器。这种直接用机器语言编程的方法难度大,阅读、查错和修改程序也很不方便。通常,只有当编程者对CPU指令系统比较熟悉,编写的程序较短时,才有可能直接用机器语言来编写计算机程序。但是,单板计算机对硬件操作很直观,可以帮助大家了解和理解计算机在实际中的应用。第1页/共274页2高级语言高级语言(Hig
2、hLevelLanguage)如果说机器语言是面向机器的语言,那么高级语言(如BASIC,FORTRAN等,C等)则是“面向过程”的语言。利用高级语言编程,程序员可以完全不考虑机器的结构特点,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达式形式的语句去编制程序。利用高级语言编写的程序与问题本身的数学模型之间有着良好的对应关系,可在各种机器上通用(不同机器之间仅做少量修改)。但是,用高级语言编写的源程序并不能在机器上直接执行,需要被翻译成对应的目标程序(即机器语言程序),机器才能运行。把具有这种翻译作用的程序称为解释程序或编译程序,如图5.1所示。第2页/共274页图5
3、.1编译程序的功能示意图由于高级语言程序是在未考虑机器的结构特点的条件下编写的,因而它就不能充分利用某种具体CPU所具有的某些特性,而通过编译或解释程序生成的目标程序往往比较冗长,占有较多的内存空间,执行时间也比较长,这就限制了它在某些场合下的运用。例如,实时的数据采集、检测和在线的实时控制等,往往要求程序的目标代码尽可能少占内存并有尽可能快的执行速度,在这些场合下,使用高级语言编写的程序常常不能满足要求。第3页/共274页3汇编语言汇编语言(AssemblyLanguage)人们为了摆脱机器语言编程中原始而低级的状态,就设法采用一组字母、数字或字符来代替机器指令,这样就产生了汇编语言的概念和
4、方法。汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、阅读和检查。实际上,用汇编语言编写的汇编语言源程序就是机器语言程序的符号表示,汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的一一对应关系,故也称汇编语言为符号语言。第4页/共274页用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等)直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,
5、而且执行速度快。当然,由于源程序和所要解决的问题的数学模型之间的关系不够直观,使得汇编语言程序设计需要较多的软件开发时间,也增加了程序设计过程中出错的可能性。用汇编语言编写的源程序也需要翻译成目标程序才能被机器执行。这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,如图5.2所示。第5页/共274页图5.2汇编程序的功能示意图由于这种符号化的语言使用了用英文字母缩写表示的助记符,因此便于识别与记忆。第6页/共274页汇编程序是最早也是最成熟的一种系统软件。它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域(包括程序区、数据区、暂存区等);自动地
6、把各种进位制数转换成二进制数,把字符转换成ASCII码,计算表达式的值等;自动对源程序进行检查,给出错误信息(如非法格式,未定义的助记符、标号,漏掉操作数等)等。具有这些功能的汇编程序又称为基本汇编(或小汇编ASM)。在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令的汇编程序,就叫做宏汇编(MASM)。它包含全部ASM功能,还增加了宏指令、结构、记录等高级汇编语言功能。第7页/共274页问题:有高级语言,为什么还要学习和使用汇编语言?原因:(1)汇编语言非常接近机器语言程序,通过编制汇编语言程序,可以更清楚地了解计算机的工作过程。(2)现在的微机系统中,底层的一些功能仍然
7、靠汇编语言程序来实现。(3)汇编语言程序的效率通常高于高级语言程序。第8页/共274页5.2汇编语言源程序的格式例例5.1要求将两个5字节十六进制数相加。解:为实现上述功能,可以编写出以下汇编语言源程序。DATASEGMENT;定义数据段DATA1DB0F8H,60H,0ACH,74H,3BH;被加数DATA2DB0C1H,36H,9EH,0D5H,20H;加数DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA第9页/共274页START:MOVAX,DATAMOVDS,AX;初始化DSMOVCX,5;循环次数送CXMOVSI,0;置SI初
8、值为0CLC;清CF标志LOOPER:MOVAL,DATA2SI;取一个字节加数ADCDATA1SI,AL;与被加数相加第10页/共274页INCSI;SI加1DECCX;CX减1JNZLOOPER;若不等于0,转LOOPERMOVAH,4CHINT21H;返回DOSCODEENDS;代码段结束ENDSTART;源程序结束第11页/共274页程序结构程序结构l程序由数条语句构成,每条语句占一行。程序由数条语句构成,每条语句占一行。指令性语句指令性语句(指令语句指令语句)指示性语句指示性语句(伪指令语句伪指令语句)l分段结构分段结构程序按段编写程序按段编写,与与8086内存分段编址相对应。内存分
9、段编址相对应。每段由伪操作每段由伪操作SEGMENT开始、由开始、由ENDS结束。结束。l程序最后为程序最后为END结束语句,后跟启动地址。结束语句,后跟启动地址。启动地址指示程序开始执行的第一条语句。启动地址指示程序开始执行的第一条语句。l程序中设有返回程序中设有返回DOS的功能。的功能。使程序执行完后返回使程序执行完后返回DOS系统的命令接受状态。系统的命令接受状态。l程序中用到内存操作数时,应按操作数的程序中用到内存操作数时,应按操作数的寻址方式寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值汇编语言程序结构:汇编语言程序结构:movs.asmaaSEGMENT;数据段数据段1str1
10、DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUME CS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSBMOVAH,4CHINT21H;返回返回DOSccENDSENDstart;指指示示程程序序结结束束第12页/共274页5.2.1分段结构分段结构由例5.1可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)
11、组成,每个段以SEGMENT语句开始,以ENDS语句结束。整个源程序的结尾是END语句。这里所说的汇编语言源程序中的段与前面讨论的CPU管理的存储器的段,既有联系,又在概念上有所区别。我们已经知道,微处理器对存储器的管理是分段的,因此,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。第13页/共274页但是,以8086/8088CPU为例,它有四个段寄存器(CS,ES,SS和DS),因此CPU对存储器按照四个物理段进行管理,即数据段、附加段、堆栈段和代码段。任何时侯CPU只能访问四个物理段。而在汇编语言源程序中,设置段的自由度比较大
12、。例如,一个源程序中可以有多个数据段或多个代码段等等。一般来说,汇编语言源程序中段的数目可以根据实际需要而设定。为了和CPU管理的存储器物理段相区别,我们将汇编语言程序中的段称为逻辑段。在不致发生混淆的地方,有时简称为段。第14页/共274页在例5.1的简单源程序中只有两个逻辑段,一个逻辑段的名字是DATA,其中存放着与程序有关的数据,称为逻辑数据段;另一个逻辑段的名字是CODE,其中包含着程序的指令,称为逻辑代码段。每个段内均有若干行语句(STATEMENT),因此,可以说一个汇编源程序是由一行一行的语句组成的。下面我们来讨论汇编语言语句的类型和组成。第15页/共274页5.2.2汇编语言语
13、句的类型和格式汇编语言语句的类型和格式1语句的类型汇编语言源程序中的语句可以分为两种类型:指令语句和伪指令语句。(1)指令语句:它是能产生目标代码,CPU可以执行的能完成特定功能的语句。(2)伪指令语句:它是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。例如,告诉汇编程序已写出的汇编语言源程序有几个段,段的名字是什么;定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。显然,伪指令语句是汇编程序在汇编时使用的。第16页/共274页2.语句的格式指令语句与伪指令语句的格式是类似的。一般情况下,汇编语言的语句可以由部分构成:名字助记符操作数;注释其中带方括号的部分表
14、示任选项,可以有,也可以没有。例5.1中有如下语句:LOOPER:MOVAL,DATA2SI;取一个字节加数这是一条指令语句,其中:“LOOPER:”是名字,“MOV”是指令助记符,“AL,DATA2SI”是操作数,“;”后面是注释部分。第17页/共274页例.DATA1DB0F8H,60H,0ACH,74H,3BH;定义被加数这是一条伪指令语句,其中:“DATA1”是名字,“DB”是伪指令定义符,“0F8H,60H,0ACH,74H,3BH”是操作数,“;”后面是注释部分。下面,对汇编语言中的各个组成部分进行讨论。第18页/共274页语句结构语句结构dataSEGMENT;数据段数据段var
15、DB?dataENDScodeSEGMENT;代码段代码段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回返回DOScodeENDSENDstart例:第19页/共274页1)名字名字汇编语言语句的第一个组成部分是名字(Name)。在指令语句中,这个名字是一个标号。指令语句中的标号实质上是指令的符号地址。并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其他地方就可以引用这个标号。在例5.1中,START、LOOPER就是标号。标号后面通常有一个冒号。标号有三种属性:段、偏移量和类型。
16、第20页/共274页标号的段属性是定义标号在程序段的段地址。当程序中引用一个标号时,该标号的段值应在CS寄存器中。标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量是一个16位无符号数。标号的类型属性有两种:NEAR和FAR。NEAR标号可以在段内被引用,地址指针为2字节;FAR标号可以在其他段被引用,地址指针为4字节。如果定义一个标号时后面跟着冒号,则汇编程序确认其类型为NEAR。第21页/共274页伪指令语句中的名字可以是变量名、段名、过程名。与指令语句中的标号不同,这些伪指令语句中的名字并不总是任选的,有些伪指令规定前面必须有名字,有些则不允许有名字,也有一些
17、伪指令的名字是任选的。即不同的伪指令对于是否有名字有不同的规定。伪指令语句的名字后面通常不跟冒号,这是它和标号的一个明显区别。很多情况下伪指令语句中的名字是变量名。变量名代表存储器中一个数据区的名字。例如,例5.1中的DATA1、DATA2就是变量名。第22页/共274页l名字项用一个符号表示。对符号的规定:由字符A-Z,a-z,0-9及符号、$、下划线_ 等组成,最长31个字符,超出部分忽略。不能用数字打头,以免与十六进制数相混。不使用汇编程序中的保留字(如指令的助记符等)。对定义的符号不区分大小写。第23页/共274页变量也有三种属性:段、偏移量和类型。变量的段属性是变量所代表的数据区所在
18、段的段地址。由于数据区一般在存储器的数据段中,因此变量的段地址常常在DS和ES寄存器中。变量的偏移量属性是该变量所在段的起始地址与变量的地址之间的字节数。变量的类型属性有BYTE(字节)、WORD(字)、DWORD(双字)、QWORD(四字)、TBYTE(十字)等,表示数据区中存取操作对象的大小。第24页/共274页2)助记符助记符汇编语言语句中的第二个组成部分是助记符(Memonic)。在指令语句中的第二部分是CPU指令系统中指令的助记符,如MOV、ADC等。助记符约有90多种,在第4章指令系统中已经进行了讨论。在伪指令语句中的第二部分是伪指令的定义符,如DB、SEGMENT、ENDS、EN
19、D等。它们在程序中的作用是定义变量的类型、定义段以及告诉汇编程序结束汇编等。关于伪指令的作用和使用方法,将在5.3节中讨论。第25页/共274页 助记符可以是指令、伪操作中的助记符。对于指令,汇编程序将其翻译成机器语言指令。MOV AX,100 B8 00 01对于伪操作,汇编程序根据其要求的功能进行处理。data SEGMENT data与一个段值相对应string DB USTB string与一个内存地址相对应。第26页/共274页3)操作数操作数汇编语言语句中的第三个组成部分是操作数。操作数项l在指令语句中是指令的操作数,可能有单操作数或双操作数,也可能无操作数;l 操作数给出参与操作
20、的数或数所在的地方。l在伪指令中可能有更多个操作数。操作数多于一个时,用逗号分开。l 操作数可以是常数、寄存器、存储器操作数、标号名、过程名或表达式等。第27页/共274页(1)常数。常数就是指令中出现的那些固定值,可以分为数值常数和字符串常数两类。例如,立即数寻址时所有的立即数、直接寻址时所有的地址、ASCII字符串等都是常数。常数是除了自身的值以外,没有其他属性的数值。在源程序中,数值常数按其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同表示形式。汇编语言用不同的后缀加以区别(如B,H等)。第28页/共274页常数:常数:给出具体的数据。可以是数字常量或字符常量。给出具
21、体的数据。可以是数字常量或字符常量。数字默认十进制,也可加数字默认十进制,也可加D表示十进制数。表示十进制数。如如1234D,1234 数字后加数字后加B表示二进制数。表示二进制数。如如1010B 数字后加数字后加H表示十六进制数。表示十六进制数。如如1234H 字符常量,用单引号表示。字符常量,用单引号表示。如如1234汇编时,用字符对应的汇编时,用字符对应的ASCII表示。表示。如如31H,32H,33H,34H例例data1DB12,34,56;十进制;十进制data2DB12H,34H,56H;十六进制;十六进制MOVAL,G;字符;字符stringDB1234;字符串;字符串第29页
22、/共274页lA、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如 寄存器名AH、BH、CH、DH 变量名 abcdH 等例例 movAL,0AHmovAL,AHmovBX,0abcdH第30页/共274页汇编语言中的数值常数的第一位必须是数字,否则汇编时将被看成是标识符,如常数B7H应写成0B7H,FFH应写成0FFH。字符串常数是由单引号括起来的一串字符。例.ABCDEFG和179。单引号内的字符在汇编时都以ASCII的代码形式存放在存储单元中。如上述两字符串的ASCII代码为41H,42H,43H,44H,48H和31H,37H,39H。字符串最长允许有255个字符。
23、第31页/共274页(2)寄存器。8086/8088CPU的寄存器可以作为指令的操作数。(3)标号。由于标号代表一条指令的符号地址,因此可以作为转移(无条件转移或条件转移)、过程调用CALL以及循环控制LOOP指令的操作数。(4)变量。因为变量是存储器中某个数据区的名字,所以在指令中可以作为存储器操作数。第32页/共274页(5)表达式。汇编语言语句中的表达式,按其性质可分为两种:数值表达式和地址表达式。数值表达式产生一个数值结果,只有大小,没有属性。地址表达式的结果不是一个单纯的数值,而是一个表示存储器地址的变量或标号,它有三种属性:段、偏移量和类型。第33页/共274页表达式中常用的运算符
24、有以下几种:算术运算符。常用的算术运算符有:+(加),(减),*(乘),/(除)和MOD(模除,即两个整数相除后取余数)等。以上算术运算符可用于数值表达式,运算结果是一个数值。在地址表达式中通常只使用其中的和(加和减)两种运算符。第34页/共274页逻辑运算符。逻辑运算符有:AND(逻辑“与”),OR(逻辑“或”),XOR(逻辑“异或”)和NOT(逻辑“非”)。逻辑运算符只用于数值表达式中对数值进行按位逻辑运算,并得到一个数值结果。对地址进行逻辑运算是没有意义的。第35页/共274页关系运算符。关系运算符有:EQ(等于),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于
25、或等于)等。参与关系运算的必须是两个数值或同一段中的两个存储单元地址,但运算结果只可能是两个特定的数值之一:当关系不成立(假)时,结果为0(全0);当关系成立(真)时,结果为0FFFFH(全1)。例如:MOVAX,4EQ3;关系不成立,故(AX)0MOVAX,4NE3;关系成立,故(AX)0FFFFH第36页/共274页分析运算符分析运算符用于分析一个存储器操作数的属性,如段值、偏移量和类型等,或取得它所定义的存储空间的大小。分析运算符有SEG、OFFSET、TYPE、SIZE和LENGTH等。SEG运算符。利用SEG运算符可以得到一个标号或变量所在段的段地址。例如,下面两条指令将变量ARRA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch5 汇编语言 程序设计
限制150内