第三章汇编语言程序设计_第1页
第三章汇编语言程序设计_第2页
第三章汇编语言程序设计_第3页
第三章汇编语言程序设计_第4页
第三章汇编语言程序设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、工业用微型计算机第三章 汇编语言程序设计 程序是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。 本章将首先介绍8086宏汇编语言的基本语法及常用伪指令,然后用实例说明8086宏汇编语言源程序的设计方法。机器语言:当指令和数据都用二进制代码表示时,计算机能够直接识别与执行。高级语言:是完全独立于机器的通用语言,效率低。面向过程、面向对象,必须译成机器语言。汇编语言:汇编语言是一种用符号表示的、面向CPU指令系统的程序设计语言。是用指令的助记符、符号地址、标号等编写程序的语言 。(汇编语言程序是机器语言程序的符号表示)用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断

2、系统等),直接对位、字节、字、寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统提供的各种寻址方式,编制出高质量的程序。程序目标代码占用内存少,执行速度快,效率高,具有实时性。汇编程序的作用将源程序翻译成机器语言程序。按用户要求自动分配存储区域(如程序区、数据区等)。自动地把各种进制数 二进制数。把字符 ASCII码。计算表达式的值。自动对源程序进行检查,指出语法错误(如非法格式、未定义的助记符、标号、漏掉操作数等)一、汇编语言的程序结构与语句格式(一)、汇编语言源程序的框架结构1、源程序的结构特点(1)、按逻辑段组织源程序,即源程序由若干个逻辑段组成,每段由伪指令SEGME

3、NT开始、由ENDS结束。(2)、在代码段起始处,用ASSUME伪指令说明各个段Reg与逻辑段的关系,并在程序起始处设置段Reg的初值(代码段CS除外)。(3)、每段由若干语句行组成,每行只有一条语句且不能超过128个字符,允许有后续行。整个源程序以END结束,它通知汇编程序停止汇编。END后的START标号为程序运行时的起始地址。(4)、每条语句由4个字段构成。各字段间用空格分开。(5)、源程序中设有返回DOS的指令语句,使程序执行完后返回DOS系统的命令接受状态。2、源程序与PC DOS的接口汇编语言源程序(.ASM)经过汇编转变为目标程序(.OBJ),当用链接程序对其进行链接和定位时,操

4、作系统为每个用户程序建立:(1)、一个256字节的程序段前缀区(PSP),存放用户程序信息。在PSP的开始处(偏移地址0000H)安排一条INT 20H 软中断指令。 INT 20H功能是使系统返回到DOS管理状态。因此,用户执行程序完后,必须能够转到PSP起始处执行INT 20H指令。(2)、定位用户程序 (3)、置DS和ES的值使之指向PSP的开始处,即PSP的段地址 DS和ES。 (4)、将用户程序的段基址、第一条指令的偏移地址设置CS、IP;同时设置SS、SP。 (5)、运行用户程序(二)、 8086汇编语言的语句1、语句的种类(1)、指令语句:可执行语句,对应CPU指令系统规定的一条

5、指令。汇编时,汇编程序为之产生一一对应的机器目标代码。(2)、伪指令语句:汇编时给汇编程序提供与硬件有关的汇编信息,本身并不产生目标代码,CPU不执行,是指示汇编程序进行汇编的操作。2、语句格式(注意:方括号表示该内容可有可无。)指令语句的一般格式:标号: 前缀 指令助记符 操作数 ;注释 伪指令语句的一般格式:名字 伪指令定义符 操作数 ;注释(1)、标号和名字标识符字段由各种有效字符组成,一般表示符号地址,具有段基址、偏移量、类型三种属性。很多情况下标识符字段是语句中的可选部分,主要为便于程序的读写方便而使用。标识符字段通常有:标号 后跟冒号,在程序中作为JMP、LOOP指令的转移目标,与

6、具体的指令地址相联系。名字 用于定义常量名、变量名、过程名、段名等。注意:标号和名字必须符合汇编语言对标识符的规定以字母开头,由字母(不分大小写)、数字(09)及部分特殊字符(? $和下划线_等)组成,字符串长度不超过31个。 标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等,如:CPU的内部寄存器名AH、AL、AX等。(2)、助记符、定义符规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。对于指令,汇编程序将其翻译成机器语言指令,如MOV AX, 100表示B8 00 01;对于伪指令,汇编程序据其要求的功能进行处理,如data SEGMENT表示data与一段地址对应。注意

