微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt

上传人:小飞机 文档编号:5975742 上传时间:2023-09-10 格式:PPT 页数:76 大小:583.50KB
返回 下载 相关 举报
微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt_第1页
第1页 / 共76页
微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt_第2页
第2页 / 共76页
微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt_第3页
第3页 / 共76页
微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt_第4页
第4页 / 共76页
微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理与控制技术-卢晓红7-76汇编语言程序设计.ppt(76页珍藏版)》请在三一办公上搜索。

1、1,第七章:汇编语言程序设计,2,7.1 汇编语言的基本概念7.2 汇编语言源程序的格式7.3 伪指令语句7.4 宏指令语句*7.5 汇编语言程序的上机过程7.6 汇编语言程序设计,第七章:汇编语言程序设计,3,7.1 汇编语言的基本概念,7.1.1 机器语言(Machine Language)机器语言是一种用二进制表示指令和数据,能被机器直接识别的计算机语言。它的缺点是不直观,不易理解和记忆,因此编写、阅读和修改机器语言程序都比较繁琐。但(机器语言程序)是计算机惟一能够直接理解和执行的程序,具有执行速度快、占用内存少等特点。,4,7.1.2 高级语言(High Level Language)

2、如果说(机器语言)是面向机器的,那么(高级语言)则是“面向过程”的语言。利用这些语言编程,程序员可以完全不考虑机器的结构特点,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达式形式的语句去编制程序。这样编写的程序与问题本身的数学模型之间有着良好的对应关系,可在各种机器上通用(不同机器之间仅做少量修改)。但是,这种用高级语言编写的源程序并不能在机器上直接执行,需要被翻译成对应的目标程序(即机器语言程序),机器才能运行。具有这种翻译作用的程序称为(解释程序或编译程序)。,7.1 汇编语言的基本概念,5,7.1.3 汇编语言(Assembly Language)(汇编语言)是

3、一种采用助记符表示的程序设计语言,即用(助记符)来表示指令的操作码和操作数,用(标号或符号)代表地址、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、阅读和检查。实际上,用汇编语言编写的(汇编语言源程序)就是机器语言程序的符号表示,汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的一一对应关系,故也称汇编语言为符号语言。用汇编语言编写的源程序也需要翻译成(目标程序)才能被机器执行。这个翻译过程称为(汇编),完成汇编任务的程序称为(汇编程序)。,7.1 汇编语言的基本概念,6,用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等)直接对位、字节、字寄存器或存储

4、单元、I/O端口进行处理,同时也能直接使用CPU 指令系统和指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。所以,汇编语言大量被用于编写计算机系统程序、实时通信程序、实时控制程序等。,用汇编语言编写的源程序,汇编程序,目标程序,7.1 汇编语言的基本概念,汇编,7,(汇编程序)是最早也是最成熟的一种系统软件。它除了能够将(汇编语言源程序)翻译成(机器语言程序)这一主要功能外,还能够根据用户的要求自动分配存储区域(包括程序区、数据区、暂存区等);自动地把各种进位制数转换成二进制数,把字符转换成ASCII码,计算表达式的值等;自动对源程序进行检查,给出

5、错误信息(如非法格式,未定义的助记符、标号,漏掉操作数等)等。具有这些功能的汇编程序又称为基本汇编(或小汇编ASM-86)。在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令的汇编程序,就叫做宏汇编(MASM-86)。它包含全部ASM功能,还增加了宏指令、结构、记录等高级汇编语言功能。,7.1 汇编语言的基本概念,8,7.2 汇编语言源程序的格式,分段结构汇编语言源程序例要求将两个5字节十六进制数相加,可以编写出以下汇编语言源程序。,DATADATA1DATA2DATA,SEGMENTDB 0F8H,60H,0ACH,74H,3BHDB 0C1H,36H,9EH,0D5H,

6、20HENDS,;定义数据段;被加数;加数;数据段结束,3B74AC60F8H+20D59E36C1H=5C4A4A97B9H,9,7.2 汇编语言源程序的格式,10,7.2 汇编语言源程序的格式,由程序例可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)组成,每个段以(SEGMENT语句)开始,以(ENDS语句)结束。整个源程序的结尾是(END语句)。汇编语言源程序中的段与CPU管理的存储器的段,既有联系,又在概念上有所区别。,在汇编语言源程序中,设置段的自由度比较大。例如,一个源程序中可以有多个数据段或多个代码段等等。一般来说,汇编语言源程序中段的数

