您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 微型计算机原理及应用技术(朱金钧版)5
汇编语言程序设计5.1宏汇编语言的基本语法5.2伪指令5.3宏指令5.4汇编语言程序的结构5.5DOS系统功能调用5.6汇编语言程序设计第5章汇编语言●汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址。●使用汇编语言编写的程序称作汇编语言源程序。汇编语言源程序不能由机器直接执行而必须翻译成由机器代码组成的目标程序,这个过程称为汇编。●把汇编语言源程序翻译成目标程序的软件称为汇编程序。汇编语言源程序目标程序汇编程序汇编过程的含义如图:宏汇编语言的基本语法5.1.1常数、变量和符号●常数、变量和符号是汇编语言能识别的数据项,是指令和伪指令语句中操作数的基本组成部分,其大小和属性与机器语言代码生成有直接关系。5.1变量标号常数常数●常数是没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化,它可以有以下几种类型:2.八进制数:●以字母O或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、377Q1.二进制数:●以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B3.十进制数:●由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略字母。例如:1234D或1234。4.十六进制数:●以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且必须以数字开头。例如:56H,0B3FH5.字符串常量:●用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。例如:“A”的值是41H,”B”的值是42H常数变量●变量通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。变量使用数据定义伪指令DB、DW、DD等定义的。经过定义的变量,每个变量均有三个属性:1.段属性(SEGMENT):●表示变量存放在哪一个逻辑段中(即变量所在段的段地址)。2.偏移属性(OFFSET):●表示变量的偏移地址,即在逻辑段中距段的起始点的字节数。3.类型属性(TYPE):●表示变量占用存储单元的字节数。用DB定义的变量类型属性为字节;用DW定义的变量类型属性为字(2字节);用DD定义的变量类型属性为双字(4字节)标号●标号表示一条指令所在的地址,所以标号也是指令语句的地址符号,常用作转移指令(包含子程序调用指令)的操作数,即目标地址。●标号通常由字母数字串组成,但第一个字母必须为字母。标号有三种属性:1.段属性(SEGMENT):●表示标号所在段的段基址。2.偏移属性(OFFSET):●表示标号的偏移地址,即标号地址在逻辑段中距段的起始点的字节数。3.距离属性(或类型属性TYPE):●表示标号作为段内或段间的转移属性。(1)NEAR(近):●表示本标号只能被标号所在段内的转移和调用指令访问(即段内转移)距离属性分为两种:(2)FAR(远):●表示本标号可以被其他段(不是标号所在段)的转移和调用指令访问(即段间转移)表达式与运算符8086宏汇编语言允许使用的表达式有两种类型:5.1.2它所产生的结果是一个存储器地址,如果这个地址存放的是数据,一般称它为变量,如果存放的是指令,一般称它为标号。只产生数值结果。数指表达式地址表达式1.算术运算符2.逻辑运算符3.关系运算符运算符主要包括以下6种类型4.分析操作符5.综合运算符6.其他运算符:算术运算符[例5-1]CONT=15*4;CONT=60CONT=CONT/8;CONT=7CONT=CONTMOD3;CONT=1MOVAL,21HSHL2;AL=84H●包括加(+)、减(-)、乘(*)、除(/)、求余数(MOD)、左移(SHL)和右移(SHR)注意:●除了加和减法运算符可以使用变量和符号外,其他运算符只适用于常数的数值运算。逻辑运算符[例5-2]ANDDX,PORTANDOFEH其中第二个AND是逻辑运算符,在程序汇编时,计算PORTANDOFEH产生一个立即数作为指令操作数。而第一个AND是指令助记符,在汇编以后执行AND指令,DX的内容与上述立即数相“与”,结果放在DX中。●包括按位操作的与(AND)、或(OR)、异或(XOR)、和非(NOT)四种运算符。它们只适用于对常数进行逻辑运算。注意:●AND、OR、XOR和NOT也是指令助记符。关系运算符[例5-4]MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)此例中当PORT的值小于5时,执行MOVBX,20否则执行MOVBX,30。[例5-3]MOVBX,PORTLT5若PORT的值小于5,则汇编程序把上条指令汇编为:MOVBX,OFFFFH;否则被汇编为:MOVBX,0。●包括EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或大于)、GE(大于或等于)共六种。分析操作符(数值返回运算符)(2)取段基址格式:SEG变量名或标号功能:取变量名或标号所在段的段地址。(1)取地址的偏移量格式:OFFSET变量名或标号功能:取变量名或标号所在段的段内偏移量。格式:TYPE变量名或标号功能:返回一个数字值。若TYPE运算符加在变量名前,返回的数值是该变量的类型属性;若TYPE运算符加在标号前,返回的数值则是该变量距离属性;返回的数值与性的关系表4-1。求变量名或标号的类型值(3)标号/变量属性类型值字节变量BYTE1字变量WORD2双字变量DWORD4标号NEAR-1标号FAR-2表5-1存储器操作数的类型值[例5-5]BUF1DB100DUP(0)BUF2DB200DUP(20H)BUF3DD100DUP(13H)则LENGTHBUF1=100LENGTHBUF1=100LENGTHBUF1=100(4)求长度格式:LENGTH变量名功能:返回一个变量名所占的存储单元(字节、字或双字)的数目。如果变量使用重复定义子句说明的,则返回DUP前面的数值;若没有DUP明,则返回值总是1。分析操作符(数值返回运算符)(5)求大小格式:SIZE变量名功能:返回变量名所占存储单元的字节数,它等于LENGTH和TYPE两个运算符返回值的乘积。[例5-6]上例中SIZEBUF1=100SIZEBUF2=200SIZEBUF3=0分析操作符(数值返回运算符)综合运算符[例5-7]MOVBYTEPTR[DI],4;指明目的操作数为字节类型JMPDWORDPTR[BP];指明目的操作数为双字节类型(即指明转移操作为段间转移)(1)PTR运算符格式:类型PTR表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令内有效。[例5-8]AEQUTHISBYTEBDW20DUP(?)A、B对应同一存储器地址,对变量A为字节访问,对变量B为字节访问,且A和B具有相同的段基址和偏移量。(2)THIS运算符格式:THIS类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。综合运算符●THIS运算符使下面的“原标号或原变量”另有新的名字和类型,但并不分配新的存储单元。注意:其他运算符[例5-9]K1EQU1234HMOVAL,LOWK1;AL←34HMOVBL,HIGHK1;BL←12H(1)HIGH和LOW运算符格式:HIGH表达式LOW表达式功能:从运算对象中分理处高字节或低字节。[例5-10]L1:JMPSHORTL2┇L2:MOVAX,BX┇运算符的优先级见表4-2所示。(2)SHORT运算符格式:SHORT标号功能:当转移的目标地址与本转移指令的下一条指令之间的字节距离在–128~127范围时,可以用SHORT运算符进行说明。其他运算符表5-2运算符的优先级别优先级别运算符高低0括号中的表达式1LENGTH,SIZE,WIDTH,MASK2PTR,OFFSET,SEG,TYPE,THIS,段前缀(段寄存器名)3HIGH,LOW4*,/,MOD,SHL,SHR5+、-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT伪指令5.2.1伪指令语句的格式伪指令语句的格式为:符号名定义符操作数;注释●定义符字段在伪指令语句中,定义符表示该语句的伪操作功能。定义符有汇编程序规定,宏汇编程序中使用了数十种定义符。5.2●符号名字段符号名用在伪指令语句的前面,用空格和定义符隔开。●操作数字段操作数可以是常数(二进制、十进制、十六进制等)、字符串、常量名、变量名、标号和一些专用符号等。●注释字段这是一个任选字段,它必须以分号开始,和指令语句的注释功能一样。常用伪指令●符号名一被EQU定义,就不能再赋值,既不能用EQU在位符号名重新赋值。[例5-11]ALFAEQU100COUNTEQUALFA(1)等值伪指令格式:符号名EQU表达式功能:将表达式的值赋给符号名。1.符号定义伪指令(赋值语句)5.2.2注意:[例5-12]ALFA=100MOVAL,ALFA;AL←100ALFA=ALFA+2;ALFA=102MOVAL,ALFA;AL←102(2)等号伪指令格式:符号名=表达式功能:将表达式的值赋给符号名等号伪指令可以在程序中不同的地方多次使用以重新为符号名赋值。常用伪指令[例5-13]BARYLABELWORD;定义BARY为字类型┆ADDAX,BARY;字加法ABCFLABELFAR;ABCF为FAR类型标号(3)定义符号名和伪指令格式:符号名LABEL类型功能:定义一个标号或变量,并指定其类型。常用伪指令格式:[变量名]DB表达式;定义字节[变量名]DW表达式;定义字[变量名]DD表达式;定义双字[变量名]DQ表达式;定义8个字节[变量名]DT表达式;定义10个字节数据定义伪指令2.●表达式是赋给变量的初始值,可以有一个,也可以有多个,常见的有以下几种:[例5-14]BUFDB20H,30HDATDW1234H,5678H;变量BUF字节单元的内容是20H,下一个字节单元即BUF+1单元的内容为30H。;字变量DAT的内容为1234H,占用两个字节单元,34H存放在低地址单元,12H存放在高地址单元,下一个字单元即DAT+2单元的内容为5678H,仍是低字节存在低地址单元。●这实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。数值表达式(1)[例5-15]STRINGDB‘ABCD’;将A的ASCII码41H存在STRING字节单元,将B、C、D的ASCII码依次存放在后续单元(即STRING+1、STRING+2和STRING+3单元)*DW伪指令可以有两个字符组成的字符串分配一个字单元。[例5-16]STRING1DW‘AB’;等价于STRING1DW4142HASCII字符串●可以用DB伪指令为ASCII字符串中的每一个字符分配一个字单元。(2)?表达式●这是为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。[例5-17]RESULTDB?;预置一个字节单元,其值不定(4)重复定义子句DUP●利用重复定义子句DUP可以为若干个重复数据分配存储单元。带DUP的表达式格式如下:nDUP(表达式)●其中圆括号内的表达式是重复的内容,n是重复次数。(3)段定义伪指令●段定义伪指令用于将源程序划分成若干段,这些逻辑段按用途可分为代码段(用于存放程序)、数据段(用于存放数据)、堆栈段(用于堆栈操作)和附加段(附加的数据段)。●需要说明的是,并不是所有的程序都必须包含这四个逻辑段,有时只需要一个段或两个段。格式:段名SEGMENT[定位类型][组合类型][′类别名′]┆段名ENDS●功能:把模块划分为若干个逻辑段。每个SEGMENT/ENDS可定义一个逻辑段。3.●SEGMENT后的三个参数一般来说可以任选,它们的含义、类型及功能如下:●定位类型表示将某段装入内存时,对段的起始边界的要求。合理选择定位类型能够在进行段和模块的定位时充分利用存储空间。它有以下四种选择:●PAGE:●PARA:●WORD:●BYTE:定位类型(1)组合类型●用来在多模块连接时告诉连接程序本段和其
本文标题:微型计算机原理及应用技术(朱金钧版)5
链接地址:https://www.777doc.com/doc-6450742 .html