微机原理与接口技术第四章汇编语言程序设计本章内容4.1概述4.2汇编语言的格式与语法4.3DOS与BIOS中断调用4.4汇编语言程序设计和上机过程4.1概述-程序设计语言机器语言:每种CPU都有自己独立的一套指令系统,其能直接理解和执行的是二进制机器码形式,这种二进制编码格式语言称为机器语言。特点是占内存少、执行速度快,但难以记忆、容易出错,实际中很少使用。例:89H,DCH汇编语言:用指令的助记符来表示二进制机器码的语言称为汇编语言,即是机器语言的符号表示。它是一种面向机器的程序设计语言,通常是为特定计算机或计算机系列专门设计的。特点是允许直接调用CPU内部资源,代码精简,占内存少,执行速度快,但通用性差,编写、调试周期长。常用来编制系统软件、实时控制程序、实时通信程序及接口的驱动程序等。例:MOVSP,BX高级语言:是面向过程的语言(如:BASIC语言、C语言等),不依赖于具体的计算机结构和指令系统。特点是通用性强,可移植,但目标程序长,执行速度慢。4.1概述-汇编程序用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序(Assembler)翻译成机器语言程序常使用的汇编程序是Microsoft公司的宏汇编MASM,它可以将源程序翻译成对应的目标程序,并且:检查语句语法自动分配存储区将其他进制转换为二进制数计算表达式的值展开宏命令4.2汇编语言的格式与语法4.2.1源程序的结构4.2.2语句的格式与构成元素4.2.3语句的操作数4.2.3.1常量4.2.3.2变量和标号4.2.3.3表达式4.2.4伪指令4.2.5宏指令4.2.1源程序的结构汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三种逻辑段组成:数据段、附加段——定义和存放数据、变量堆栈段——堆栈区域代码段——存放程序指令4.2.1源程序的结构NAMEPROGRAMMOVAX,EXTRASTACKSEGMENTSTACKMOVES,AXSTADB100DUP(?)……STACKENDSMOVAX,OFFSETSDAT;----------------------------------------------CALLP1DATASEGMENT……SDATDB1,2,3,4,5MOVAH,4CHDATAENDSINT21H;-----------------------------------------------MAINENDPEXTRASEGMENT;------------------------------------------------DDATDB5DUP(?)P1PROCEXTRAENDS……;------------------------------------------------RETCODESEGMENTP1ENDPASSUMECS:CODE,SS:STACK;-----------------------------------------------ASSUMEDS:DATA,ES:EXTRACODEENDSMAINPROCFAR;----------------------------------------------MOVAX,DATAENDMAINMOVDS,AX堆栈段数据段扩展段代码段代码段4.2.1语句的格式汇编语言的语句有两种:指令性语句:由8086指令构成的语句指示性语句:由伪指令构成的语句指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应,指令性语句汇编时生成机器码。指示性语句由汇编程序执行,它指示汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应,在汇编时不生成机器码。标号:指令的符号地址,用来代表指令在存储器中的地址符号:段、过程、变量的名字,用来代表它们在存储器中的地址指令助记符:8086指令助记符、伪指令助记符操作数:即指令的操作对象对指令性语句:0,1,2个对指示性语句:根据需要而定操作数之间以逗号分隔操作数可以由标号、常量、变量、表达式、寄存器操作数和存储器操作数等构成例如:AX,[DI+BX+10],DATA,200,16*8+TABLE,等等4.2.2语句的构成元素注释:以分号开头,可放在指令后,也可单独一行。注意注释的写法,要写指令(或程序段)在程序中的作用,而不要写指令的操作。例如:以下为同一条指令写的注释1)MOVCX,100;传送100到CX2)MOVCX,100;循环计数器置初值显然,第二种写法要比第一种写法要好4.2.2语句的构成元素4.2.3语句的操作数4.2.3.1常量4.2.3.2变量和标号4.2.3.3表达式4.2.3.1常量常量操作数:数值常数:11001000B,0FA21H,329D(329)字符常数:‘ABCD’(41H42H43H44H)例:MOVAX,0FA21HVARDB329STRDB‘ABCD’变量:指存储器存储单元中的数据,数据运行时可改变变量名:是存储单元的符号地址变量在程序中作为存储器操作数被引用变量有三个属性:段地址:变量所在段的段地址偏移地址:变量所在存储单元的偏移地址类型:有BYTE、WORD和DWORD等例:MOVAX,VARPUSHVAR4.2.3.2变量与标号-变量标号:指令所在存储单元的符号地址标号的三个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内偏移地址;类型:NEAR或FAR:NEAR:段内转移或段内调用FAR:段间转移或段间调用标号通常作为转移指令的转移地址JMPlabelJNZnon_zero4.2.3.2变量与标号-标号组成:A-Z(不分大小写),0-9,?@._$不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义例如:正确的:LP1,AGAIN,NEXT,_GO,OK_1错误的:4M,LOOP,AAA,#HELP,+ONE4.2.3.2变量与标号-命名规则4.2.3.3表达式表达式由标号、常量、变量等加上必要的运算符构成有数字表达式和地址表达式两种汇编时按优先规则对表达式进行计算,计算出具体的数值或地址,运行时不能改变表达式中的运算符包括:算术、逻辑、关系、分析以及属性运算符等算术运算符包括:加:+,减:-,乘:*,除:/,取模:MOD例:MOVAX,4*1024汇编后的形式为:MOVAX,4096逻辑运算符包括:与:AND、或:OR、异或:XOR、非:NOT例:MOVCL,36HAND0FH经汇编后:MOVCL,06H逻辑运算符只能用于数字表达式中。注意,不要把逻辑运算符与逻辑运算指令混淆:例:ANDAX,3FC0HAND0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与以下指令等价:ANDAX,3F00H4.2.3.3表达式—算术运算符分析运算符包括:SEG、OFFSETSEG:取变量/标号的段地址OFFSET:取变量/标号的偏移地址例:VARDB12HMOVBX,OFFSETVAR;取变量VAR的偏移地址MOVAX,SEGVAR;取变量VAR的段地址SEG、OFFSET运算符在汇编过程取相应地址4.2.3.3表达式—分析运算符4.2.3.3表达式—属性运算符PTR属性运算符PTR用来指定地址操作数的类型格式:类型PTR地址操作数类型∈{BYTE,WORD,DWORD,NEAR,FAR}BYTE、WORD、DWORD用于描述数据存储单元(变量)地址例:MOVWORDPTR[BX],03HNEAR、FAR用于描述转移、调用的目的地址例:JMPFARPTRLABEL1例:MOV[DI],0;类型不定MOVBYTEPTR[DI],0;字节类型MOVWORDPTR[DI],0;字类型4.2.3.3表达式—属性运算符PTRDI48H45H00H45H00H00HBYTEPTRWORDPTRDIDI4.2.3.3表达式—属性运算符PTRPTR也可用来进行强制类型转换例:VARDW1234H;VAR定义为字类型MOVAX,VAR1;合法MOVAL,VAR1;非法MOVAL,BYTEPTRVAR1;合法4.2汇编语言的格式与语法4.2.1源程序的结构4.2.2语句的格式与构成元素4.2.3语句的操作数4.2.3.1常量4.2.3.2变量和标号4.2.3.3表达式4.2.4伪指令4.2.5宏指令4.2.4伪指令伪指令由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令程序模块定义伪指令定义模块连接标号和变量的伪指令4.2.4伪指令—数据定义伪指令用于对程序中使用的变量进行定义通过变量定义指明变量的类型,并为其分配存储单元。数据定义伪指令的格式为:变量名数据定义伪指令操作数,操作数,…VARDW1234H常用的数据定义伪指令有如下几种:DB定义字节DW定义字DD定义双字DQ定义4字型变量(占8字节存储空间)DT定义10字节变量(表示BCD码,或用于浮点运算)数据定义伪指令中的操作数可以是常数、变量或表达式DATA1_BDB10DATA2_BDB5DATA3_BDB10HDATA1_WDW100HDATA2_WDW-4DATA_DDD0FFFBH汇编后的内存分配情况如右图所示。Q05H10H00H01HFCHFFHFBHFFH00H00H0AHDATA_BDATA_WDATA_D10510H100H-40FFFBH数据定义伪指令-例1操作数可以是字符串,使用DB,DW例STR_DBDB‘HELLO’STR_DWDW‘AB’,‘CD’汇编后的情况如图:注意下面两个定义的不同之处:STR_DBDB‘AB’;41H在低字节,42H在高字节STR_DWDW‘AB’;42H在低字节,41H在高字节STR_DB‘H’‘E’‘L’‘L’‘O’48H45H4CH4CH4FH数据定义伪指令-例2STR_DB‘A’41H42H42H41HSTR_DW‘B’‘B’‘A’?用来分配存储空间,但不置初值例1:RSVDB?复制操作符DUP:重复的数据可以使用复制操作符DUP,如上面RSV亦可写成:例2:STRDB10DUP(‘A’)DATADB10DUP(30H,9DUP(20H))若操作数中若使用$,则表示的是地址计数器的当前值。例3BUFDW0A32H,$,$+3数据元素的初值:ADDR+1,(ADDR+2)+34.2.4伪指令—数据定义伪指令:?、DUP、$例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3设TABLE的偏移地址为0080H,则汇编后如下图所示:BUFFER0080H80HTABLE008AH008BH008CH008DH...8FH00H00H0089H10Bytes数据定义伪指令-例34.2.4伪指令—符号定义伪指令:EQU将一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示类似于C语言中的#define汇编时,符号被符号代表的内容替换例:COUNTEQUCXTENEQU10MOVCOUNT,TEN汇编后:MOVCX,104.2.4伪指令—段定义伪指令汇编语言程序是按段来组织程序和数据的,段的划分与存储器的物理段相对应。汇编语言程序中的段称为逻辑段,汇编连接后被映射到相应的物理段中。逻辑段共分为:代码段、堆栈段、数据段和附加段段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一个段的基本格式:段名SEGMENT[定位类型][组合方式][类别]汇编语言语句段名ENDSSEGMENT和ENDS成对出现,二者前面的段名应一致伪指令SEGMENT说明了一个段的开