7、目可以根据实际需要而设定。为了和CPU管理的存储器物理段相区别,我们将汇编语言程序中的段称为逻辑段。在不致发生混淆的地方,有时简称为段。,11,7.2 汇编语言源程序的格式,汇编语言语句的类型和格式1语句的类型汇编语言源程序中的语句可以分为(指令语句)和(伪指令语句)两种类型:指令语句:是能产生目标代码,CPU 可以执行的能完成特定功能的语句。伪指令语句:是一种不产生目标代码的语句,仅用来在汇编过程中告诉汇编程序应如何汇编。例如,告诉汇编程序已写出的汇编语言源程序有几个段,段的名字是什么;定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。显然,伪指令语句是汇编程序在汇编时使用的。,

8、12,7.2 汇编语言源程序的格式,2.语句的格式指令语句与伪指令语句的格式是类似的。一般情况下,汇编语言的语句可以由名字、助记符、操作数、注释部分构成:名字 助记符 操作数;注释其中带方括号的部分表示任选项,可以有,也可以没有。例如以下语句:,LOOP1:MOV AL,DATA2SI,;取一个字节加数,DATA1 DB 0F8H,60H,0ACH,74H,3BH,;被加数,第一条语句是指令语句,其中“LOOP1:”是名字,“MOV”是指令助记符,“AL,DATA2SI”是操作数,“;”后面是注释部分。第二条语句是伪指令语句,其中“DATA1”是名字,“DB”是伪指令定义符,“0F8H,60H

9、,0ACH,74H,3BH”操作数,“;”后面是注释部分。,7.2 汇编语言源程序的格式,(1)名字-指令语句中的名字汇编语言语句的第一个组成部分是名字(Name)。在指令语句中,名字是一个标号。指令语句中的标号实质上是指令的符号地址。并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其他地方就可以引用这个标号。在前面程序例中,START、LOOP1就是标号。指令语句名字标号后面通常有一个冒号。标号有三种属性:段、偏移量和类型。,标号的段属性是定义标号在程序段的段地址。当程序中引用一个标号时,该标号的段值应在CS寄存器中。标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址

10、之间的字节数。偏移量是一个16位无符号数。标号的类型属性有两种:NEAR和FAR。前一种标号可以在段内被引用,地址指针为2字节;后一种标号可以在其他段被引用,地址指针为4字节。如果定义一个标号时后跟冒号,则汇编程序确认其类型为NEAR。,13,7.2 汇编语言源程序的格式,伪指令语句中的名字可以是变量名、段名、过程名。有些伪指令规定前面必须有名字,有些则不允许有名字,也有一些伪指令的名字是任选的。即不同的伪指令对于是否有名字有不同的规定。伪指令语句的名字后面通常不跟冒号,这是它和标号的一个明显区别。很多情况下伪指令语句中的名字是变量名。变量名代表存储器中一个数据区的名字。例如前面例中的DATA

11、1、DATA2就是变量名。变量也有三种属性:段、偏移量和类型。,变量的段属性是变量所代表的数据区所在段的段地址。由于数据区一般在存储器的数据段中,因此变量的段地址常常在DS和ES寄存器中。变量的偏移量属性是该变量所在段的起始地址与变量的地址之间的字节数。变量的类型属性有DB(BYTE,字节)、DW(WORD,字)、DD(Double WORD,双字)、DQ(四字)、DT(十字)等,表示数据区中存取操作对象的大小。,14,(1)名字-伪指令语句中的名字,7.2 汇编语言源程序的格式,(2)助记符汇编语言语句中的第二个组成部分是助记符(Mnemonic)。在指令语句中的第二部分是CPU指令系统中指

12、令的助记符,如MOV、ADC等。助记符约有90多种,在指令系统中已经进行了详细的讨论。在伪指令语句中的第二部分是伪指令的定义符,如DB、SEGMENT、ENDS、END等。它们在程序中的作用是定义变量的类型、定义段以及告诉汇编程序结束汇编等。关于伪指令的作用和使用方法,将在本章后继进行讨论。,15,7.2 汇编语言源程序的格式,(3)操作数汇编语言语句中的第三个组成部分是操作数。在指令语句中是指令的操作数,可能有单操作数或双操作数,也可能无操作数;而在伪指令中可能有更多个操作数。当操作数不止一个时,相互之间应该用逗号隔开。可以作为操作数的有常数、寄存器、标号、变量和表达式等。,常数。常数就是没

