1第四章汇编语言程序设计§1汇编语言的程序结构和语句格式§2汇编语言程序设计基础§3实用程序设计举例2§1汇编语言的程序结构和语句格式一、概述二、汇编语言的语句三、汇编语言的伪指令语句四、汇编语言源程序的框架结构3一、概述1、计算机程序设计语言(1)机器语言(MachineLanguage)(2)汇编语言(AssemblyLanguage)汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少而且执行速度快。4用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,有基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。汇编语言源程序的处理过程如下:汇编程序汇编语言源程序机器语言目标程序机器语言执行文件.exeEdit编辑程序LINK5(3)高级语言(High-levellanguage)BASICFORTRANCOBOLPASCALFORTHC/C++(4)混合语言(HybridLanguage)TCL/TK62、汇编语言程序上机过程(1)汇编语言上机的工作环境硬件环境目前8086汇编语言程序一般多在IBMPC/XT及其兼容机上运行,要求机器具备基本配置即可以了。软件环境主要是指支持汇编语言程序运行和帮助建立汇编语言源程序的一些软件,主要包括:(1)DOS操作系统(2)编辑程序EDIT.COM(3)宏汇编程序MASM.EXE(4)连接程序LINK.EXE(5)调试程序DEBUG.COM7上机环境硬件系统软件应用软件操作系统:DOS系统编辑器:EDIT.exe编程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备8(2)汇编语言上机过程D:EDITABC.asmD:MASMABC;有语法错,回EDIT下改该程序D:LINKABC;有错,回在EDIT下改程序D:ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:DEBUGABC.exe编辑源程序EDITABC.ASM汇编源程序MASMABC.ASM形成目标程序ABC.OBJ连接目标程序LINKABC.OBJ有连接错误信息?形成可执行程序ABC.EXE装入可执行程序到内存,并执行D:\ABC下一程序用DEBUG调试可执行程序D:\DEBUGABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?9运行汇编语言程序的步骤说明:◘用编辑程序EDIT.COM建立扩展名为.ASM的汇编语言源程序文件;◘用汇编程序MASM.EXE将汇编语言源程序文件汇编成用机器码表示的目标程序文件,其扩展名为.OBJ;◘若在汇编过程中出现语法错误,根据错误信息提示(如位置、类型、说明),用编辑软件重新调入源程序进行修改。无错误时采用连接程序LINK.EXE把目标文件转化成可执行文件,其扩展名为.EXE;◘生成可执行文件后,在DOS命令状态下直接键入文件名就可执行该文件;或进入DEBUG状态调试该文件。10(3)汇编语言程序运行实例给出的程序是从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。设定源程序名为STR.ASM。用EDIT建立汇编语言源程序在DOS状态下,调用EDIT编辑程序建立文件名为STR.ASM的汇编源程序。其屏幕显示如下图:1112用MASM汇编生成目标文件源程序文件建立完毕后,调用宏汇编程序MASM对STR.ASM进行汇编,结果如下图所示:13用LINK进行连接生成可执行文件汇编完毕程序正确,则可调用LINK进行连接,生成可执行文件STR.EXE,过程如下图所示。14程序的运行在DOS状态下,直接键入可执行的程序文件名STR,然后从键盘输入10个字符,并将其倒序排列输出,过程如下图所示。153.源程序与PCDOS的接口汇编语言源程序是在PCDOS环境下运行的,必须了解汇编语言是如何同DOS操作系统接口的。汇编语言源程序经过汇编变为目标程序,当用链接程序对其进行链接和定位时,操作系统首先为每个用户程序建立一个程序段前缀(ProgramSegmentPrefix,简称PSP)区,长度为100H(即256个字节),主要用于存放用户程序的相关信息。然后,在PSP的开始处(偏移地址0000H)安排一条INT20H软中断指令。INT20H中断服务程序是由PCDOS提供的,该程序的功能是使系统返回到DOS管理状态。因此,我们编写程序时,必须在程序最后安排适当的语句,使得程序执行完毕后能够转去执行存放于PSP开始处的INT20H指令16★确定内存可用部分以便存放要执行的.exe文件。建立程序段前缀PSP(ProgramSegmentPrefix)◢程序段前缀大小100H,即256个字节。◢存放进程间的控制信息。◢PSP最开始的两个字节CD20,是一条INT20H指令。设置DS为PSP的段基值装入可执行程序.exe0000:0000H可用内存空间内存FFFF:0000HROMBIOS系统检测程序COMMAND.COMDOS系统1KB中断向量表CD20、、、、、、、、、hello.exexxxx:0000Hxxxx:00FFH程序段前缀用户程序汇编语言源程序在PCDOS下运行程序时完成以下操作:17方法一:调用20H类型的中断程序返回DOS采用下面的程序框架,可保证执行INT20H时,当前的CS值为程序段前缀在内存的段值。codeSEGMENTASSUMECS:codemainPROCFAR;使RET为远返回start:PUSHDS;入栈保存地址MOVAX,0;程序段前缀的首地址PUSHAX…;程序主体部分…RET;取程序段前缀首地址mainENDPcodeENDSENDstartCD20xxxx、、、0000xxxx:0SS:SPSS:SP程序段前缀PSPPSP的段值PSP的偏值用户程序CSIP18注意:不可在汇编语言程序的最后用INT20H返回DOS。原因是20h中断子程的执行是有条件的。采用第二种返回DOS的程序结构,才能满足该条件,否则无法返回。不可在程序的最后用INT3返回DOS。原因是3类型的中断子程实现断点设置,只在DEBUG下起作用。19方法二:用户程序执行后自动返回返回DOS在要返回DOS处,安排指令:MOVAH,4CHINT21H执行完4CH的功能调用,即返回DOS。例codeSEGMENTASSUMECS:codestart:…;程序主体部分……MOVAH,4CH;返回DOSINT21HcodeENDSENDstart20codeSEGMENT;把一个单字节数按二进制显示ASSUMECS:codestart:............MOVAH,4CH;返回DOSINT21HcodeENDSENDstartMOVCX,8;显示字符个数为8next:SHLBL,1;将显示位移至CF中JCone;CF=1?MOVDL,30H;CF=0,将0的ASCII放在DL中JMPexitone:MOVDL,31H;CF=1,将1的ASCII放在DL中exit:MOVAH,2INT21H;调用DOS功能显示DECCX;循环次数减1JNZnext;判断是否结束MOVBL,53H;设置一个测试53h21codeSEGMENTASSUMECS:codestart:…;程序主体部分.........MOVAH,4CH;返回DOSINT21HcodeENDSENDstart一个完整汇编程序的基本框架:22二、汇编语言的语句1、语句类型8086/8088宏汇编MASM使用的语句可以分成3种类型:指令语句:这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。伪指令语句:伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。23宏指令语句:宏指令语句是以某个宏名字定义的一段指令序列。汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展。242.语句格式一般情况下,汇编语言的指令语句可以由以下几部分组成:[标号:]指令助记符[操作数][;注释]伪指令语句和宏指令语句又称为指示性语句,其格式为:[名字]定义符[操作数][;注释]dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDSENDstart例:25(1)标号和名字●标号表示本条语句的符号地址;名字是一个符号,一般来说,名字可以是变量名、常量名、过程名、指令名等。●标号、名字统称为标识符,都具备3种属性——段属性、偏移属性及类型属性。●标识符定义:①由字符A~Z,a~z,0~9及符号@、$、下划线_等组成,最长31个字符,超出部分忽略。②不能用数字打头,以免与十六进制数相混。③不使用汇编程序中的保留字。(如指令的助记符等)④对定义的符号不区分大小写。26(2)助记符项和定义符指令助记符和定义符又可称为操作符,可以是机器指令、伪指令和宏指令的助记符。对于指令,汇编程序将其翻译成机器语言指令。MOVAX,100→B80001对于伪操作,汇编程序据其要求的功能进行处理。dataSEGMENT→data与一段值对应stringDB‘Tsinghua’→string与一内存地址对应27(3)操作数项操作数给出参与操作的数或数所在的地方。操作数多于一个时,用逗号分开。操作数可以是常数、寄存器、存储器操作数、标号名、过程名或表达式等。[标号:/名字]指令助记符/定义符[操作数][;注释]操作数项28(4)注释项由分号引出,用来说明语句或程序的功能。可以用英文或者中文书写。注释字段是语句的非执行部分。汇编程序对分号后的内容不做处理。作用:①注释程序,增强程序可读性。②可放在语句最前,暂时注释某语句,调试程序用。例…;MOVAH,2;显示提示信息;MOVDL,’A’;INT21H…[标号:/名字]指令助记符/定义符[操作数][;注释]注释项293、语句中的操作数有4类:常量、寄存器、存储器及表达式(1)寄存器操作数如寄存器名AH、BH、CH、DH(2)常量操作数▣数字常量可以是二进制数、八进制数、十进制数或十六进制数表示▣字符常量是用单引号‘’括起来的ASCII字符,其值是该字符的ASCII代码值▣符号常量是用标识符定义的常量。例如,采用符号定义语句PORTAEQU80H,则指令MOVAL,PORTA与指令MOVAL,80H等价。30◢◢数字默认十进制,也可加D表示十进制数。如1234D,1234◢◢数字后加B表示二进制数。如1010B◢◢数字后加H表示十六进制数。如1234H◢◢字符常量,用单引号表示。如‘1234’汇编时,用字符对应的ASCII表示。如31H,32H,33H,34H◢◢A、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。例data1DB12,34,56;十进