微机原理汇编语言.ppt

上传人:牧羊曲112 文档编号:5975759 上传时间:2023-09-10 格式:PPT 页数:58 大小:325KB
返回 下载 相关 举报
微机原理汇编语言.ppt_第1页
第1页 / 共58页
微机原理汇编语言.ppt_第2页
第2页 / 共58页
微机原理汇编语言.ppt_第3页
第3页 / 共58页
微机原理汇编语言.ppt_第4页
第4页 / 共58页
微机原理汇编语言.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《微机原理汇编语言.ppt》由会员分享,可在线阅读,更多相关《微机原理汇编语言.ppt(58页珍藏版)》请在三一办公上搜索。

1、本章主要教学内容 l 汇编语言和汇编程序的基本概念 l汇编语言源程序书写规则、语句格式及程序分段 l 伪指令语句的格式、功能及应用 l 汇编语言源程序的建立、汇编、连接、调试及运行,第5章 汇编语言的基本表达及其运行,5.1 汇编语言和汇编程序的基本概念 5.1.1 汇编语言 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址。,5.1.2 汇编程序 用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。有基本汇编ASM(Assembler)和

2、宏汇编MASM(MacroAssembler)两种。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。,5.2 汇编语言源程序书写格式 5.2.1 汇编语言源程序的分段结构 汇编源程序一般由3个逻辑段组成,即数据段、堆栈段和代码段。每个逻辑段以SEGMENT语句开始,以ENDS语句结束。整个源程序以END语句结束。数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。代

3、码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。,注:必须用ASSUME伪指令告诉汇编程序,哪一段和哪一个段寄存器相对应,即某一段地址应该放入哪一个段寄存器在DOS环境下,通常采用DOS的4CH号中断功能调用使汇编语言返回DOS。不需要再对CS和SS进行初始化,5.2.2 汇编语言源程序的语句类型和语句格式 1语句类型 8086宏汇编MASM使用的语句可以分成3种类型:指令语句:这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。伪指令语句:伪指令语句是为汇编程序和连接程序提供一些必要控

4、制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。例如:告诉汇编程序源程序 有几个段,段名,定义变量和定义过程,给变量分配存储单元,给符号赋值,给数字或表达式命名。宏指令语句:可包括多条指令或伪指令。在汇编时,按照宏指令的定义,在出现宏指令的地方将其展开还原。,2语句格式 一般情况下,汇编语言的语句可以由以下几部分组成:名字 操作符 操作数;注释1)名字是一个符号,它表示本条语句的符号地址。一般来说,名字可以是标号和变量,统称为标识符。名字的组成字母A-Z,a-z;数字0-9;专用字符?.-$注:数字不能为名字的第一个位置.只能出现在名字的第一个位置

5、 名字最长31个字符组成2)指令语句和伪指令语句中名字的区别指令语句的名字之后要用冒号,而伪指令语句名字后不用例:LAB1:MOV AX,2050H;指令语句,LAB1是名字,也是指令第一字节的符号地址 VAR1 DW 1200H;伪指令语句,VAR1是名字,也是符号地址,VAR1和VAR1+1存放00 12,指令语句中的名字一般采用标号 NEXT:MOV AX,1234H一个标号与一条指令的地址相联系,因此标号可以作为JMP和CALL指令的操作数JNZ NEXTCALL APAR伪指令语句中的名字可以是变量名、段名、过程名、符号名等 BUF DW 1234HCODE SEGMENTAPAR

6、PROC,3)标号和变量的属性标号和变量都具备3种属性:段属性、偏移属性及类型属性。段属性:该属性定义了标号和变量的段起始地址标号的段由CS指示变量的段通常由DS或ES指示偏移属性:表示标号和变量相距段起始地址的字节数,16位类型属性:标号是在本段内引用NEAR还是在其他段中引用FAR。变量有几个字节长度。由定义变量的伪指令DB、DW和 DD等决定。,2.操作符字段 操作符可以是机器指令、伪指令和宏指令的助记符。操作数字段是操作符的操作对象。当有两个及以上的操作数时,用逗号隔开。注释字段是以“;”开头的说明部分,可以用英文或者中文书写。注释字段是语句的非执行部分。,5.3 8086汇编语言中的