13、有任何属性的确定的纯数值,可以分为数值常数和字符串常数两类。有如下几种类型:二进制数(以字母B结尾):01011101B;八进制数(以字母O或者Q结尾):723Q,35Q;十进制数(以字母D或省略结尾,):129,129D;十六进制数(以字母H结尾):3A5BH,0FEH,常数的第一位必须是数字,否则汇编时将被看成是标识符,如常数B7H应写成0B7H,FFH应写成0FFH。实数:5.23E-4;,16,7.2 汇编语言源程序的格式,(3)操作数,常数字符串常数:字符串常数是由单引号括起来的一串字符。例如ABCDEFG和179。单引号内的字符在汇编时都以ASCII的代码形式存放在存储单元中。如上

14、述两字符串的ASCII代码为41H,42H,43H,44H,48H和31H,37H,39H。字符串最长允许有255个字符。,17,MOV AX,0AF1H;源操作数中作立即数ADC DL,12HMOV BX,SI+23H;基址加变址寻址方式中作位移量DB 12H;定义一个字节数据DW 1234H;定义一个字数据DD 12345678H;定义一个双字数据DB A B C D;定义四字节的字符串数据,A:41H;a:61H;0:30H,7.2 汇编语言源程序的格式,(3)操作数,寄存器。8086/8088CPU的寄存器可以作为指令的操作数。标号。由于标号代表一条指令的符号地址,因此可以作为转移(无

15、条件转移或条件转移)、过程调用CALL以及循环控制LOOP指令的操作数。变量。因为变量是存储器中某个数据区的名字,所以在指令中可以作为存储器操作数,代表存放在某些存储单元的数据。表达式。汇编语言语句中的表达式,按其性质可分为两种:数值表达式和地址表达式。数值表达式产生一个数值结果,只有大小,没有属性。地址表达式的结果不是一个单纯的数值,而是一个表示存储器地址的变量或标号,它有三种属性:段、偏移量和类型。,7.2 汇编语言源程序的格式,变量,19,(3)操作数,VAR_DATA SEGMENTDATA1 DB 12HDATA2 DB 34HDATA3 DW 5678HVAR_DATA ENDS,

16、定义了DATA1,DATA2,DATA3三个变量。段属性:存放在VAR_DATA逻辑段中;偏移属性:DATA1偏移量为0,DATA2偏移量为1,DATA3偏移量为2;类型属性:DATA1、DATA2是字节属性;DATA3为字属性。,DA1 DB 50H,50DA2 DW 0A3F1H,4981H,DA1字节单元内容为50H,DA+1字节单元内容为十进制50(32H);DA2字单元内容为0A3F1H(低字节为F1H,高字节为0A3H);DA2+2字单元内容为4981H。,7.2 汇编语言源程序的格式,汇编语言语句的最后一个组成部分是注释。对于一个汇编语言语句来说,注释部分并不是必要的,但是加上适

17、当的注释以后,可以增加源程序的可读性。因此,最好在重要的程序段前面以及关键处加上简明扼要的注释。注释前面要求加上分号(;)。如果注释的内容较多,超过一行,则换行以后前面还要加上分号。注释也可以从一行的最前面开始,以表示对一个程序段的说明。汇编程序对于注释不予理会,即注释对汇编后产生的目标程序没有任何影响。,(4)注释,20,7.2 汇编语言源程序的格式,表达式与运算符,(1)算术运算符。常用的算术运算符有:+(加),(减),*(乘),/(除)和MOD(除法取余运算符,即两个整数相除后取余数),SHL左移操作符;SHR右移操作符。32 MOD 5=2。21H SHL 2=84H。(2)逻辑运算符

18、。逻辑运算符有:AND(逻辑“与”),OR(逻辑“或”),XOR(逻辑“异或”)和NOT(逻辑“非”)。逻辑运算符只用于数值表达式中对数值进行按位逻辑运算,并得到一个数值结果。24H AND 0FH=04H24H OR OFH=2FH24H XOR OFH=2BHNOT 24H=0DBH,21,7.2 汇编语言源程序的格式,(3)关系运算符。关系运算符有:EQ(等于),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)等。运算结果只可能是两个特定的数值之一:当关系不成立(假)时,结果为0(全0);当关系成立(真)时,结果为0FFFFH(全1)。例如:,MOV AX

