第5章汇编语言程序设计•5.1宏汇编语言的基本语法•5.2伪指令•5.3宏指令•5.4汇编语言程序的结构•5.5DOS系统功能调用•5.6汇编语言程序设计方法汇编语言●汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址。●使用汇编语言编写的程序称作汇编语言源程序。汇编语言源程序不能由机器直接执行而必须翻译成由机器代码组成的目标程序,这个过程称为汇编。●把汇编语言源程序翻译成目标程序的软件称为汇编程序。汇编过程的含义如图:汇编语言源程序目标程序汇编程序汇编8086/8088系统的汇编程序ASM-868086宏汇编程序MASM-865.1宏汇编语言的基本语法5.1.1常数、变量和标号●常数、变量和标号是汇编语言能识别的数据项,是指令和伪指令语句中操作数的基本组成部分,其大小和属性与机器语言代码生成有直接关系。变量标号常数常数●常数是没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程序的运行中也不会发生变化,它可以有以下几种类型:1.二进制数:●以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B5.1.1常数、变量和标号2.八进制数:●以字母O或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、377Q3.十进制数:●由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略字母。例如:1234D或1234。4.十六进制数:●以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且必须以数字开头。例如:56H,0B3FH5.字符串常量:●用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。例如:‘A’的值是41H,‘B’的值是42H(字母打头必须前面补0,否则将出现汇编语法错误。)注意•常数定义常数名EQU(=)数值或字母例如:AAEQU30BB=1000HCCEQU10001010BDD=‘ABC’MOVAX,AAMOVAL,AAMOVBX,BBMOVBH,BB;错BH将产生溢出“=”可重复定义EQU不可重复定义●变量通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。变量名可看成存放数据存储单元的符号地址。变量5.1.1常数、变量和标号经过定义的变量,每个变量均有三个属性:1.段属性(SEGMENT)●表示变量存放在哪一个逻辑段中(即变量所在段的段地址)。3.类型属性(TYPE)●表示变量占用存储单元的类型。2.偏移属性(OFFSET)●表示变量的偏移地址,即在逻辑段中距段的起始点的字节数。•变量定义例如:XDB0AHAAEQU1ABCHYDWAABUF_DISDB?STRDB‘ABCD1234’,12H,0ACH重复子句表达式:NDUP(表达式)例如:AADB10DUP(0)BBDW5DUP(21*5),0DH,0AHTABDB100DUP(5DUP(1),2)字节DB(8位)一个字节存贮单元字DW(16位)二个连续字节存贮单元双字DD(32位)四个连续字节存贮单元四字DQ(64位)8个连续字节存贮单元五字DT(80位)10个连续字节存贮单元●标号表示一条指令所在的地址,所以标号也是指令语句的地址符号,常用作转移指令(包含子程序调用指令)的操作数,即目标地址。●标号通常由字母数字串组成,但第一个字符必须为字母。标号5.1.1常数、变量和标号命名规则:1)1~31个字符2)A~Z、a~z、0~9、?、@、$及下划线构成。3)?不能单独作为标识符。4)无独立的保留字及运算符。合法标号:STA_124$MOV_?@103非法标号:STA+124$MOV?3.距离属性(或类型属性TYPE)●表示标号作为段内或段间的转移属性。2.偏移属性(OFFSET)●表示标号的偏移地址,即标号地址在逻辑段中距段的起始点的字节数。标号有三种属性:1.段属性(SEGMENT)●表示标号所在段的段地址。(1)NEAR(近)●表示本标号只能被标号所在段内的转移和调用指令访问(即段内转移)距离属性分为两种:(2)FAR(远)●表示本标号可以被其他段(不是标号所在段)的转移和调用指令访问(即段间转移)例如:MOVSI,100HMOVDI,200HMOVCX,10HLOOP1:MOVAL,[SI]MOV[DI],ALINCSIINCDILOOPLOOP1•标号定义5.1.2表达式与运算符8086宏汇编语言允许使用的表达式有两种类型:只产生数值结果。数值表达式它所产生的结果是一个存储器地址,如果这个地址存放的是数据,一般称它为变量,如果存放的是指令,一般称它为标号。地址表达式表达式的运算不是在执行程序时进行的,而是由汇编程序在汇编时预先对它进行运算,其结果作为操作数参加指令规定的操作。注意运算符主要包括以下6种类型:1.算术运算符2.逻辑运算符3.关系运算符4.分析操作符5.综合运算符6.其他运算符5.1.2表达式与运算符算术运算符[例5-1]CONT=15*4;CONT=60CONT=CONT/8;CONT=7CONT=CONTMOD3;CONT=1MOVAL,21HSHL2;AL=84H●包括加(+)、减(-)、乘(*)、除(/)、求余数(MOD)、左移(SHL)和右移(SHR)5.1.2表达式与运算符注意:除了加减可以使用变量和标号外,其他运算符只适用于常数的数值运算。逻辑运算符[例5-2]ANDDX,PORTAND0FEH其中第二个AND是逻辑运算符,在程序汇编时,计算PORTAND0FEH产生一个立即数作为指令操作数。而第一个AND是指令助记符,在汇编以后执行AND指令,DX的内容与上述立即数相“与”,结果放在DX中。●包括按位操作的与(AND)、或(OR)、异或(XOR)、和非(NOT)四种运算符。它们只适用于对常数进行逻辑运算。5.1.2表达式与运算符关系运算符[例5-3]MOVBX,PORTLT5若PORT的值小于5,则汇编程序把这条指令汇编为:MOVBX,OFFFFH;否则被汇编为:MOVBX,0。●包括EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共六种。运算结果为8或16位的值。若关系为假,则结果为0,否则结果为FFH或FFFFH。5.1.2表达式与运算符[例5-4]MOVBX,((PORTLT5)AND20)OR((PORTGE5)AND30)此例中当PORT的值小于5时,执行MOVBX,20否则执行MOVBX,30。5.1.2表达式与运算符分析操作符(数值返回运算符)(1)取地址的偏移量格式:OFFSET变量名或标号功能:取变量名或标号所在段的段内偏移量。(2)取段地址格式:SEG变量名或标号功能:取变量名或标号所在段的段地址。格式:TYPE变量名或标号功能:TYPE运算符加在变量名或标号前,返回一个数字值;返回的数值与属性的关系表如下。求变量名或标号的类型值(3)标号/变量属性类型值字节变量BYTE1字变量WORD2双字变量DWORD4标号NEAR-1标号FAR-2•求段基址SEGMOVAX,SEGAASEGAA为立即寻址是AA的段地址•求符号名的类型值TYPEMOVAL,TYPECC返回变量CC的类型的字节数。字节数据:TYPECC=1字数据:TYPECC=2双字数据:TYPECC=4标号:NEAR=0FFFFHFAR=0FFFEH•求偏移地址OFFSETMOVSI,OFFSETBBOFFSETBB为立即寻址,是BB的偏移地址(4)求长度格式:LENGTH变量名功能:返回一个变量名所占的存储单元(字节、字或双字)的数目。分析操作符(数值返回运算符)5.1.2表达式与运算符用DUP定义变量时为元素个数,否则=1BUFDWNDUP(?);LENGTHBUF=NXDD12345678H;LENGTHX=1(5)求大小格式:SIZE变量名功能:返回变量名所占存储单元的字节数,它等于LENGTH和TYPE两个运算符返回值的乘积。分析操作符(数值返回运算符)5.1.2表达式与运算符例如:BUF1DBN1,N2,N3,…N10BUF2DB10DUP(0)BUF3DW10DUP(?)TYPEBUF1=1,LENGTHBUF1=1,SIZEBUF1=1TYPEBUF2=1,LENGTHBUF2=10,SIZEBUF2=10TYPEBUF3=2,LENGTHBUF3=10,SIZEBUF3=20[例5-7]MOVBYTEPTR[DI],4;指明目的操作数为字节类型JMPDWORDPTR[BP];指明目的操作数为双字节类型;(即指明转移操作为段间转移)(1)PTR运算符格式:类型PTR表达式功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当前指令内有效。综合运算符5.1.2表达式与运算符(2)THIS运算符格式:THIS类型功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表达式。综合运算符5.1.2表达式与运算符例如:XYZEQUTHISBYTE;XYZ为字节类型的常数ABCDW4321H,2255H;ABC为字类型的变量;XYZ、ABC表示同一存贮单元,这一单元有两种类型。MOVAL,XYZ;将XYZ,即21H送入ALMOVBX,ABC;将ABC字单元4321H送入BX其他运算符(1)HIGH和LOW运算符格式:HIGH表达式LOW表达式功能:从运算对象中分理处高字节或低字节。5.1.2表达式与运算符[例5-9]K1EQU1234HMOVAL,LOWK1;AL←34HMOVBL,HIGHK1;BL←12H(2)SHORT运算符格式:SHORT标号功能:当转移的目标地址与本转移指令的下一条指令之间的字节距离在–128~127范围时,可以用SHORT运算符进行说明。其他运算符5.1.2表达式与运算符[例5-10]L1:JMPSHORTL2┇L2:MOVAX,BX┇5.2伪指令8086宏汇编语言指令语句伪指令语句汇编产生目的代码汇编不产生目的代码伪指令语句汇编时被解释执行,其功能是为汇编程序提供一些信息,让汇编程序在汇编过程中完成某些特定的功能。5.2.1伪指令语句的格式●符号名字段符号名用在伪指令语句的前面,用空格和定义符隔开。●定义符字段在伪指令语句中,定义符表示该语句的伪操作功能。定义符由汇编程序规定,宏汇编程序中使用了数十种定义符。●操作数字段操作数可以是常数(二进制、十进制、十六进制等)、字符串、常量名、变量名、标号和一些专用符号等。●注释字段这是一个任选字段,它必须以分号开始,和指令语句的注释功能一样。伪指令语句的格式为:符号名定义符操作数;注释5.2伪指令[例5-11]ALFAEQU100COUNTEQUALFA1.符号定义伪指令(赋值语句)(1)等值伪指令格式:符号名EQU表达式功能:将表达式的值赋给符号名。●符号名一被EQU定义,就不能再赋值,既不能用EQU再为符号名重新赋值。注意5.2.2常用伪指令[例5-12]ALFA=100MOVAL,ALFA;AL←100ALFA=ALFA+2;ALFA=102MOVAL,ALFA;AL←102(2)等号伪指令格式:符号名=表达式功能:将表达式的值赋给符号名,等号伪指令可以在程序中不同的地方多次使用以重新为符号名赋值。1.符号定义伪指令(赋值语句)5.2.2常用伪指令[例5-13]BARYLABELWORD;定义BARY为字类型┆ADDAX,BARY;字加法ABCFLABELFAR;ABCF为FAR类型标号(3)定义符号名伪指令格式:符号名LABEL类型功能:定义一个标号或变量,并指定其类型。1.符号定义伪指令(赋值语句)5.2.2常用伪指令2.数据定义伪指令格式:[变量名]DB表达式;定义字节[变量名]DW表达式;定义字[变量名]DD表达式;定义双字[变量名]DQ表达式;定义8个字节[变量名]DT表达式;定义10个字节5.2.2常用伪指令●表达式是赋给变量的初始值,可以有一个,也可以有多个,常见的有以下几种:[例5-14]BUFDB20H,30H;变量BUF字节单元的内容是20H,下一个;