7、标识符、表达式和运算符 5.3.1 标识符 汇编语言每条语句的第一个字段是它的名字字段,名字可以是标号或变量,这两者又称为标识符。重点是要掌握其组成规则和它的3个属性。5.3.2 表达式和运算符 在表达式中,运算符充当着重要的角色。8086宏汇编有算术运算符、逻辑运算符、关系运算符、分析运算符和综合运算符共5种。下面分别讨论5种运算符的作用:,(1)算术运算符用于完成算术运算,有(加法)、(减法)、(乘法)、(除法)、MOD(求余)、SHL(左移)、SHR(右移)共7种运算。例如,将字数组B1的长度值(字数)存入AX寄存器,可以写作:B1 DW 11,22,33,44,55,66 LB1 DW

8、?MOV AX,(LB1B1)/2汇编后指令成为 MOV AX,6,(2)逻辑运算符的作用是对其操作数进行按位操作。逻辑运算符有AND(与)、OR(或)、XOR(异或)和NOT(非)。例如:PORT_VAL EQU 20H OUT AL,PORT_VAL OR 5 汇编后指令成为 OUT AL,25H,(3)关系运算符的运算对象是两个性质相同的项目。其结果为:关系成立或不成立。有EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6种。结果为真,表示为0FFFFH,否则为0.,(4)分析运算符是对存储器地址进行运算的。有5个:SEG(求段基值)、O

9、FFSET(求偏移量)、TYPE(求变量类型)、LENGTH(求变量长度)和SIZE(求字节数)。,(1)SEG操作符格式为:SEG 变量名或 标号名 回送变量或标号的段地址值。例如:若DATA1是从存储器06000H物理地址开始的一个数据段的段名,PADD是该段中的一个变量名。则 MOV BX,SEG PADD 相当于MOV BX,0600H,例2已知数据段DATA从存储器实际地址03000H开始。作如下定义后,用SEG运算符求变量所在的段基址(2)OFFSET操作符格式为:OFFSET 变量名或 标号名 回送变量或标号的偏移地址值。例如:MOV BX,OFFSET PADD 相当于LEA

10、BX,PADD其中PADD是变量或标号例3,(3)TYPE操作符格式为:TYPE 变量名 或 标号名存储器操作数类型TYPE返回值BYTE1WORD2DWORD4NEAR-1FAR-2TYPE运算符加在变量前面,返回的是这个变量所对应的TYPE返回值,如TYPE VAR1=1TYPE运算符加在结构前面,返回的是结构包含的字节数如STUDENT STRUC NAME DB WANG NUMBER DB?STUDENT ENDS则:TYPE STUDENT=5TYPE运算符加在标号前面,返回标号的属性是NEAR还是FAR,(4)LENGTH操作符格式为:LENGTH 变量名 LENGTH和SIZE

11、操作符只能和数据存储器地址操作数(BYTE、WORD或者DWORD)一起使用。LENGTH对于变量中使用DUP时,回送分配给该变量的单元数;其它情况则回送1。例如:MULTI_WORDS DW 50 DUP(20)WORDS1 DW 20,30,40,50 则 MOV CX,LENGTH MULTE_WORDS相当于MOV CX,50而MOV CX,LENGTH WORDS1相当于MOV CX,1,(5)SIZE操作符格式为:SIZE 变量名SIZE操作符回送分配给该变量的字节数相当于LENGTH值和TYPE值的乘积。例如:MOV CX,SIZE MULTI_WORD相当于MOV CX,100

12、 MOV CX,SIZE WORDS1相当于MOV CX,2,5)属性操作符属性操作符主要有PTR、段操作符、SHORT、THIS、HIGH、LOW六种。(1)PTR操作符格式为:类型 PTR 存储器地址表达式 PTR将它左边的类型指定给右边的表达式类型可以是BYTE WORD DWORD NEAR FAR,它本身并不实际分配存储器。VAR1DB 30H,40HVAR2DW2050HMOVAX,WORD PTR VAR1;将4030HAXMOV BL,BYTE PTR VAR2;将50HBL,有时汇编程序分不清所存入的数据是字节还是字,此时必须用PTR来说明属性。例如:MOV DX,20格式是

13、错误的,必须写成 MOV BYTE PTR DX,20或者MOV WORD PTR DX,20,(2)段操作符段操作符用来明确表示变量或地址表达式的段属性,取消了它们原来的默认组合。也称为段跨越前缀。例如:MOV DX,ES:BP+DI表示源操作数在ES段,不是与BP原来的默认的SS段。(3)SHORT操作符,用来指示JMP指令中转向地址的属性。如:JMP SHORT PROG1;短转移 NEXT:.NEXT与JMP指令距离不能大于127个字节,(4)THIS操作符格式为:THIS 类型或属性 THIS和PTR有共同之处,建立一个特殊类型的存储器地址操作数,而不实际为它分配新的存储单元。例如:

14、ARRAY1 EQU THIS BYTE ARRAY2 DW 30 DUP(?)此时,ARRAY1的段地址和偏移地址与ARRAY2相同,但类型不同,ARRAY1是字节类型,ARRAY2是字类型。另外也可以按如下方法使用:BEGINEQU THIS FAR START:MOV AX,0 此时,MOV指令有一个FAR属性的地址BEGIN,允许其它段的JMP指令直接跳转到BEGIN来,同时允许本段指令 JMP NEAR START或者JMP SHORT START转移到MOV指令处,(5)HIGH和LOW操作符 HIGH和LOW操作符是字节分离操作符,它接收一个数或地址表达式,HIGH取其高字节,L

15、OW取其低位字节。例如:MEMOFFADD EQU 0123H指令 MOV CL,HIGH MEMOFFADD 汇编成MOV CL,01H MOV BH,LOW MEMOFFADD 汇编成MOV BH,23H,5.4 伪指令语句 在汇编语言中,伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理。例如定义数据、分配存储区、定义段及定义过程等都采用伪指令表示。5.4.1 数据定义伪指令 数据定义伪指令用来定义一个变量的类型,并将所需要的数据放入指定的存储单元中,也可以只给变量分配存储单元,而不赋予特定的值。,1.数据定义伪指令的一般格式为:变量名 伪指令 操作数,操作数;注释2.常用的数据定

16、义伪指令 定义字节变量伪指令DB 定义字变量伪指令DW 定义双字变量伪指令DD 定义四字变量伪指令DQ 定义十字节变量伪指令DT,例DATASEGMENT;定义数据段B1DB10H,30H;存入两个字节10h,30hB2DB2*3+5;存入表达式的值0BHS1DB good!;存入5个字符W1DW1000H,2030H;存入两个字W2DD12345678H;存入双字S2 DBAB;存入41H,42HS3DW AB;存入42H,41HDATA ENDS;数据段结束,除了常数、表达式和字符串外,问号也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋予变量某个确定的初值。格式为

17、:n DUP(初值)n为重复次数,圆括号中为重复内容例DATA SEGMENTBUF1DB?BUF2DB8DUP(0);给字节变量BUF2分配8个存储单元,初值为0BUF3DW5DUP(?);给BUF3分配5个字单元BUF4DW10DUP(0,1,?);10个0,1,?BUF5DB50DUP(2,2 DUP(4),6);50个2 4 4 6DATA ENDS,例如:D1 DB01,30,10H D2 DW01,2*3,100 D3 DBAB D4 DWAB 字符串可以看成串常数,用单或双引号引住,得到的是字符串的ASCII码值。在汇编期间存储器中存入数据情况如图3.8所示。,例如:A1 DB

18、2 DUP(0,2 DUP(1,2),3),4,5,以下指令使用变量B1和B2的方法是合法的:B1 DB11H,22H,33H,44HB2 DW55H,66H,77HMOV AL,B1;取字节,(AL)=11HMOV BL,B1+2;取字节,(BL)=33HMOV AX,B2;取字,(AX)=0055HMOV CX,B2+4;取字,(CX)=0077H对于同样的变量B1和B2,以下使用是非法的:MOV AL,B2;AL是1字节,B2类型属性为2字节,不匹配MOV CX,B1;CX是2字节,B1类型属性为1字节,不匹配,5.4.2 符号定义伪指令 符号定义伪指令的用途是给一个符号重新命名,或定义

19、新的类型属性等。这些符号可以包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。常用的符号定义伪指令有EQU、LABLE。,1.EQU伪指令,作用:将表达式的值赋于一个名字,表达式可以是常数、变量、寄存器名、指令助记符、数值表达式或地址表达式等。例:COUNTEQU100;COUNT代替常数VALEQUASCII_TABLE;代替变量SUMEQU30*25;代替数值表达式ADREQUES:BP+DI+10;代替地址表达式CEQUCX;代替寄存器MEQUMOV;代替指令助记符,2.等号伪指令,格式:名字=表达式=与EQU伪指令区别:等号可以对同一个名字重复定义。例COUNTEQU10