19、,4 EQ 3MOV AX,4 NE 3,;关系不成立,故(AX)0;关系成立,故(AX)0FFFFH,22,表达式与运算符,(4)分析运算符。分析运算符用于分析一个存储器操作数的属性,如段值、偏移量和类型等,或取得它定义的存储空间的大小。分析运算符有SEG(求段基址)、OFFSET(求偏移地址)、TYPE(求类型值)、SIZE(求字节数)和LENGTH(求长度项数)等。,7.2 汇编语言源程序的格式,(4)分析运算符。SEG运算符。利用SEG运算符可以得到一个标号或变量所在段的段地址。例如,下面两条指令将变量ARRAY的段地址送DS寄存器。MOV AX,SEG ARRAYMOV DS,AXO

20、FFSET运算符。利用OFFSET运算符可以得到一个标号或变量的偏移地址。例如:MOV DI,OFFSET DATA1TYPE运算符。TYPE运算符的运算结果是一个数值,这个数值与存储器操作数的类型属性具有对应关系。,23,表达式与运算符,7.2 汇编语言源程序的格式,LENGTH运算符。如果一个变量已用重复操作符DUP说明其变量的个数,则利用LENGTH 运算符可得到这个变量的个数。如果未用DUP说明,则得到的结果总是1。D_B1 DB 20H DUP(?);保留20H个字节,每个字节可以预置任意内容 D_B2 DW 10H DUP(4);重复10H个字单元,每个单元预置为4 LENGTH

21、D_B1=20H LENGTH D_B2=10HSIZE运算符。如果一个变量已用重复操作符DUP说明,则利用SIZE 运算符可得到分配给该变量的字节总数。如果未用DUP说明,则得到的结果是TYPE运算的结果。,24,表达式与运算符,(4)分析运算符。,SIZE=LENGTH*TYPE,SIZE D_B1=20H*1=20H;SIZE D_B2=10H*2=20H;,7.2 汇编语言源程序的格式,TYPE、LENGTH和SIZE运算符应用例,VAR DW?ARRAY DD 10 DUP(?)STR DB THIS IS TESTMOV AX,TYPE VARMOV BX,TYPE ARRAYMO

22、V CX,TYPE STRMOV DX,LENGTH ARRAYMOV SI,SIZE ARRAY变量ARRAY的个数为10,类型为DWORD(双字),因此,SIZE ARRAY的结果为10440。SIZE的运算结果等于LENGTH的运算结果乘以TYPE 的运算结果。,;变量VAR的类型为字;变量ARRAY的类型为双字;变量STR的类型为字节;(AX)2;(BX)4;(CX)1;(DX)10;(SI)40,25,7.2 汇编语言源程序的格式,(5)合成运算符。合成运算符可以用来建立或临时改变变量或标号的类型或存储器操作数的存储单元类型。合成运算符有PTR、THIS、SHORT等。PTR运算符。

23、PTR运算符可以指定或修改存储器操作数的类型,例如:INC BYTE PTRBXSI 指令中利用PTR运算符明确规定了存储器操作数的类型是BYTE(字节),因此,本指令将一个字节型存储器操作数加1。,MOV BX,WORD PTR STUFF;从STUFF中取一个字到BX,STUFF DD?,;定义STUFF为双字类型变量,26,利用PTR运算符可以建立一个新的存储器操作数,它与原来的同名操作数具有相同的段和偏移量,但可以有不同的类型。不过这个新类型只在当前语句中有效。例如:,表达式与运算符,7.2 汇编语言源程序的格式,THIS运算符。THIS运算符也可指定存储器操作数的类型。使用THIS运

24、算符可以使标号或变量更具灵活性。例如,要求对同一个数据区既可以字节为单位,又可以字为单位进行存取,则可用以下语句:TAB1 EQU THIS WORDTAB2 DB 100 DUP(?)上面TAB1和TAB2具有相同的段地址和偏移地址,实际上代表同一个数据区,其中共有100个字节,但TAB1的类型为WORD(字类型),而TAB2的类型为BYTE(字节类型)。SHORT运算符。SHORT运算符指定一个标号的类型为SHORT(短标号),即标号到引用该标号指令之间的距离在128+127个字节的范围内。短标号可以被用于无条件转移指令中。使用短标号的指令比使用缺省的近标号的指令少一个字节。,27,表达式