7、:前缀仅可出现在指令助记符前。(3)、操作数指令语句中提供给指令的操作对象、存放位置。操作数可以是0个、1个或2个,2个时用逗号“,”分开。(INC BX; MOV AX,DATA;)伪指令语句中操作数的格式和含义随伪操作指令不同而不同。 (4)、注释 以“;”开始,给以编程说明。汇编程序对“;”后的内容不做处理。注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。二、8086汇编中的伪指令有符号定义语句、数据定义语句、程序结构语句、模块链接语句、有关宏的语句、条件汇编语句等。1、符号定义语句给表达式赋予一种符号名,以便在程序中用它替代表达式。(1)、等值语句 格式:符号名 EQ

8、U 表达式例: PORT EQU 40H ;用PORT代替40H号端口 COUNT EQU CX ;用COUNT代替CX寄存器注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。(2)、等号语句 格式:符号名=表达式例:PP = 89FAH ;赋值 PP = PP+1 ;PP = 89FBH 注:等号语句与EQU语句的相同点:符号不是变量,所以用EQU、= 定义的符号不占用存储器单元。区别:等号语句可以在同一源程序中重复定义符号。2、变量定义语句用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。(1)、基本格式:变量名

9、 数据定义符 操作数 ,操作数,操作数变量名:指示存储器操作数的地址(符号地址);数据定义符:指示存储器操作数的类型(字节、字、双字等);操作数:指示存储器操作数的内容,是赋给变量的初值。多个相同类型的变量可在一条语句中定义。汇编程序将定义的操作数,按其类型分配内存单元数, 并顺序存入变量名指向的内存单元中。常用的数据定义符有:DB:变量为字节数据类型 DW:变量为字数据类型DD:变量为双字数据类型 DQ:变量为4字数据类型(64位)DT:变量为10字节的压缩BCD数(80位)例:定义赋初值的变量data SEGMENTxx DB 1, -1, 0FCHyy DW 1, -1, 0FCHzz

10、DD 1,- 1, 0FCH data ENDS(2)、具体形式和功能1)为数据项分配存储单元,用变量名作为该存储单元的名称。 2)预留内存单元,但不赋值,以存放运算结果.3)定义一个数组4)定义字符串(只能用DB定义 )5)将已定义的地址存放内存单元 3、段定义伪指令用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器,具体来说就是规定段的起始和结束,指定段的属性。段的定义有简化定义和完整定义,下面只介绍完整定义。(1)、段定义语句SEGMENT/ENDS格式:段名 SEGMENT 定位类型组合属性类别名 (段体) 段名 ENDS 说明:a、段定义由伪操作SEGMENT开始、ENDS

11、结束。SEGMENT 和ENDS 必须成对出现,且段名必须相同(段名是合法的标识符,与某个存储单元相联系);b、SEGMENT和ENDS语句之间可以有其他指令或伪指令,表示存放在该段内存中的变量、指令或其他伪指令对该段内存的处理;c、程序中可以定义多个段;d、程序经汇编、连接及装入内存后,段名为一具体的段值。段定义的相关约定1)、定位类型:告诉链接程序链接时段的起始边界,有4种选择:BYTE:段起始地址为任意值,即从任何地址开始都行。WORD:段起始地址必须是偶数(XX0B),最低1位必须为0。PARA:段起始地址必须是16的倍数(XXXX0H),最低4位必须为0。PAGE:段起始地址必须是2

12、56的倍数(XXX00H),最低8位为0。注意:缺省类型为PARA。 2)、组合类型在多模块(每个模块有自己的代码段、数据段、堆栈段)组合时,告诉链接程序本段与其他模块中同名段的链接关系,有6种选择:NONE:本段与其它同名段逻辑上不发生关系,有自己的段基地址(缺省选择)。PUBLIC:在满足定位类型的前提下,链接程序将其与其他模块中的同名段邻接在一起,共用一个段地址。链接的先后次序由链接命令指定。STACK:与PUBLIC同样处理,链接后作为堆栈段,并自动初始化SS、SP,SS指向第一个STACK段。若程序中不说明STACK ,则必须由用户在程序的开始处,自己通过语句设置SS、SP。COMM