20、;代替常数COUNTEQU10+20;不能再次定义但COUNT=10;代替常数COUNT=10+20;可以重复定义,3.LABLE伪指令,用途:在原来标号或变量的基础上定义一个类型不同的新的标号或变量。格式:变量名或标号名LABLE类型符LABEL伪操作使同一个变量具有不同的类型LABEL伪操作的格式为:name LABEL type数据项表示法中type 为 BYTE,WORD DWORD例如:ARR_BYTE LABEL BYTE ARR_WORD DW 1122H,3344H,5566H,7788H,9900H,对于以ARR_WORD变量名为开始的存储器中 同一个单元,同时定义了字节属性

21、和字属性,使用ARR_BYTE变量名时,为字节属性;使用ARR_WORD变量名时,为字属性。如果指令中写作:MOV AL,ARR_BYTE 那么读一字节数据22H到AL;如果写作:MOV AX,ARR_WORD 那么读一个字数据1122H到AX。,4.程序开始和结束伪操作 程序开始可用NAME和TITLE为模块取名字,并不是必要的。格式为:NAME module-namemodule-name是程序员给出的模块名,如果没使用NAME伪操作.,也可以使用TITLE伪操作,格式为:TITLE textTITLE可指定列表文件每一页上打印的标题,text最多可有60个字符。若程序中无NAME伪操作,

22、则汇编程序将用text中的前六个字符作为模块名。,5.对准伪操作 EVEN 伪操作使下一个字节地址从偶数开始,一个字的地址最好从偶地址开始,所以对于字数组,为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到这一目的。格式为:EVEN例如:EVEN WORD_ ARRAY DW 100dup(?),ORG伪操作指定其后的偏移地址,格式为:ORG constant expression如常数表达式的值为n,则ORG伪操作可以使下一字节的地址为n。例如:ORG 100H V0 DW 2233H,4455H则V0的偏移地址为100H。,汇编程序对源程序汇编的过程中,使用地址计数器计数器的值用来$

23、表示,汇编语言允许用户直接用$来引用地址计数器的值。例如:JNE$+6转向地址是JNE指令的首地址加上6。例如:ORG 0010H ARRAY1 DW 1,2,$+4,3,4,$+5汇编后的存储区将如图3.10所,图3.10 ARRAY1占用存储空间图,6.基数控制伪操作汇编程序默认的数为十进制数,因而除非专门指定,否则汇编程序把程序中出现的数均看成十进制数,当使用其它基数表示常数时,需要专门给以标记,例如:二进制数由B表示,如:00110100B 十进制数由D表示,如:165D 八进制数由O或Q表示,如:1677Q 十六进制数由H表示,如:0ABCDH,当第一个符是字母时,前面必须加0。可用

24、RADIX伪操作将默认的基数改变为216范围的基数。,如默认的基数为10时,指令 MOV BX,0FFH MOV BX,178用RADIX伪操作将基数改为16时,指令可以写作 RADIX 16 MOV BX,0FF MOV BX,178D此时十进制数后须跟标记D,十六进制数后一般不标记H,但是一个16进制数,例如2D,为了与十进制数2D区别,十六进制数要标记H。,5.4.3 段定义伪指令,用途:在汇编语言程序中定义逻辑段,用它来指定段的名称和范围,并指明段的定位类型、组合类型及类别。常用的段定义伪指令有SEGMENT、ENDS和ASSUME等。1.SEGMENT/ENDS伪指令SEGMENT用

25、于定义一个逻辑段,给逻辑段赋予一个段名SEGMENT位于一个逻辑段的开始,ENDS表示一个逻辑段结束,代码段以外的其他段段定义格式如下:segment nameSEGMENT;行1;segment nameENDS;行n代码段段定义格式如下:segment nameSEGMENT;行1ASSUME assignment,assignment;行2;segment nameENDS;行n,ASSUME是伪操作,ASSUME操作只能指定某个段名与某个段寄存器联系,提供给汇编程序把源程序翻译成目标程序时使用,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把代码段以外的段地址装入相应的段寄存器

26、中。,一个程序可以由多个段组成。例如:;-定义DATA1段DATA1SEGMENTARRAY DB 1,2,3,4,5,A,B TABLE DW 0FFFFH,0000HDATA1ENDS;-定义DATA2段DATA2SEGMENTBUFFER DB 20 DUP(?,?,?)DATA2ENDS,;-定义代码段CODESEGMENTASSUME CS:CODE,DS:DATA1,ES:DATA2 START:;程序员自己把段地址装入相应的段寄存器中。MOVAX,DATA1;DATA1段地址送AXMOVDS,AX;DATA1段地址经AX送DSMOVAX,DATA2;DATA2段地址送AXMOVE