25、与运算符,(5)合成运算符,7.2 汇编语言源程序的格式,(6)其他运算符段超越运算符“:”。运算符“:”(冒号)跟在段寄存器名(DS,ES,SS和CS)之后,表示段超越,用以给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么。例如:MOV AX,ES:DI字节分离运算符LOW和HIGH。运算符LOW和HIGH分别得到一个数值或地址表达式的低位和高位字节。例如:,STUFF EQUMOV,0ABCDHAH,HIGH STUFF;(AH)0ABH,MOV AL,LOW STUFF,;(AL)0CDH,28,表达式与运算符,MOV CL,LOW 3A4BH;CL=4BH,7.2 汇编语言

26、源程序的格式,表达式中运算符的优先级 优先级高的先运算,优先级低的后运算。优先级相同时按表达式中从左到右的顺序运算。括号可以提高运算的优先级,括号内的运算总是在相邻的运算之前进行。,29,7.3 伪 指 令 语 句,伪指令无论表示形式或其在语句中所处的位置,都与指令相似。但二者之间有着重要的区别。首先,指令是给CPU的命令,在运行时由CPU执行,每条指令对应CPU的一种特定的操作,例如传送、加法等;而伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理,例如定义数据、分配存储区、定义段以及定义过程等。其次,汇编以后,每条指令产生一一对应的目标代码;而伪指令则不产生与之相应的目标代码。,30

27、,7.3 伪 指 令 语 句,根据其功能,伪指令大致可以分为以下几类:数据定义伪指令(DB,DW,DD)符号定义伪指令*(EQU)段定义伪指令(SEGMENT/ENDS,ASSUME)过程定义伪指令(过程名 PROC,过程名 ENDP)宏处理伪指令*模块定义与连接伪指令*处理器选择伪指令*条件伪指令*列表伪指令*其它伪指令*,31,7.3 伪 指 令 语 句,7.3.1 数据定义伪指令数据定义伪指令的用途是定义一个变量的类型,给变量赋初值,或者仅仅给变量分配存储单元,而不赋予特定的值。数据定义伪指令有DB,DW,DD,DF,DQ,DT等,而常用的是前三种。数据定义伪指令的一般格式为:变量名 伪

28、指令定义符 操作数,操作数其中方括号中的变量名为任选项,可以有,也可以没有。变量名后面不跟冒号。伪指令定义符后面的操作数可以不止一个。如有多个操作数,相互之间应该用逗号分开。,32,7.3 伪 指 令 语 句,(1)DB(Define Byte)定义变量的类型为字节(BYTE),给变量分配字节或字节串。DB伪指令定义符后面的操作数每个占有1个字节。(2)DW(Define Word)定义变量的类型为字(WORD)。DW伪指令定义符后面的操作数每个占有1个字,即2个字节。在内存中存放时,低位字在前,高位字在后。(3)DD(Define Double word)定义变量的类型为双字(DWORD)。

29、DD后面的操作数每个占有2个字,即4个字节。在内存中存放时,低位字在前,高位字在后。,33,65HF0H17HHello!41H42H42H41H42H41H00H00H,7.3 伪 指 令 语 句,数据定义伪指令举例1:,数据定义伪指令定义符后面的操作数可以是常数、表达式或字符串,但每项操作数的值不能超过由伪指令定义符所定义的数据类型限定的范围。例如,DB伪指令定义数据的类型为字节,则其范围为无符号数:0255;带符号数:128+127,等等。字符串必须放在单引号中。另外,超过两个字符的字符串只能用DB伪指令定义。DATA DB 101,0F0H;存入65H,F0HEXPR DB 2*8+7

30、;存入17HSTR DB Hello!;存入6个字符的ASCII码值AB DB AB;存入41H,42HBA DW AB;存入42H,41HABDD DD AB;存入42H,41H,00,00OFAB DW AB;存入变量AB的偏移地址 ADRS DW STR,STR+3,STR+5;存入3个偏移地址 TOTAL DD DATA;先存DATA的偏移地址;再存段地址,34,7.3 伪 指 令 语 句,数据定义伪指令举例2:除了常数、表达式和字符串外,问号“?”也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋予变量某个确定的初值。当同样的操作数重复多次时,可用重复操作符“D

31、UP”表示,其形式为:n DUP(初值,初值,)其中圆括号中为重复的内容,n为重复次数。如果用“n DUP(?)”作为数据定义伪指令定义符的惟一操作数,则汇编程序产生一个相应的数据区,但不赋任何初值。重复操作符“DUP”可以嵌套。通常把用DUP作为惟一操作数而定义的变量称为数组。,35,7.3 伪 指 令 语 句,FILLER DBSUM DW DBBUFFER DBZERO DWMASK DBARRAY DB,?,?,?10 DUP(?)30 DUP(0)5 DUP(OK!)100 DUP(3 DUP(8),6),36,7.3 伪 指 令 语 句,错误的数据定义伪指令语句举例:,ERROR1

