资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八章,汇编语言程序设计,1、什么叫指令?指令由哪两个部分构成?什么是助记符?,指令语句的基本格式。,2、什么是寻址方式?操作数 可能 在什么地方?,3、8088/8086的六大类指令?,数据传送类,算术运算类,逻辑运算与移位类,串操作类,控制转移类,处理器控制类,汇编语言(,Assembly Language),汇编语言是一种面向机器的程序设计语言,它是一种低级语言。它直接利用机器提供的指令系统编写程序,具体地说,用助记符表示指令的操作码和操作数,用标号或符号代替地址、变量和常量。因此可以说,汇编语言是对机器语言的符号化描述。,汇编语言源程序(,Source File),用汇编语言指令编写的程序称为汇编语言源程序或汇编源程序。通常,汇编源程序以,.,ASM,为扩展名,这是汇编程序默认的扩展名。,汇编程序(,Assembler),汇编程序是将汇编源程序转变为相应目标程序的翻译程序。这个转变的过程称为汇编。汇编程序按其功能范围又可以分为基本汇编、小汇编和宏汇编(,Micro-Assembler,)。,宏汇编能够对包含宏指令及大量伪指令的汇编语言源程序进行汇编,相对而言,功能较强。,我们常用的宏汇编程序有微软公司的,MASM.EXE,和,Borland,公司的,TASM.EXE,(Turbo Assembler)。,机器码,助记符,机器码,反汇编,汇编,ASCII,码,面向用户,B81514,MOV AX,1415H,B81514,宏汇编程序的主要功能:,1、,检查源程序。,2、,检测出源程序中的语法错误,给出相应的出错信息。,3、若没有语法错误,产生,目标文件,,并可给出列表文件(.,LST,同时列出汇编语言和机器语言的文件)。,4、,展开宏指令。,目标程序(,Object Program),目标程序也称为,机器语言程序,,是微处理器真正可以执行的程序。这种程序的指令都是用二进制代码来表示其操作码和操作数的机器语言指令。汇编语言源程序同其他高级语言源程序一样都需要将它翻译成目标程序才能在计算机中运行。,连接程序(,Link Program),汇编后,程序中每个段的开始地址值都置为0,程序装入内存,各段的段地址必须在0地址的基础上浮动一个值,此值要在连接时才确定。连接程序还有一个更重要的功能是可以把多个程序模块连接起来形成一个装入模块,这样,对于每个单独的模块中的外部符号的值是汇编程序无法确定的(因为每个模块是单独汇编的),必须由连接程序来确定。,连接程序可以将各种语言编写的源程序经各自的编译程序编译产生的目标程序(扩展名为.,obj)、,目标程序库 装配成一个可执行程序。当然各目标程序间必须建立必要的通信接口。,连接程序的主要工作是:,1、找到要连接的所有目标模块。,2、对所有的目标模块中的所有的段分配内存单元,即确定所有的段地址值。,3、确定所有汇编程序不能确定的偏移地址值(符号地址)。,4、构成一个装入模块,即可执行程序。也可给出.,MAP,文件,文件中记录的是每个段在内存中的分配情况。,可执行程序(,Executive Program),可执行程序或称可执行文件是指,可以被系统装入内存运行(执行指令)的程序。,扩展名为.,COM、.EXE,等。可执行程序依然是一个存放在外存中的静态程序。它们可以直接被,MS-DOS,操作系统、调试程序,DEBUG,装入内存,由微处理器执行(运行)。从连接程序生成的可执行程序的连接映象文件.,MAP,可以看出,可执行程序的内存分配起始地址依然为0,因此还需要最终确定这个起始地址,将这个可执行程序安全地装入内存(不能同其他内存数据地址发生冲突。例如,从00000,H003FFH,存放的是中断向量表,,DOS,操作系统也有常驻内存的部分等等)。假设在,DOS,下执行用户程序,SAMPLE.EXE:,C:SAMPLE,回车后就开始运行,其过程大致为:,首先由,DOS,的,COMMAND.COM,在内存中用户程序可以使用的区域建立一个256个字节的程序段前缀,PSP(Program Segment Prefix),它包含了执行程序的有关信息和返回,DOS,的路径(断点保存)。,建立,PSP,以后,可执行程序才被调入内存,将可执行程序放在,PSP,的后面,也就是最终确定了可执行程序中所有的代码在内存中的实际地址。此时,CS:IP,的值指向可执行程序代码段的第一条指令,可执行程序开始运行。,语句类型,l,指令语句:,格式为:标号:助记符 操作数;注释,每条语句一般占一行,支持续行符。,l,伪指令语句,伪指令语句是为汇编程序和连接程序提供一些必要的控制信息的管理性语句,伪指令不产生目标代码。伪指令语句对应的伪操作是在汇编过程中完成的,而指令语句对应的操作是在可执行程序运行时完成。,伪指令语句的格式为:,名字 伪操作指令 操作数表 ;注释,其中,名字不能用:作为结尾,名字可以是符号,常量名、段名、变量名、过程名、宏名、结构名、记录名,等,由不同的伪指令决定。操作数是由,分开的一系列操作数(参数)。,宏指令语句,宏指令是具有名称的一段由指令和伪指令语句组成的序列,它实际上是一段汇编语句序列的缩写;在汇编时,汇编程序用对应的代码序列替代宏指令,这个过程又称宏展开,展开后在逐条进行汇编。因此,,宏指令只节省源程序篇幅。,宏指令语句的格式:,宏名,MACRO,形式参数表,名字和标号统称为标识符(,Identifier)。,标识符的命名必须遵循以下规则:,标识符 由字母(,az,AZ)、,数字(09)或某些特殊符号(如_$?.等)组成;,标识符 不能以数字开头,“?”、“$”不能单独作为标识符;标识符是一串连续的符号,中间不能有空格符;标识符中若使用点号“.”,点号必须是第一个字符;,标识符 有效长度为31个字符,若超过只保留前31个字符;,在一个特定的源程序文件中,用户定义的标识符必须是唯一的;,不能使用汇编语言的保留字,。汇编语言的保留字为硬指令助记符、伪指令助记符、操作符、运算符、寄存器名和预定义符号等组成。,由于汇编程序不区别字母大小写(,大小写不敏感,),所以标识符,ABC、abc、Abc,是相同的。这一点和,C,语言不同。,常量、变量和标识符,汇编语言的数据可简单地分为,常量和变量,。常量可作为指令语句的立即数或伪指令的参数,,变量主要作为内存操作数,。,名字和标号(标识符),具有,逻辑地址和类型属性,,主要用做地址操作数,也可以作为,立即数,和,存储器操作数,的名称。,常量是没有任何属性的纯数值,。在汇编期间,它的二进制值已能完全确定,且在程序运行中,它也不会发生变化。它可以有如下几种表达形式:,(2)字符串,字符串常量是由单引号和双引号括起来的单个字符或多个字符,其数值是每个字符的,ASCII,码值。例如:,d=64h,AB=4142h,Hello,Assembly!,等。,(3)符号常量,符号常量用标识符表达一个数值。常量若用有意义的符号名来表示,可以提高源程序的可读性。,MASM,提供等价机制,用来为常量定义符号名。,(4)数值表达式,数值表达式是指由操作符(,Operator),连接而构成、具有固定数值(能被计算并产生固定数值)的表达式。汇编程序在汇编过程中计算数值表达式,最终得到一个确定的数值,所以也是常量。由于数值表达式是在汇编阶段计算,所以组成数值表达式的各部分必须在汇编时就能确定。,常 量,变量实质上就是内存数据,,这些数据在程序运行期间可以修改。为了便于对变量的访问,它常常以变量名的形式出现在程序中,也可将变量名当作是内存单元的符号地址。变量需事先定义才能使用。,名字和标号,是汇编语言语句(指令或伪指令语句)的第一部分,是由用户命名的标识符。名字存在于一条伪指令语句中,标号存在于一条指令语句中,后面跟:。名字可以是符号常量名、段名、变量名、过程名、宏名、结构名、记录名等,由不同的伪指令决定。,名字和标号一经使用便具有两个属性(符号常量名除外),:,(1),地址属性,-名字和标号对应确定的内存单元的逻辑地址,包括段地址和偏移地址;,(2),类型属性,-可以是下列类型:,1、符号定义伪指令,符号定义伪指令有“等价,EQU”,和“等号=”伪指令。它们的格式为:,符号名,EQU,表达式,符号名,=,表达式,其中,表达式可以是一个常数,一个可以求出常数值的数值表达式或一个寄存器名、一个指令助记符等。,例如:,CN EQU 100,CN1 EQU CN+100,C EQU CX,M EQU MOV,B EQU ES:BX+20,注意:,A、,由,EQU,定义的符号在整个程序中不能被再次定义。但“=”允许重复定义,“=”后的表达式只能是数值表达式。,B、EQU,和“=”定义的符号不占用内存单元。,C、,用符号定义伪指令可以增强程序的可读性,并且便于程序的修改。,2、数据定义伪指令,数据定义(,Define),伪指令可以,为数据分配存储单元,、,为该存储单元赋予一个变量名及初值。,数据定义伪指令格式,:,变量名,DB/DW/DD/DQ/DT,初值表达式1,初值表达式2,;注释,其中,,DQ、DT,伪指令可用于浮点数。中的内容为可选项,各初值表达式可以是整数、字符、字符串、数值表达式、?、使用重复操作符,DUP,来定义的数值。“,?,”表示初值不确定,即未赋初值。,变量,具有逻辑地址。在程序代码中,通过对变量名的直接引用,指向定义的第一个数据,通过变量名加减,位移量,存取(访问)以第一个数据为基地址的前后数据。,例 变量名的定义和应用。,;数据段,BVAR1,DB,100,01100100B,144Q,64H,D,-156,;,字节变量:不同进制表达同一数值,内存中有连续的6个64,H。,;,注意:,-156是容易让人糊涂的表达,,尽量避免。,;注意:若用,BCD,码表示十进制数,十进制数的每一位是用二进制码代替的。,MININT=5;,符号常量不占内存,BVAR2,DB,-1,MININT,MININT+5,;,内存中的数据依次为,FFH,5,0AH,DB,?,2 DUP(20H),;,预留一个字节空间,重复定义两个内容为20,H,的字节空间,WVAR1,DW,2010H,4*4;,字变量:2010,H、0010H,占4个字节,WVAR2,DW,?;,没有初值的字变量,DVAR,DD,12347777H,87651111H,?,;,两个双字数据,预留一个双字空间,ABCDBA,B,C,?,MAXINTEQU0AH;,符号常量:,MAXINT=10,STRINGDB ABCDEFGHIJ;,定义字符串,CRLFSDB13,10,$;,字符:回车、换行、$=24,H,ARRAYDW MAXINT DUP(0);10,个初值为0的字变量,ARRAY1 DB 2 DUP(2,3,2 DUP(4),;8,个字节的内容依次为02 03 04 04 02 03 04 04,H,STR1DB ABCDEF,;,内存单元的内容依次为41,H,42H,43H,44H,45H,46H,STR2 DWAB,CD,EF,;,内存单元的内容依次为42,H,41H,44H,43H,46H,45H,STR3DD AB,CD,;,内存单元的内容依次为42,H,41H,00H,00H,44H,43H,00H,00H,MOVDL,BVAR1;DL,100,DECBVAR2+1;BVAR2,位移量为1的数据减1,,MININT,仍为5,MOVABC3,DL;,字符串成为,ABCD,MOVAX,WORD PTR DVAR0;AX,7777H,MOVDX,WORD PTR DVAR2;DX,1234H,;,取双字到,DX:AX,ADDAX,WORD PTR DVAR4,ADCDX,WORD PTR DVAR6,;,加双字到,DX:AX,MOVWORD PTR DVAR8,AX,MOVWORD PTR DVAR10,DX,;,保存双字到,DV
展开阅读全文