微机原理汇编语言.ppt_第1页
微机原理汇编语言.ppt_第2页
微机原理汇编语言.ppt_第3页
微机原理汇编语言.ppt_第4页
微机原理汇编语言.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本章主要教学内容 l 汇编语言和汇编程序的基本概念 l 汇编语言源程序书写规则、语句格式及程序分段 l 伪指令语句的格式、功能及应用 l 汇编语言源程序的建立、汇编、连接、调试及运行,第5章 汇编语言的基本表达及其运行,5.1 汇编语言和汇编程序的基本概念 5.1.1 汇编语言 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址。,5.1.2 汇编程序 用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。 有基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。 汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。 目标程序文件经连接定位后由计算机执行; 源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。,5.2 汇编语言源程序书写格式 5.2.1 汇编语言源程序的分段结构 汇编源程序一般由3个逻辑段组成,即数据段、堆栈段和代码段。每个逻辑段以SEGMENT语句开始,以ENDS语句结束。整个源程序以END语句结束。 数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。 堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。 代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。,注:必须用ASSUME伪指令告诉汇编程序,哪一段和哪一个段寄存器相对应,即某一段地址应该放入哪一个段寄存器 在DOS环境下,通常采用DOS的4CH号中断功能调用使汇编语言返回DOS。 不需要再对CS和SS进行初始化,5.2.2 汇编语言源程序的语句类型和语句格式 1语句类型 8086宏汇编MASM使用的语句可以分成3种类型: 指令语句:这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。 伪指令语句:伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。 例如:告诉汇编程序源程序 有几个段,段名,定义变量和定义过程,给变量分配存储单元,给符号赋值,给数字或表达式命名。 宏指令语句:可包括多条指令或伪指令 。在汇编时,按照宏指令的定义,在出现宏指令的地方将其展开还原。,2语句格式 一般情况下,汇编语言的语句可以由以下几部分组成: 名字 操作符 操作数 ;注释 1)名字是一个符号,它表示本条语句的符号地址。一般来说,名字可以是标号和变量,统称为标识符。 名字的组成 字母A-Z,a-z;数字0-9;专用字符?. - $ 注:数字不能为名字的第一个位置 .只能出现在名字的第一个位置 名字最长31个字符组成 2)指令语句和伪指令语句中名字的区别 指令语句的名字之后要用冒号,而伪指令语句名字后不用 例:LAB1:MOV AX,2050H;指令语句,LAB1是名字,也是指令第一字节的符号地址 VAR1 DW 1200H;伪指令语句,VAR1是名字,也是符号地址,VAR1和VAR1+1存放00 12,指令语句中的名字一般采用标号 NEXT:MOV AX,1234H 一个标号与一条指令的地址相联系,因此标号可以作为JMP和CALL指令的操作数 JNZ NEXT CALL APAR 伪指令语句中的名字可以是变量名、段名、过程名、符号名等 BUF DW 1234H CODE SEGMENT APAR PROC,3)标号和变量的属性 标号和变量都具备3种属性:段属性、偏移属性及类型属性。 段属性:该属性定义了标号和变量的段起始地址 标号的段由CS指示 变量的段通常由DS或ES指示 偏移属性:表示标号和变量相距段起始地址的字节数,16位 类型属性:标号是在本段内引用NEAR还是在其他段中引用FAR。 变量有几个字节长度。由定义变量的伪指令DB、DW和 DD等决定。,2.操作符字段 操作符可以是机器指令、伪指令和宏指令的助记符。 操作数字段是操作符的操作对象。当有两个及以上的操作数时,用逗号隔开。 注释字段是以“;”开头的说明部分,可以用英文或者中文书写。注释字段是语句的非执行部分 。,5.3 8086汇编语言中的标识符、表达式和运算符 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 ? 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(求段基值)、OFFSET(求偏移量)、TYPE(求变量类型)、LENGTH(求变量长度)和SIZE(求字节数)。,(1) SEG操作符格式为: SEG 变量名或 标号名 回送变量或标号的段地址值。 例如:若DATA1是从存储器06000H物理地址开始的一个数据段的段名,PADD是该段中的一个变量名。则 MOV BX,SEG PADD 相当于MOV BX,0600H,(3) TYPE操作符格式为: TYPE 变量名 或 标号名 存储器操作数类型 TYPE返回值 BYTE 1 WORD 2 DWORD 4 NEAR -1 FAR -2 TYPE运算符加在变量前面,返回的是这个变量所对应的TYPE返回值,如TYPE VAR1=1 TYPE运算符加在结构前面,返回的是结构包含的字节数 如 STUDENT STRUC NAME DB WANG NUMBER DB ? STUDENT ENDS 则:TYPE STUDENT=5 TYPE运算符加在标号前面,返回标号的属性是NEAR还是FAR,(4) LENGTH操作符格式为: LENGTH 变量名 LENGTH和SIZE操作符只能和数据存储器地址操作数(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 MOV CX,SIZE WORDS1 相当于MOV CX,2,5)属性操作符 属性操作符主要有PTR、段操作符、SHORT、THIS、HIGH、LOW六种。 (1) PTR操作符格式为: 类型 PTR 存储器地址表达式 PTR将它左边的类型指定给右边的表达式 类型可以是BYTE WORD DWORD NEAR FAR,它 本身并不实际分配存储器。 VAR1 DB 30H,40H VAR2 DW 2050H MOV AX,WORD PTR VAR1;将4030HAX MOV BL,BYTE PTR VAR2;将50HBL,有时汇编程序分不清所存入的数据是字节还是字, 此时必须用PTR来说明属性。 例如: MOV DX,20 格式是错误的,必须写成 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有共同之处,建立一个特殊类型的存储器地址操 作数,而不实际为它分配新的存储单元。例如: ARRAY1 EQU THIS BYTE ARRAY2 DW 30 DUP(?) 此时, ARRAY1的段地址和偏移地址与ARRAY2相同,但类 型不同,ARRAY1是字节类型,ARRAY2是字类型。 另外也可以按如下方法使用: BEGIN EQU THIS FAR START: MOV AX,0 此时, MOV指令有一个FAR属性的地址BEGIN,允许其它 段的JMP指令直接跳转到BEGIN来,同时允许本段指令 JMP NEAR START 或者JMP SHORT START转移到MOV指令处,(5)HIGH和LOW操作符 HIGH和LOW操作符是字节分离操作符, 它接收 一个数或地址表达式,HIGH取其高字节, LOW取 其低位字节。例如: MEMOFFADD EQU 0123H 指令 MOV CL, HIGH MEMOFFADD 汇编成MOV CL,01H MOV BH, LOW MEMOFFADD 汇编成MOV BH,23H,5.4 伪指令语句 在汇编语言中,伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理。 例如定义数据、分配存储区、定义段及定义过程等都采用伪指令表示。 5.4.1 数据定义伪指令 数据定义伪指令用来定义一个变量的类型,并将所需要的数据放入指定的存储单元中,也可以只给变量分配存储单元,而不赋予特定的值。,1. 数据定义伪指令的一般格式为: 变量名 伪指令 操作数 ,操作数 ;注释 2. 常用的数据定义伪指令 定义字节变量伪指令DB 定义字变量伪指令DW 定义双字变量伪指令DD 定义四字变量伪指令DQ 定义十字节变量伪指令DT,例 DATA SEGMENT ;定义数据段 B1 DB 10H,30H;存入两个字节10h,30h B2 DB 2*3+5 ;存入表达式的值0BH S1 DB good! ;存入5个字符 W1 DW 1000H,2030H;存入两个字 W2 DD 12345678H;存入双字 S2 DB AB ;存入41H,42H S3 DW AB ;存入42H,41H DATA ENDS ;数据段结束,除了常数、表达式和字符串外,问号也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋予变量某个确定的初值。 格式为:n DUP (初值) n为重复次数,圆括号中为重复内容 例 DATA SEGMENT BUF1 DB ? BUF2 DB 8 DUP(0);给字节变量BUF2分配8个存储单元,初值为0 BUF3 DW 5 DUP(?);给BUF3分配5个字单元 BUF4 DW 10 DUP(0,1,?);10个0,1,? BUF5 DB 50 DUP(2,2 DUP(4),6);50个2 4 4 6 DATA ENDS,例如: D1 DB 01,30,10H D2 DW 01,2*3,100 D3 DB AB D4 DW AB 字符串可以看成串常数,用单或双引号引住,得到的是字符串的ASCII码值。 在汇编期间存储器中存入数据情况如图3.8所示。,例如:A1 DB 2 DUP(0,2 DUP(1,2),3),4,5,以下指令使用变量B1和B2的方法是合法的: B1 DB 11H,22H,33H,44H B2 DW 55H,66H,77H MOV AL,B1 ;取字节,(AL)=11H MOV BL,B1+2 ;取字节,(BL)=33H MOV AX,B2 ;取字,(AX)=0055H MOV CX,B2+4 ;取字,(CX)=0077H 对于同样的变量B1和B2,以下使用是非法的: MOV AL,B2 ;AL是1字节,B2类型属性为2字节,不匹配 MOV CX,B1 ;CX是2字节,B1类型属性为1字节,不匹配,5.4.2 符号定义伪指令 符号定义伪指令的用途是给一个符号重新命名,或定义新的类型属性等。这些符号可以包括汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。 常用的符号定义伪指令有EQU、LABLE。,1.EQU伪指令,作用:将表达式的值赋于一个名字,表达式可以是常 数、变量、寄存器名、指令助记符、数值表达式或地址 表达式等。 例: COUNT EQU 100 ;COUNT代替常数 VAL EQU ASCII_TABLE ;代替变量 SUM EQU 30*25 ;代替数值表达式 ADR EQU ES:BP+DI+10 ;代替地址表达式 C EQU CX ;代替寄存器 M EQU MOV ;代替指令助记符,2.等号伪指令,格式: 名字=表达式 =与EQU伪指令区别:等号可以对同一个名字重复定义。 例 COUNT EQU 10 ;代替常数 COUNT EQU 10+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变量名为开始的存储器中 同一个单元,同时定义了字节属性和字属性, 使用ARR_BYTE变量名时,为字节属性; 使用ARR_WORD变量名时,为字属性。 如果指令中写作: MOV AL,ARR_BYTE 那么读一字节数据22H到AL; 如果写作: MOV AX,ARR_WORD 那么读一个字数据1122H到AX。,4. 程序开始和结束伪操作 程序开始可用NAME和TITLE为模块取名字, 并不是必要的。格式为: NAME module-name module-name是程序员给出的模块名, 如果没使用NAME伪操作.,也可以使用TITLE 伪操作,格式为: TITLE text TITLE可指定列表文件每一页上打印的标题,text最多 可有60个字符。若程序中无NAME伪操作, 则汇编程序 将用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。,汇编程序对源程序汇编的过程中, 使用地址计数器计数器的值用来$表示, 汇编语言允许用户直接用$来引用地址计数器的值。 例如: 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。 可用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用于定义一个逻辑段,给逻辑段赋予一个段名 SEGMENT位于一个逻辑段的开始,ENDS表示一个逻辑段结束,代码段以外的其他段段定义格式如下: segment name SEGMENT ;行1 ; ; segment name ENDS ;行n 代码段段定义格式如下: segment name SEGMENT ;行1 ASSUME assignment, , assignment ;行2 ; ; segment name ENDS ;行n,ASSUME是伪操作,ASSUME操作只能指定某个段名与某个段寄存器联系,提供给汇编程序把源程序翻译成目标程序时使用,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把代码段以外的段地址装入相应的段寄存器中。,一个程序可以由多个段组成。 例如: ;-定义DATA1段 DATA1 SEGMENT ARRAY DB 1,2,3,4,5,A,B TABLE DW 0FFFFH,0000H DATA1 ENDS ;-定义DATA2段 DATA2 SEGMENT BUFFER DB 20 DUP(?,?,?) DATA2 ENDS,;-定义代码段 CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2 START: ;程序员自己把段地址装入相应的段寄存器中。 MOV AX,DATA1 ;DATA1段地址送AX MOV DS,AX ;DATA1段地址经AX送DS MOV AX,DATA2 ;DATA2段地址送AX MOV ES,AX ;DATA2段地址经AX送ES CODE ENDS END START ;行n,如果需要用连接程序把本程序与其他程序模块连接时, 就需要使用SEGMENT的类型及属性 说明格式: 段名 定位类型 组合类型 类别 (段内语句系列) 段名 ENDS 类型及属性说明如下:,定位类型,主要有: BYTE:逻辑段从字节的边界开始,该段可以从任何地址开始。 WORD:该段必须从字的边界开始,即段地址必须为偶数。 PARA:逻辑段从一个节的边界开始,通常16个字节为一个节。默认 PAGE: 逻辑段从页边界开始。256个字节为一页,故本段的起始地址最低8为必须为0 组合类型,主要有: PRIVATE:每段都有自己的基地址。默认组合类型。 PUBLIC:连接时将具有相同类别名的其它分段连接在一起,其连接次序由连接命令指定。 COMMON:该段在连接时与其它同名分段有相同的起始地址。连接长度是各分段中的最大长度。,STACK:指定该段在运行时为堆栈段的一部分。同PUBLIC,不同程序中的逻辑段,如果类别名相同,则顺序连接成为一个逻辑段。 MEMORY :连接程序将把本段定位在被连接在一起的其他所有段之上。 AT expression:使段的起始地址是表达式所计算出来的16位段地址, 但它不能用来指定代码段. 例AT 5300H 则本段从存储器的物理地址53000H开始装入。 (3)类别:必须放在单引号内 作用:在连接时决定各逻辑段的装入顺序。类别名相同的逻辑段,按出现的先后顺序排列,没有类别名的逻辑段,与其他无类别名的逻辑段一起连续装入内存。,5.4.4 过程定义伪指令 在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。 使用格式: 过程名 PROC NEAR/FAR (语句系列) RET (语句系列) 过程名 ENDP 调用一个过程的格式为: CALL 过程名,5.4.5 结构定义伪指令 结构就是相互关联的一组数据的某种组合形式。 用伪指令STRUC和ENDS把相关数据定义语句组合起来,便构成一个完整的结构。 使用格式: 结构名 STRUC (数据定义语句序列) 结构名 ENDS,5.4.6 模块定义与连接伪指令 在编

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论