32、:DW 99ERROR2 DB 25*90ERROR3 DD 1234,;变量名后有冒号;DB的操作数超过255;DD的操作数是超过2个字符;的字符串,必须用DB定义,37,7.3 伪 指 令 语 句,符号定义伪指令符号定义伪指令的用途是给一个符号重新命名,或定义新的类型属性等。符号包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。常用的符号定义伪指令有EQU、(等号)和LABLE。(1)EQU格式:名字 EQU 表达式EQU伪指令将表达式的值赋予一个名字。以后可用这个名字来代替上述表达式。格式中的表达式可以是一个常数、符号、数值表达式或地址表达式等。,38,7.3 伪 指 令

33、语 句,CRLFASTRADRCBD,EQUEQUEQUEQUEQUEQU,0DH0AHASCII_TABLE64*1024ES:BP+DI+5AAM,;常数;变量;数值表达式;地址表达式;AAM乘法调整,指令助记符,利用EQU伪指令,可以用一个名字代表一个数值,或用一个较简短的名字来代替一个较长的名字。如果源程序中需要多次引用某一表达式,则可以利用EQU伪指令定义符给其赋一个名字,以代替程序中的表达式,从而使程序更加简洁,便于阅读。同一程序中,不允许用EQU伪指令对同一符号重复定义。,39,(1)EQU,练习,FILLER DBSUM DW DBMASK DBARRAY DB,12H?,?,

34、?5 DUP(OK!)100 DUP(3 DUP(8),6),L EQU ARRAYSUM求L的值。,12H,?,?,?,?,?,FILLER,SUM,MASK,O,K,!,!,15字节,8,ARRAY,8,6,400字节,L=0014H,7.3 伪 指 令 语 句,(2)=(等号)格式:名字=表达式=(等号)伪指令的功能与EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义。例如:,COUNT=,100,MOV CX,COUNT,;(CX)100,COUNT=,COUNT10,MOV BX,COUNT,;(BX)90,41,7.3 伪 指 令 语 句,7.3.3 段定义伪指令段定义伪

35、指令的用途是在汇编语言源程序中定义逻辑段。常用的段定义伪指令有SEGMENT/ENDS和ASSUME等。(1)SEGMENT/ENDS格式:段名 SEGMENT 定位类型 组合类型 类别段名 ENDS,42,43,SEGMENT 伪指令用于定义一个逻辑段,给逻辑段赋予一个段名,并以后面的任选项(定位类型、组合类型、类别)规定该逻辑段的其他特性。SEGMENT 伪指令位于一个逻辑段的开始,ENDS伪指令表示一个逻辑段的结束。,(1)在汇编语言源程序中,这两个伪指令定义符总是成对出现的,二者前面的段名必须一致。两个语句之间的部分即是该逻辑段的内容。例如,对于代码段,其中主要有指令及其他伪指令;对于

36、数据段和附加段,主要有定义数据区的伪指令等等。(2)一个源程序中不同逻辑段的段名可以各不相同。(3)SEGMENT伪指令后面还有三个任选项:定位类型、组合类型和类别。在上面的格式中,它们都放在方括号内,表示可有可无。如果有,三者的顺序必须符合格式中的规定。这些任选项是给汇编程序(MASM)和连接程序(LINK)的命令,用来告诉汇编程序和连接程序,如何确定段的边界,以及如何组合几个不同的段等。,7.3 伪指令语句,44,格式:ASSUME 段寄存器名:段名,段寄存器名:段名,ASSUME伪指令告诉汇编程序,将某一个段寄存器设置为存放某一个逻辑段的段地址,即明确指出源程序中的逻辑段与物理段之间的关

37、系。当汇编程序汇编一个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中的指令或数据。在一个源程序中,ASSUME伪指令定义符应该放在可执行程序开始位置的前面。还需指出一点,ASSUME伪指令只是通知汇编程序有关段寄存器与逻辑段的关系,并没有给段寄存器赋予实际的初值。例如:CODE SEGMENTASSUME CS:CODE,DS:DATA1,SS:STACKMOV AX,DATA1MOV DS,AX;给DS赋值MOV AX,STACKMOV SS,AX;给SS赋值CODE ENDS,(2)ASSUME,7.3 伪指令语句,可执行程序开始位置,45,7.3.4 过程定义伪指令过程也就是子程序,所以