27、S,AX;DATA2段地址经AX送ESCODEENDSEND START;行n,如果需要用连接程序把本程序与其他程序模块连接时,就需要使用SEGMENT的类型及属性说明格式:段名 定位类型 组合类型 类别(段内语句系列)段名 ENDS类型及属性说明如下:,定位类型,主要有:BYTE:逻辑段从字节的边界开始,该段可以从任何地址开始。WORD:该段必须从字的边界开始,即段地址必须为偶数。PARA:逻辑段从一个节的边界开始,通常16个字节为一个节。默认PAGE:逻辑段从页边界开始。256个字节为一页,故本段的起始地址最低8为必须为0组合类型,主要有:PRIVATE:每段都有自己的基地址。默认组合类型

28、。PUBLIC:连接时将具有相同类别名的其它分段连接在一起,其连接次序由连接命令指定。COMMON:该段在连接时与其它同名分段有相同的起始地址。连接长度是各分段中的最大长度。,STACK:指定该段在运行时为堆栈段的一部分。同PUBLIC,不同程序中的逻辑段,如果类别名相同,则顺序连接成为一个逻辑段。MEMORY:连接程序将把本段定位在被连接在一起的其他所有段之上。AT expression:使段的起始地址是表达式所计算出来的16位段地址,但它不能用来指定代码段.例AT 5300H则本段从存储器的物理地址53000H开始装入。(3)类别:必须放在单引号内作用:在连接时决定各逻辑段的装入顺序。类别

29、名相同的逻辑段,按出现的先后顺序排列,没有类别名的逻辑段,与其他无类别名的逻辑段一起连续装入内存。,5.4.4 过程定义伪指令 在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。使用格式:过程名 PROC NEAR/FAR(语句系列)RET(语句系列)过程名 ENDP 调用一个过程的格式为:CALL 过程名,5.4.5 结构定义伪指令 结构就是相互关联的一组数据的某种组合形式。用伪指令STRUC和ENDS把相关数据定义语句组合起来,便构成一个完整的结构。使用格式:结构名 STRUC(数据定义语句序列)结构名 ENDS,5.4.6 模块定义与连接

30、伪指令 在编写规模较大的汇编语言源程序时,可以将整个程序划分为几个独立的源程序,称之为模块。将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。各模块之间可以相互进行符号访问。为了进行模块之间连接和实现相互的符号访问,以便进行变量传送,通常使用以下几个伪指令:NAME、END、PUBLIC、EXTRN。,1.NAME伪指令用于给源程序汇编以后得到目标程序指定一个模块名,连接时需要使用这个目标程序的模块名。使用格式:NAME 模块名2.END伪指令表示源程序到此结束,指示汇编程序停止汇编。使用格式:END 标号标号表示程序执行的启动地址多个模块连接时,只有主模块的E

31、ND语句使用标号3.PUBLIC伪指令说明本模块中的某些符号是公共的,可以提供给其他模块使用。使用格式:PUBLIC 符号其中,符号可以是本模块的变量、标号、过程名等4.EXTRN伪指令说明本模块中所用的某些符号是外部的,在其他模块中定义的用PUBLIC伪指令说明的符号。使用格式:EXTRN 名字:类型名字必须在其他模块中定义的符号,类型必须与定义符号的模块中的类型一致如果为变量,类型:BYTE WORD DWORD等如果为标号和过程,类型:NEAR FAR,5.5 汇编语言程序上机过程,5.5.1 汇编语言的工作环境及上机步骤 1硬件环境 目前8086汇编语言程序一般多在IBM PC/XT及

32、其兼容机上运行,要求机器具备基本配置即可以了。2软件环境 主要是指支持汇编语言程序运行和帮助建立汇编语言源程序的一些软件,主要包括:(1)DOS操作系统(2)编辑程序EDIT.COM(3)宏汇编程序MASM.EXE(4)连接程序LINK.EXE(5)调试程序DEBUG.COM,3运行汇编语言程序的步骤,(1)用编辑程序EDIT.COM建立扩展名为.ASM的汇编语言源程序文件;(2)用汇编程序MASM.EXE将汇编语言源程序文件汇编成用机器码表示的目标程序文件,其扩展名为.OBJ;(3)若在汇编过程中出现语法错误,根据错误信息提示(如位置、类型、说明),用编辑软件重新调入源程序进行修改。无错误时采用连接程序LINK.EXE把目标文件转化成可执行文件,其扩展名为.EXE;(4)生成可执行文件后,在DOS命令状态下直接键入文件名就可执行该文件。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号