13、ON:各模块中同名段重叠覆盖,有着相同的起始地址。段的长度取决于最长的COMMON段。段的内容为所链接的最后一个模块中COMMON段的内容。MEMORY:链接在其他所有段的后面(高端存储区 )。若有多个MEMERY段,则只认第一个,其余按COMMON处理。AT表达式:链接程序把本段装在表达式值所指定的段地址(此方式不能指定代码段)。3)、类别名给各段的名字信息,表示段的类别。类别必须用单引号括起来,典型类别名如:STACK、CODE和DATA等。若缺省类别名,则表明该段类别为空。同名同类别的段在内存中依序连续存放。 (2)、段寄存器说明伪指令格式: ASSUME 段寄存器:段名,段寄存器:段名

14、, 设定特定的Sreg指向特点的段,说明源程序中定义的段应由哪一个Sreg去寻址。否则,汇编程序无法生成机器代码程序。 ASSUME并未真正的将段地址装入相应的Sreg。 Sreg的初值还必须由用户在程序的开始处用MOV指令来设置(CS除外)。(3)、指定地址伪指令 在汇编程序中,有一个软件计数器(LC)地址计数器。在每个段定义开始处,它被复位为0。当汇编程序逐行扫描语句时,用LC保存当前指令的地址。 格式1:ORG 表达 ;将表达式的值(065535) LC格式2:ORG $+表达式 ;将LC的当前值$表达式的值 LC功能:强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏

15、移地址。ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。(此语句本身并不占内存。)(4)、模块的定义和通信MASM宏汇编语言提供了模块化编程伪指令,用以实现模块的定义与通信。一个任务的源程序由若干模块组成,每个模块有代码段、数据段等,对应一个.ASM,是个独立的编译单位。当各个模块编译完毕,可用LINK连接各模块形成一个完整的可执行程序(.exe)。1)、模块定义伪指令NAME/ END格式: NAME 模块名 ;为模块命名 ······· ;语句 END 标号 ;结束

16、模块a、模块名的作用是指示给连接程序进行连接用。b、源程序中可无模块定义,此时源文件名作为模块名。c、主模块的END后要跟标号,子模块不跟标号。d、 部分可省略。2)、模块间通信伪指令 实现模块间数据或过程的互访和共享。格式:PUBLIC名字 ,名字, EXTRN名字:类型 ,名字:类型,a、名字可以是标号、变量名、过程名或由EQU(或)伪指令定义的符号名。b、类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS(常量属性)等。c、【PUBLIC 和EXTRN配对使用。d、由PUBLIC 说明的名字是全局的,可以在其他模块中使用。e、EXTRN表明本模块中使用的名字在别的模块中定

17、义过,且类型一致。4、过程和宏定义伪指令过程和宏是模块化程序设计的基础。汇编语言中常用定义过程和宏的方法来实现按模块管理程序代码的功能。(1)、过程定义伪指令过程:一段可以由CALL指令调用,用RET返回的程序。当整个源程序由主、子程序构成时,主、子程序都在代码段,且都可用过程来表示(即定义为过程)。格式: 过程名 PROCNEAR/FAR ······ RET 过程名 ENDP功能:定义一个过程,并指出过程名及过程的属性。说明:a、过程定义由伪指令PROC开始、ENDP结束。PROC和ENDP之间为过程的指令序列。b、程序中可以定义

18、多个过程。c、程序经汇编、连接及装入内存后, 过程名为一具体的内存地址,指示子程序入口。 、过程的属性有NEAR和FAR NEAR过程只能被定义该过程的段中的其他程序调用(段内调用);FAR过程可由任何段中的程序调用(段间调用)。缺省时为NEAR、根据过程的属性,汇编程序自动对CALL、RET翻译成段内(段间)调用及段内(段间)返回的目标代码。(2)、宏定义伪指令为减少重复编写相同语句段的工作,我们可以使用“宏”功能。宏定义是指用一个标识符(宏名)来代替一组指令序列(可同时包含指令性语句和指示性语句)。宏功能的使用过程是:宏定义、宏调用、宏展开。宏定义格式:宏指令名 MACRO 形参,形参&#