38、过程定义伪指令也就是子程序定义伪指令。,(1)格式:过程名 PROC NEAR/FARRET过程名 ENDP,PROC伪指令定义一个过程(子程序),赋予过程一个名字,并指出该过程的属性为NEAR或FAR。如果没有特别指明类型,则认为过程的类型是NEAR。伪指令ENDP标志过程的结束。上述两个伪指令前面的过程名必须一致,且成对出现。过程名实质上是过程入口的符号地址,它和标号一样,也有三种属性:段、偏移量和类型。过程的类型属性可以是NEAR或FAR。,7.3 伪指令语句,46,(2)当一个程序段被定义为过程后,程序中其他地方就可以用CALL指令调用这个过程。调用一个过程的格式为:CALL 过程名(

39、3)一般来说,被定义为过程的程序段中应该有返回指令RET,但不一定是最后一条指令,也可以有不止一条RET指令。执行RET指令后,控制返回到原来调用指令的下一条指令。(4)过程的定义和调用均可嵌套。例如:NAME1 PROC FARCALL NAME2RETNAME2 PROC NEARRETNANE2 ENDP NAME1 ENDP,7.3 伪指令语句,汇编语言源程序基本格式DATA SEGMENT;存放数据项的数据段DATA ENDSEXTRA SEGMENT;存放数据项的附加段EXTRA ENDSSTACK SEGMENT;作堆栈用的堆栈段STACK ENDSCODE SEGMENTASS

40、UME CS:CODE,DS:DATAASSUME ES:EXTRA,SS:STACKSTART:MOV AX,DATA MOV DS,AX;存放指令序列CODE ENDSEND START,47,7.5 汇编语言程序的实验上机过程,7.5.1 汇编语言程序的设计应用步骤,(1)在无格式编辑环境下建立.asm源程序文件;(2)使用汇编程序或汇编命令把.asm文件汇编成.obj文件;(3)使用连接程序或连接命令把.obj文件转换成.exe文件;(4)装载、调试或运行.exe文件。,汇编语言的程序一般要经过编辑、汇编(MASM或ASM)、连接(LINK)和调试(DEBUG)这些步骤。,要建立和运行

41、汇编语言程序,系统盘上应该首先有以下文件:1)汇编程序:Asm.exe或者masm.exe2)链接程序:link.exe3)调试程序:,7.5 汇编语言程序的实验上机过程,用户程序执行完后返回DOS状态,可使用如下两种方法:,PUSH DSMOV AX,0PUSH AX,;保护PSP段地址;保护偏移地址0,这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。(返回DOS的标志就是程序运行完后出现一个DOS的标识符,如C)。,非标准方法:在用户的程序中可不定义过程段,只在代码段结

42、束之前(即CODE ENDS之前)增加两条语句:MOV AH,4CHINT 21H则程序执行完后将会自动返回DOS状态。标准方法:首先将用户程序的主程序定义成FAR过程(MAIN PROC FAR),其最后一条指令为RET(MAIN ENDP)。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈:,49,7.5 汇编语言程序的实验上机过程,由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处(或在保护了PSP段地址和偏移地址0以后),应该使用以下方法重新装填DS和ES

43、的值使其指向用户的数据段:MOV AX,段名MOV 段寄存器名,AX;段寄存器名可以是DS、ES、SS之一,7.5 汇编语言程序的实验上机过程,7.6 汇编语言程序设计,7.6.1 顺序程序设计顺序程序的执行自始至终按照语句出现的先后顺序进行,是一种最简单的程序,也称为直线程序。编程例1:求两个8位无符号数的平均值。这两个数分别放在x单元和y单元中,而平均值放在z单元中。程序如下:,DATAxyzDATA,SEGMENTDB 95DB 87DB?ENDS,51,AVERAGE.ASM,CODEMAINSTART:,SEGMENTPROC FAR;过程(子程序)定义ASSUME CS:CODE,