19、183;····· ;指令序列 ENDM 宏调用在源程序中用宏指令代替所定义的程序段。格式:宏指令名 实参,实参宏扩展:汇编时,将相应的程序段中的每条语句前冠以“”,代替宏指令以产生目标代码。三、8086汇编中的操作数 1、常量操作数在运行期间不变化的量:立即数、端口地址。(1)、数值常量如:2 (B) 、10 (D)、8 (Q)、16 (H)的整型常量。注意:对16进制数:必须以数字打头,若最高位为字母AF,必须加前缀0。(2)、字符串常量是用单引号括起来的一个或多个字符,值为字符的ASCII码值。例:A=41H AB=4142H 1234

20、31323334H 2、Reg操作数操作数部分是寄存器名,如:AX、SI和DS等。 3、存贮器操作数有标号与变量两种(1)、标号在代码段内,与指令地址相关联。(或某个过程起点位置相关联) (2)、变量在数据段或堆栈段内,是存放数据的存贮单元的符号地址,与各种存储器操作数寻址方式有关。常以变量名的形式出现在程序中。(3)、标号和变量都与存储器地址相关联,都具有以下三种属性: 段属性(SEGMENT)段基址,标号或变量所在段的段地址。 偏移量属性(OFFSET)段内偏移地址,标号或变量所在地址与所在段的段起始地址之差。 类型属性(TYPE)对变量,指变量存取单位的字节数大小,有字节(BYTE) 、

21、字(WORD)、双字(DWORD)、4字、10字节5种。对标号,指标号与使用它的指令之间的距离远近。(如:对转移指令来说,有NEAR标号或FAR标号) 4、表达式操作数表达式由各种操作数、运算符和操作符组成,可出现于源程序的任何地方,在汇编时计算(而不是在程序执行过程中)。汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。根据表达式所表示的内容而分:(1)、数值表达式:由常量及算术逻辑运算符、或关系运算符连接而成,在汇编时产生一个数值。(2)、地址表达式:由常量、变量、标号、寄存器的内容及一些运算符组成。四、8086汇编中的运算符和操作符MASM宏汇编中有三种运算符:算

22、术、逻辑和关系运算符;两种操作符:分析和合成操作符。运算符:实现对操作数的相关运算。 操作符:完成对操作数属性的定义、调用和修改。1、运算符(1)、算术运算符+、×、/、MOD(取余数)数值表达式中可使用所有算术运算符,地址表达式仅使用“+、”两种算术运算符。如标号或变量±常量,运算后仍为标号或变量,其3个属性中的类型及段基址属性不变,仅修改了偏移量属性。注意:算术运算符不影响标志位例:完成80H+90H 解:MOV AL,80H+90H ;使用数值表达式 ;(AL)=10H、CF=不变 MOV AL,80H ;使用加法指令 ADD AL,90H ;(AL) = 10H、C

23、F = 1(2)、逻辑运算符AND、OR、XOR和NOT实现操作数按位逻辑操作,只适用于数值表达式。注意:逻辑运算符与逻辑指令助记符形同意不同作为指令助记符时,是在程序运行时被执行,操作对象可以是寄存器或存储器操作数。作为运算符时,是在程序汇编时由汇编程序计算的,计算结果充当指令的某一个操作数或构成操作数的部分。(3)、关系运算符EQ(等于)、NE(不等)、LT(小于)GT(大于)、(LE小于等于)和GE(大于等于)在两个无符号操作数之间进行大小关系比较,两个操作数必须同是数值或同是一个段内的两个存储器地址。关系不成立则结果为“0”(假: 0);若关系成立则结果为全“1”(真:FFFFH)。结果值在汇编时获得。例:MOV BX,PORT LT 5 汇编为:MOV BX,0FFFFH(条件成立) 或 MOV BX,0000H (条件不成立)2、操作符分析操作符:运算对象是存储器操作数,它返回变量或标号的属性值。合成操作符(修改属性运算符):作用于存储器操作数时可以改变它们的属性。(1)、分析操作符(SEG、OFFSET、TYPE、SIZE 、LENGTH) 使用格式:操作符 标号或变量 1)、SEG、OFFSET返回标号或变量的段地址和偏移地址2)、

温馨提示

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

评论

0/150

提交评论