44、DS:DATAPUSH DS;指令语句名字标号后面通常有一个冒号,MOVPUSH,AX,0AX,AX,DATADS,AXAL,xAL,yAH,0AH,0BL,2BLz,AL,;装填数据段寄存器DS;第一个数送入AL;两数相加,结果送AL;带进位加法,进位送AH;除数2送BL;求平均值送AL(复习);结果送入z单元,MAINCODE,MOVMOVMOVADDMOVADCMOVDIVMOVRETENDPENDS,END START,52,7.6 汇编语言程序设计,用户程序执行完后返回DOS状态标准方法,除2运算也可使用循环右移的方法实现:,CODEMAINSTART:,SEGMENTPROC FA

45、RASSUME CS:CODE,DS:DATAPUSH DS,MOVPUSH,AX,0AX,AX,DATADS,AX,;装填数据段寄存器DS;第一个数送入AL;两数相加,结果送AL;带进位循环右移1位;结果送入z单元,MAINCODE,MOVMOV*RETENDPENDS,END START,53,7.6 汇编语言程序设计,用户程序执行完后返回DOS状态标准方法,MOV AL,xADD AL,yMOV AH,0ADC AH,0ROR AX,1MOV z,AX,ROR1.ASM,编程例2:对两个16位数做加法运算,这两个数从地址10050H开始连续存放,低位在小地址一端,结果放在这两个数之后:,

46、54,7.6 汇编语言程序设计,MOV AX,1000HMOV DS,AX;DS=1000HMOV SI,50H;被加数指针MOV DI,52H;加数指针MOV BX,54H;和指针CLC;清除进位标志CFXOR AX,AX;清AXMOV AX,SI;取一个字到AXADC AX,DI;AX+DI+CF,结果送AXMOV BX,AX;存一个字到BXHLT,MemoryDuan.ASM,编程例3:将内存(10050H)单元内容拆成两段,每段4位,分别存入(10051H)单元和(10052H)单元。即(10050H)单元的低4位放入(10051H)的低4位,(10050H)单元的高4位放入(1005

47、2H)的低4位,而(10051H)和(10052H)的高4位均为0。,55,7.6 汇编语言程序设计,MOV AX,1000HMOV DS,AX;DS=1000HMOV SI,50H;偏移地址指针MOV AL,SI;取一个字节到ALAND AL OFH;AL高4位清零MOV SI+1,AL;送入(10051H)单元MOV AL,SIMOV CL,4SHR AL,CL;逻辑右移4位MOV SI+2,AL;送入(10052H)单元,自己练习,编程例4:在内存中自tab开始的16个单元连续存放着015的平方值(平方表),任给一个数x(0 x15),如13,且存放在x单元中,查表求x的平方值,并把结果

48、送入y单元中。根据给出的平方表,分析表的存放规律,可知表的起始地址与数之和,正是的平方值所在单元的地址,由此编制程序如下:,DATAtabxyDATA,SEGMENTDB 0,1,4,9,16,25,36,49,64,81DB 100,121,144,169,196,225DB 13DB?ENDS,56,7.6 汇编语言程序设计,Square.asm,CODE,SEGMENT,ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX;初始化LEA BX,tab;指令的执行结果是把源操作数的有效地址,;即16位偏移地址传送到目标寄存器。MOV AH,0MO

49、V AL,x;取x的值到ALADD BX,AX;表的起始地址与数之和,;正是的平方值所在单元的地址,送BXMOV AL,BX;的平方值所在单元的内容送ALMOV y,AL;MOV AH,4CH;返回DOS状态INT 21HCODE ENDSEND START,57,7.6 汇编语言程序设计,XLAT,分支程序设计顺序程序的特点是从程序的第一条指令开始,按顺序执行,直到执行完最后一条指令。然而,许多实际问题并不能设计成顺序程序,需要根据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理程序段,运行时由机器根据不同的条件自动作出选择判断,绕过某些指令,仅执行相应的处理程序段。按这种方式编制

50、的程序,执行的顺序与指令存储的顺序失去了完全的一致性,称之为分支程序。分支程序是机器利用改变标志位的指令和转移指令来实现的。,58,7.6 汇编语言程序设计,DATAX,SEGMENT,x,DB,25,yDATAX,DB?ENDS,编程例5:给定以下符号函数:任意给定x值,假定为25,且存放在x单元,函数值y 存放在y单元,根据x的值确定函数y的值。,59,7.6 汇编语言程序设计,FenZhi.asm,;x0时转LP1;否则将1送入y单元;x=0时转LP2;否则将1送入y单元,开始,AL0?,y0,Y,Y,AL0?Ny1,结束,Ny1,CODEX SEGMENT,MAIN PROC FAR

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号