微机原理第四章_第1页
微机原理第四章_第2页
微机原理第四章_第3页
微机原理第四章_第4页
微机原理第四章_第5页
已阅读5页,还剩150页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第3章章 汇编语言程序设计汇编语言程序设计 3.1概述一、机器语言、汇编语言和高级语言 1、 机器语言 计算机中指令代码以计算机中指令代码以二进制编码二进制编码表示,这种代码表示,这种代码 机器可以识别与执行,把这种机器代码称为机器语言。机器可以识别与执行,把这种机器代码称为机器语言。 用机器语言编写的程序称为机器语言程序(或目的用机器语言编写的程序称为机器语言程序(或目的程序)。程序)。 例如例如 下面的机器代码就是下面的机器代码就是8086cpu8086cpu的三条机器指的三条机器指令令 b8hb8h,00h00h,30h30h 4eh 4eh,d8hd8h b9h b9h,14h14h

2、,00h00h 用机器语言书写的程序人们不易看懂,也不易记忆。用机器语言书写的程序人们不易看懂,也不易记忆。看起来非常的乏味。但是计算机却非常熟悉它。看起来非常的乏味。但是计算机却非常熟悉它。 2、汇编语言、汇编语言 用用助记符助记符代替操作码,用代替操作码,用符号和数字符号和数字代替地址码代替地址码(或操作数),这种语言称为汇编语言。(或操作数),这种语言称为汇编语言。 用汇编语言编写的程序称为汇编语言源程序。必用汇编语言编写的程序称为汇编语言源程序。必须经过翻译,转换成机器语言,计算机才能执行。须经过翻译,转换成机器语言,计算机才能执行。 汇编语言人们容易记忆,也容易看懂。汇编语言人们容易

3、记忆,也容易看懂。例如例如 用用8086cpu的汇编语言可以把上述的机器指令代的汇编语言可以把上述的机器指令代码写成码写成 mov ax,3000h mov ds,ax mov cx,0014h 3、高级语言高级语言 不依赖具体的机器,面向对象的计算机语言称为高级不依赖具体的机器,面向对象的计算机语言称为高级语言。如语言。如 basic, c, vb, vc等等 高级语言易记忆,易懂、便于学习与掌握高级语言易记忆,易懂、便于学习与掌握 汇编语言与高级语言的比较汇编语言与高级语言的比较 汇编语言汇编语言 高级语言高级语言 执行速度快,占内存小,执行速度快,占内存小, 执行速度慢,占内存大,执行速

4、度慢,占内存大, 实施控制方便,通用性差实施控制方便,通用性差 通用性好,可移植性强通用性好,可移植性强 程序设计效率低,程序设计效率低,依赖机器依赖机器 程序设计效率高,程序设计效率高,不依赖机器不依赖机器 与硬件打交道方便与硬件打交道方便。 与硬件打交道不方便与硬件打交道不方便。二、汇编程序二、汇编程序 1、汇编程序是用来将汇编语言程、汇编程序是用来将汇编语言程序翻译成机器代码的系统(工具)程序翻译成机器代码的系统(工具)程序。序。汇编语言源程序汇编语言源程序汇编语言汇编语言目标程序文件目标程序文件源程序列表源程序列表.asm.obj.lst翻译翻译2、在、在dos环境下建立和运行汇编语言

5、程序的过程环境下建立和运行汇编语言程序的过程汇编语言程序的执行过程:汇编语言程序的执行过程:编辑程序编辑程序. asm 文件文件汇编程序汇编程序. obj 文件文件连接程序连接程序. exe 文件文件edit 等等masmlink3、汇编程序的种类、汇编程序的种类 1.自汇编程序和交叉汇编程序自汇编程序和交叉汇编程序 2.基本汇编、小汇编和宏汇编基本汇编、小汇编和宏汇编 3.一次扫描和两次扫描的汇编一次扫描和两次扫描的汇编4、8086/8088宏汇编程序宏汇编程序masm.exe 宏汇编程序宏汇编程序masm.exe 5.00以及对应的连接程序以及对应的连接程序link.exe三、调试与运行三

6、、调试与运行1、源文件编辑、源文件编辑 任何文本编辑器均可用于编辑汇编语言的源程序。例任何文本编辑器均可用于编辑汇编语言的源程序。例如如dos下的下的edit,turbo c集成环境的编辑器,集成环境的编辑器,windows下的记事本、写字板等。下的记事本、写字板等。 汇编语言源程序以汇编语言源程序以ascii码形式存放于内存中,扩展码形式存放于内存中,扩展名应为名应为 .asm,给源文件命名后可存盘,源程序用大写、,给源文件命名后可存盘,源程序用大写、小写皆可。小写皆可。2、源文件汇编、源文件汇编 用用microsoft 的宏汇编程序(的宏汇编程序(masm)任何)任何版本汇编皆可。汇编有下

7、列几种方式版本汇编皆可。汇编有下列几种方式 方式方式1: 在命令提示符下,键入在命令提示符下,键入 masm 屏幕上会出现如下提示,按照提示键入文件名屏幕上会出现如下提示,按照提示键入文件名回车即可回车即可 。 source filename .asm: xxx object filename xxx.obj: source listing nul.lst:xxx crose-reference nul.crf:xxx + bytes symbol space free 0 warnimg errors 0 severs errors 说明:汇编后生成说明:汇编后生成3个文件,即:目标文件个文

8、件,即:目标文件(.obj),列表文件(),列表文件(.lst),交叉引用文件),交叉引用文件(.crf)。同时告诉程序员汇编有无错误(警告错误)。同时告诉程序员汇编有无错误(警告错误和严重错误)。无错,汇编通过;有错,则修改源程和严重错误)。无错,汇编通过;有错,则修改源程序的错误后,再次汇编。序的错误后,再次汇编。 方式方式2 在命令行提示符下键入文件名与逗号和分号在命令行提示符下键入文件名与逗号和分号 c:masmmasm abc ; (生成(生成.obj文件,不产生文件,不产生.lst和和.crf) c:masmmasm abc,; (生成三个文件,名称为(生成三个文件,名称为abc)

9、 .obj文件中的地址操作数是可浮动的相对地址。文件中的地址操作数是可浮动的相对地址。 .lst文件把源程序与机器代码(目的程序)都列表,可打印,文件把源程序与机器代码(目的程序)都列表,可打印,显示。显示。 .crf是用来对符号进行前后对照的文件,可了解源程序中符是用来对符号进行前后对照的文件,可了解源程序中符号(或变量)定义或引用情况。号(或变量)定义或引用情况。3、连接、连接 在命令提示符下,键入在命令提示符下,键入link ,或在或在windows下用鼠标直下用鼠标直接点击接点击link,即可连接。,即可连接。 连接时屏幕显示如下:连接时屏幕显示如下: object modules .

10、obj:abc run file abc.exe: list file nul.map:abc libraries .lib: (注:注:masm中没有库文件,可直接中没有库文件,可直接键入回车)键入回车) link: warnimg l4201: no stack segment (其中,(其中,l4201表示连接程序错误信息代码,表示连接程序错误信息代码,4表示警告错误,表示警告错误,201为错误号。源程序中没有堆栈段不影响连接。)为错误号。源程序中没有堆栈段不影响连接。) link生成两个文件:生成两个文件:.exe 为可执行文件。为可执行文件。 .map为内存分配为内存分配图文件,提供

11、了文件中的内存地址分配的一些信息。图文件,提供了文件中的内存地址分配的一些信息。4、调试与运行、调试与运行 用用debug与与codeview软件都可进行目软件都可进行目的代码级程序的调试,对的代码级程序的调试,对.exe文件可直接文件可直接调入调入debug中跟踪调试。中跟踪调试。 有错误需对源程序中的语句进行修改,汇有错误需对源程序中的语句进行修改,汇编中只能发现语法和符号等错误,不能发现编中只能发现语法和符号等错误,不能发现编程中的逻辑错误。编程中的逻辑错误。 codeview窗口调试工具,使用时请参看窗口调试工具,使用时请参看有关资料。有关资料。3.2汇编语言源程序的格式3.2.1分段

12、结构汇编语言程序的结构汇编语言程序的结构 汇编语言程序也是分段编写的,每段最长汇编语言程序也是分段编写的,每段最长64k。 8088汇编语言的源程序是由多个段组成的,汇编语言的源程序是由多个段组成的, 一个可执行的汇一个可执行的汇编程序一般编程序一般至少有一至少有一个代码段,其中包含可执行的语句。个代码段,其中包含可执行的语句。例:一个简单的汇编程序例:一个简单的汇编程序05a2001085array1array2dscsmy_data segment (数据段数据段) again: mov al,siarray1 db 05,a2h,00,10h,85h inc si n equ 5 cmp

13、 al, 50array2 db n dup(?) jbe next my_data ends mov di, almy_code segment (代码段)(代码段) inc di assume cs:my_code next: dec cx assume ds:my_data jnz againbegin: mov ax, my_data mov ah,4ch mov ds, ax int 21h lea si, array1 my_code ends lea di, array2 end begin mov cx, n3.2.2 汇编语言语句的类型和组成汇编语言语句的类型和组成指令语句:

14、指令语句:以以8086/8088指令为基本部分,必要时加上标号指令为基本部分,必要时加上标号 及注释构成。每一条语句产生相对应的目标代码及注释构成。每一条语句产生相对应的目标代码。不产生目标代码。不产生目标代码。1. 指令语句及其格式指令语句及其格式 指令语句即第二章介绍的指令语句即第二章介绍的8086cpu的指令,每一条指的指令,每一条指令即可构成一指令语句。每一指令都有对应的机器代令即可构成一指令语句。每一指令都有对应的机器代码。码。 指令语句格式指令语句格式 标号:标号: 助记符助记符 操作数,操作数, ;注释注释 格式共有四部分:其中标号,操作数,注释可以是格式共有四部分:其中标号,操

15、作数,注释可以是任选项;助记符是必选项,该项在一条语句中不可省任选项;助记符是必选项,该项在一条语句中不可省略。略。 标号后面一定要跟一个冒号;注释前一定加一分号。标号后面一定要跟一个冒号;注释前一定加一分号。2、伪指令语句及其格式、伪指令语句及其格式 伪指令语句不是真正的指令语句,它不产生机器代码,伪指令语句不是真正的指令语句,它不产生机器代码,它是汇编程序要求的,用来指示汇编程序做何种操作,它是汇编程序要求的,用来指示汇编程序做何种操作,定义定义代码段、数据段代码段、数据段在何处,是否产生列表等。在何处,是否产生列表等。 伪指令语句格式伪指令语句格式 名字名字 定义符定义符 参数,参数,参

16、数,参数 ;注释注释 格式共有四部分:其中名字,参数,注释可以是任格式共有四部分:其中名字,参数,注释可以是任选项;定义符是必选项,该项在一条伪指令语句中不选项;定义符是必选项,该项在一条伪指令语句中不可省略。对于有些语句,名字也是必需的。可省略。对于有些语句,名字也是必需的。 名字后面不要跟冒号:注释前一定加一分号;各个名字后面不要跟冒号:注释前一定加一分号;各个参数之间用,分开。参数之间用,分开。 3. 宏指令语句及其格式宏指令语句及其格式 宏指令语句:宏指令语句: 为了书写方便,把一个重复出现的汇编为了书写方便,把一个重复出现的汇编语句序列用一条指令代替,这种重新定义语句序列用一条指令代

17、替,这种重新定义的指令就称为的指令就称为宏指令宏指令。 这种由宏指令组成的语句称为宏指令这种由宏指令组成的语句称为宏指令语句。语句。 宏指令必须先定义,才能被使用,这宏指令必须先定义,才能被使用,这称为宏定义;在汇编时,又要把宏指令语称为宏定义;在汇编时,又要把宏指令语句进行宏展开,生成对应的机器代码。句进行宏展开,生成对应的机器代码。 宏指令语句格式将在后面应用中介绍。宏指令语句格式将在后面应用中介绍。3.2.3名字(名字(标识符)标识符)汇编语言语句的四个域,一个语句行的基本格式为:汇编语言语句的四个域,一个语句行的基本格式为: 标识符标识符 操作符操作符 操作数操作数1 ,操作数,操作数

18、2 ;注释注释 标识符可由数字、字母和下划线等一串字符构成,用于一段标识符可由数字、字母和下划线等一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以程序、一组(或一个)数据或一个段的开头。使用时要注意以下下3点:点: 不能以数字开头,数字可用在非开头的其它位置;不能以数字开头,数字可用在非开头的其它位置; 其最大长度为其最大长度为31个字符。个字符。 指令语句中的名字(标号)后跟冒号,而伪指令和宏指令的指令语句中的名字(标号)后跟冒号,而伪指令和宏指令的名字之后不跟冒号。名字之后不跟冒号。 一般说来,名字项可以是标号或变量。一般说来,名字项可以是标号或变量。它们都用来

19、表示本语句的符号地址,它是可它们都用来表示本语句的符号地址,它是可有可无的,只有当需要用符号地址来访问该有可无的,只有当需要用符号地址来访问该语句时它才需要出现。语句时它才需要出现。 标号:标号在代码段中定义,后面跟冒标号:标号在代码段中定义,后面跟冒号:,它也可以用号:,它也可以用labellabel或或equequ伪操作来定义。伪操作来定义。 此外它还可以作为过程名定义,这将在此外它还可以作为过程名定义,这将在以后的章节中加以说明。标号经常在转移指以后的章节中加以说明。标号经常在转移指令或令或callcall指令的操作数字段出现,用以表示指令的操作数字段出现,用以表示转向地址。转向地址。

20、标号有三种属性:段、偏移及类型。标号有三种属性:段、偏移及类型。 标号实际上是用符号表示的地址(其指令语句的标号实际上是用符号表示的地址(其指令语句的符号地址)。符号地址)。 段属性段属性定义标号的段起始地址,此值必须在一个定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在段寄存器中,而标号的段则总是在cscs寄存器中。寄存器中。 偏移属性偏移属性:标号的偏移地址是:标号的偏移地址是1616位无符号数,它位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。代表从段起始地址到定义标号的位置之间的字节数。 类型属性:类型属性:用来指出该标号是在本段内引用还是用来指出该标号是

21、在本段内引用还是在其它段中引用的。如在段内引用的,则称为在其它段中引用的。如在段内引用的,则称为near,指针长度为指针长度为2字节;如在段外引用,则称为字节;如在段外引用,则称为far,指针,指针长度为长度为4字节。字节。 变量:变量:是存放在某些存储单元中的操作数,是存放在某些存储单元中的操作数,变量在变量在除代码段以外的其他段中定义,后面不跟冒号。它也除代码段以外的其他段中定义,后面不跟冒号。它也可以用可以用lable或或equ伪操作来定义。变量经常在操作伪操作来定义。变量经常在操作数字段出现。数字段出现。 所有的变量都有一个固定的所有的变量都有一个固定的地址地址(用变量名代(用变量名代

22、表),它由段和偏移地址组成;同时还有一个表),它由段和偏移地址组成;同时还有一个类型类型,变量的类型属性定义该变量所保留的字节数。如变量的类型属性定义该变量所保留的字节数。如bytebyte(1 1个字节长)、个字节长)、wordword(2 2个字节长)、个字节长)、dworddword(4 4个字个字节长)、节长)、dqdq(8 8个字节长)、个字节长)、dtdt(1010个字节长),这一个字节长),这一点在数据定义伪操作中说明。点在数据定义伪操作中说明。 在程序中同样的标号或变量的定义只允在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。许出现一次,否则汇编程序会指示

23、出错。 在程序中,变量可以使用数据定义伪指令在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。进行初始化,见伪指令一节中的数据定义部分。3.2.4操作符操作符 可以是指令、伪指令或宏指令的助记符。可以是指令、伪指令或宏指令的助记符。1、 常数常数可以是二进制、十进制、八进制或十六进制数,也可以是字符串。可以是二进制、十进制、八进制或十六进制数,也可以是字符串。 例如例如 10100101b ;二进常数;二进常数 256d 或或256 ;十进常数;十进常数 356q 或或356q ;八进常数;八进常数 2afh ;十六进常数;十六进常数 0abcdh ;十六进常数,但

24、十六进常数的第一个字符必须是数字。;十六进常数,但十六进常数的第一个字符必须是数字。 abcd ;字符串常数,汇编后对应为相应的;字符串常数,汇编后对应为相应的ascii码:码:41h44h 1234 ; 数字字符串常数,字符串需用单引号数字字符串常数,字符串需用单引号,汇编后为,汇编后为31h34h2、 8086/8088的寄存器是程序中最常出现的符号,的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如它可分为字节寄存器和字寄存器,如ax为字寄存为字寄存器,而器,而al则为字节寄存器。只有则为字节寄存器。只有ax、bx、cx、dx可分为字和字节寄存器。可分为字和字节寄存器。 标

25、号实际上是用符号表示的地址(其指令语标号实际上是用符号表示的地址(其指令语句的符号地址),因此它也是由段、偏移地址和句的符号地址),因此它也是由段、偏移地址和类型组成,其类型类型组成,其类型分为分为段内(段内(near)和段间)和段间(far)两种两种。 实际上是代码段中某一指令的地址,同样具有三个属实际上是代码段中某一指令的地址,同样具有三个属性:性:段地址,偏移量与类型段地址,偏移量与类型。 类型有:类型有:far与与near far (可在段间或段内引用)(可在段间或段内引用) near(可在段内引用)(可在段内引用) 注意:常量、变量的名字以及标号不能用宏汇编中的保注意:常量、变量的名

26、字以及标号不能用宏汇编中的保留字,留字, 即:(指令助记符,即:(指令助记符,cpu的寄存器名,伪指令的符号等)的寄存器名,伪指令的符号等) 例如:例如: aaa: mov ax, data ;错误,错误,aaa不能做标号不能做标号 daa db ? , ? ; 错误,错误,daa不能做变量名不能做变量名通过通过 seg 标号标号 offset 标号标号可以分别得到可以分别得到标号的段地址标号的段地址和和偏移地址偏移地址。 如果是如果是near类型,在程序执行时,只取标类型,在程序执行时,只取标号的偏移地址,例如在过程调用(号的偏移地址,例如在过程调用(call)时,)时,只取只取ip,而对于

27、,而对于far类型,则要取段地址和偏类型,则要取段地址和偏移地址,在移地址,在call时要取时要取ip和和cs。 变量是存放在某些存储单元中的操作数,使用有变量是存放在某些存储单元中的操作数,使用有一定意义的符号来代表这些单元。一定意义的符号来代表这些单元。 所有的变量都有一个固定的所有的变量都有一个固定的地址地址(用变量名代(用变量名代表),它由段和偏移地址组成;同时还有一个表),它由段和偏移地址组成;同时还有一个类型类型,它可以是它可以是字节(字节(byte)、字()、字(word)或双字)或双字(dword)。)。 在程序中,变量可以使用数据定义伪指令进行初在程序中,变量可以使用数据定义

28、伪指令进行初始化,见伪指令一节中的数据定义部分。始化,见伪指令一节中的数据定义部分。5、表达式、表达式 表达式是常数、寄存器、标号、变量与一些表达式是常数、寄存器、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或优先规则对表达式进行计算后可得到一个数值或一个地址。为了能了解表达式的组成,我们先介一个地址。为了能了解表达式的组成,我们先介绍一些常用的绍一些常用的符。符。 运算符包括算术、逻辑、关系、分析、综合运算符包括算

29、术、逻辑、关系、分析、综合五类运算符。见下表五类运算符。见下表表表 8086汇编语言中的运算符汇编语言中的运算符算术运算符算术运算符 逻辑运算符逻辑运算符 关系运算符关系运算符 分析运算符分析运算符 综合运算符综合运算符+(加法)(加法) and(与)(与) eq(相等)(相等) seg(求段基址)(求段基址) ptr-(减法)(减法) or(或)(或) ne(不相等)(不相等)offset 段属性前缀段属性前缀*(乘法)(乘法) xor(异或)(异或) lt(小于)(小于) type this/(除法)(除法) not(非)(非) gt(大于)(大于) shortmod(求余)(求余) le

30、 size highshl(左移)(左移) ge length lowshr(右移)(右移)(1)、算术运算符)、算术运算符 有有7 种:种:+,-,*, /, mod, shl,shr。 分别为:加,减,乘,除,模,左移,右移。分别为:加,减,乘,除,模,左移,右移。 说明:说明: 除法返回的是商,而模返回的是余数除法返回的是商,而模返回的是余数。 例如:例如: pi equ 3456/1000 ; pi=3 pir equ 3456 mod 1000 ; pir=456 shl,shr是移位运算,一般在建立屏蔽字时使用。是移位运算,一般在建立屏蔽字时使用。 例如:例如:msk equ 00

31、11 0100b msk1 equ msk shl 2 ;低位补;低位补2个个 0,msk1=1101 0000bmsk2 equ msk shr 2 ;高位补;高位补2个个 0,msk2=0000 1101b(2)、逻辑运算符)、逻辑运算符 有有4 种:种:and,or,xor,not 逻辑运算符和逻辑运算指令的区别:逻辑运算符和逻辑运算指令的区别: 逻辑运算符在汇编时完成逻辑运算,逻辑运算指令逻辑运算符在汇编时完成逻辑运算,逻辑运算指令在执行该指令时完成逻辑运算。在执行该指令时完成逻辑运算。 例如例如 msk equ 0011 0101b mov al, 4eh and al, msk a

32、nd 0fh 汇编时计算出汇编时计算出 msk and 0fh=05, 执行第三条指令时执行第三条指令时al=04h。例:逻辑运算符运用。例:逻辑运算符运用。 mov ax,0f00fh amd 253bh ; ax=200bh mov ac,0f00fh or 253bh ;ax=f53fh mov ac,0f00fh xor 253bh ;ax=d534h例例 in alin al,valval out val and ofeh out val and ofeh,alal 其中其中val为端口号,为端口号,out指令中的表达式说明指令中的表达式说明当当val为偶数时,输出端口号与输入端口号

33、相同,而为偶数时,输出端口号与输入端口号相同,而当当val为奇数时,则输出端口号比输入端口号小为奇数时,则输出端口号比输入端口号小1。 (3)关系运算符关系运算符 包括包括 相等相等 :eq 大于:大于:gt 不等:不等:ne 小于或等于:小于或等于:le 小于:小于:lt 大于或等于:大于或等于:ge 关系运算结果只有两个关系运算结果只有两个真、假。真、假。 如果关系是真,则结果为如果关系是真,则结果为 0ffh(0ffffh);); 如果关系是假,则结果为如果关系是假,则结果为0。例如例如: mov bx, data1 lt 0010h mov bx, 0ffffh mov bx, dat

34、a1 lt 0010h mov bx, 0 当当 data1 0010h 时时 例例mov bx,(val lt 5)and 20)ormov bx,(val lt 5)and 20)or(val ge 5val ge 5)and 30and 30)则当则当valval 5 5时,汇编结果应该是:时,汇编结果应该是: mov bxmov bx,2020否则,汇编结果应该是:否则,汇编结果应该是: mov bx,30 (4)分析运算符)分析运算符 分析运算在汇编语言程序设计中分析运算在汇编语言程序设计中很重要。很重要。 存储器地址操作数(变量和标号)具有段、偏移量及类型存储器地址操作数(变量和标

35、号)具有段、偏移量及类型三种属性,分析运算符用来分离出一个存储器地址操作数的这三种属性,分析运算符用来分离出一个存储器地址操作数的这三种属性,并用数值的方法表达出来。三种属性,并用数值的方法表达出来。它包括:它包括: 取存储单元偏移取存储单元偏移:offset 取存储单元段:取存储单元段: seg 取类型:取类型:type 取字节数取字节数: size 按类型取长度:按类型取长度:length求存储器地址操作求存储器地址操作数的三个属性数的三个属性求变量的字节求变量的字节数和长度数和长度seg与offset分析符 分别返回一个变量或标号的段地址和偏移量地址 offset 格式为:格式为:off

36、set variableoffset variable或或labellabel 汇编程序将回送变量或标号的偏移地址值。汇编程序将回送变量或标号的偏移地址值。 例例 mov bxmov bx,offset oper_oneoffset oper_one 则汇编程序将则汇编程序将oper_oneoper_one的偏移地址作为立即数回的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入送给指令,而在执行时则将该偏移地址装入bxbx寄存器寄存器中。所以这条指令与指令中。所以这条指令与指令 lea bxlea bx,oper_oneoper_one是等价的。是等价的。segseg 格式为格式为:

37、seg variableseg variable或或labellabel 汇编程序将回送变量或标号的段地址值。汇编程序将回送变量或标号的段地址值。例例 如果如果data_segdata_seg是从存储器的是从存储器的05000h05000h地址开始地址开始的一个数据段的段名,的一个数据段的段名,oper1oper1是该段中的一个变是该段中的一个变量名,则量名,则 mov bxmov bx,seg oper1seg oper1 将把将把0500h作为立即数插入指令。实际上由作为立即数插入指令。实际上由于段地址是由连接程序分配的,所以该立即数是于段地址是由连接程序分配的,所以该立即数是连接时插入的

38、。执行期间则使连接时插入的。执行期间则使bx寄存器的内容寄存器的内容成为成为0500h。 type分析符分析符 返回变量和标号的类型。返回变量和标号的类型。对于变量:对于变量: 类型为字节、字、双字变量分别返回类型为字节、字、双字变量分别返回1,2,4。对于标号:对于标号: 类型为类型为near的标号返回的标号返回-1(0ffffh), 类型为类型为far标号返回标号返回-2(0fffeh)。 例例 array dw 1array dw 1,2 2,3 3则对于指令则对于指令 add siadd si,type arraytype array 汇编程序将其形成为:汇编程序将其形成为: add

39、si,2 表表 存储器操作数的类型值存储器操作数的类型值 存储器操作数存储器操作数 类型值类型值 字节数据(字节数据(db定义)定义) 1 字型数据(字型数据(dw定义)定义) 2 双字数据(双字数据(dd定义)定义) 4 near指令单元指令单元 -1 far 指令单元指令单元 -2 lengthlength 格式为:格式为:length variablelength variable 对于变量中使用对于变量中使用dupdup的情况,汇编程序将的情况,汇编程序将回送分配给该变量的单元数。而对于其他未用回送分配给该变量的单元数。而对于其他未用dupdup说明的情况则回送说明的情况则回送1 1。

40、 例例 fees dw 100 dupfees dw 100 dup(0 0) 对于指令对于指令mov cxmov cx,length feeslength fees 汇编程序将使其形成为:汇编程序将使其形成为: mov cx,100 例例 array dw 1array dw 1,2 2,3 3对于指令对于指令 mov cxmov cx,length arraylength array 汇编程序将使其形成为:汇编程序将使其形成为: mov cx,1 例例 table db table db abcdabcd对于指令对于指令mov cxmov cx,length tablelength tab

41、le汇编程序将使其形成为:汇编程序将使其形成为: mov cx,l sizesize 格式为:格式为:size variablesize variable 汇编程序应回送分配给该变量的字节数。但是,汇编程序应回送分配给该变量的字节数。但是,此值是此值是lengthlength值和值和typetype值的乘积。值的乘积。所以:所以: fees dw 100 dupfees dw 100 dup(0 0) mov cxmov cx,size feessize fees将形成为将形成为 mov cxmov cx,200200对于:对于: array dw 1,2,3 mov cx mov cx,si

42、ze arraysize array将形成为将形成为 mov cxmov cx,2 2 而而table db abcd mov cx mov cx,size tablesize table将形成为将形成为mov cxmov cx,1 1。length 和和 size 分析符分析符 对于对于dup定义的变量:定义的变量: length 返回的是分配给该变量的元素的个数;返回的是分配给该变量的元素的个数; size 返回的是分配给该变量的元素的字节数。返回的是分配给该变量的元素的字节数。 例如:例如:buf dw 100 dup (?) mov cx, length buf ; cx=100 mo

43、v cx, size buf ; cx=200 (1002) 对于其他变量,则返回对于其他变量,则返回1(length),或返回,或返回(类型)(类型)(size) 例如例如 m1 dw 1, 2, 3 汇编后形成指令:汇编后形成指令: m2 db abcd mov bl, length m1 mov bl, 1 mov al, length m2 mov al, 1 mov cl, size m1 mov cl, 2 mov ch, size m2 mov ch, 1例例1: 设有数据段中使用设有数据段中使用 data1 db 05h,a2h,0,10h,85h则则 mov al, data

44、1 可将可将data1中的数传送到中的数传送到al中,中, (al)=05h mov ax, seg data1可将可将data1的所在段地址传到的所在段地址传到ax中,(中,(ax)=2000h mov ax, offset data1可将可将data1的偏移地址传入的偏移地址传入ax中中, (ax)=1500h 例例2: 设有数据段中使用设有数据段中使用 data2 dw 100 dup (?) 定义了定义了100个字单元,则个字单元,则 mov ax, type data2 ; (ax)=2 mov ax, size data2 ; (ax)=200 mov ax, length dat

45、a2 ; (ax)=10005a2001085dscsdata12000:1500例:分析运算符应用举例例:分析运算符应用举例下面定义的数据段下面定义的数据段data,设段基址从,设段基址从40000h开始。开始。data segment v1 db 2ah,3fhv2 dw 2a3fh,3040hv3 dd 12345678h,12abcdefhv4 dw 20 dup(1)data endsmov ax,seg v1; ax=4000hmov bx,seg v2; bx=4000hmov cx,seg v3; cx=4000hmov ax,offset v1 ;ax=0mov bx,off

46、set v2 ;bx=2mov cx,offset v3 ;cx=62a3f3f2a403078563412efcdab1201000100010040000hv1v2v3v440个个字字节节mov ax,type v1;ax=1 mov bx,type v2;bx=2mov cx,type v3;cx=4mov ax,length v4;ax=20mov bx,size v4;bx=40而:而:mov ah,length v1;ah=1mov al,size v1;al=1mov bh,length v2;bh=1mov bl,size v2;bl=2mov ch,length v3;ch=

47、1mov cl,size v3;cl=4注:对于形如注:对于形如v1、v2、v3格式定义的变量,运算符格式定义的变量,运算符length和和size只只对对db、dw和和 dq定义的多项逗号分开的数据项的第一项有效。定义的多项逗号分开的数据项的第一项有效。注意! 上述表达式中运算符的求值的操作不是在程序执行的时候完成, 而是在对源程序进行汇编(编译)的时候完成. ptr 操作符操作符 ptr 用于改变变量或标号的原有属性,用于改变变量或标号的原有属性,ptr本身并本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,不分配存储单元,仅给已分配的存储单元赋予新的属性,保证运算时操作数类型的匹配

48、。保证运算时操作数类型的匹配。 常与类型常与类型byte、word、near、far连用。连用。 格式:格式:类型类型/距离距离 ptr 变量或标号变量或标号 例例1 n1 db 15h, 36h n2 dw 1122h loop: mov ax, word ptr n1 ; (ax)=3615h mov bl, byte ptr n2 ; (bl)=22h 例例2 mov byte ptr bx,10h ; (bx) 10h mov word ptr bx, 10h ; (bx) 0010h 有时指令要求使用有时指令要求使用ptrptr操作符。例如用操作符。例如用 mov mov bxbx,

49、5 5 指令把立即数存入指令把立即数存入bxbx寄存器内容指定的存寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用还是字节单元,此时必须用ptrptr操作符来说明属操作符来说明属性,应该写明:性,应该写明: mov byte ptrmov byte ptrbxbx,5 5或或 mov word ptrbx,5 则语句则语句 mov al, data2 ;错错而应为:而应为:mov al, byte ptr data2 05a2001085dsdata2例:例:data1 db 05h,a2h,0,10h,85h data

50、2 equ word ptr data1 则则data2和和data1的段基址和偏移的段基址和偏移量均相同,但类型不同,量均相同,但类型不同,data1是是byte型,而型,而data2是是word型。型。data1this 操作符格式为格式为this attributethis attribute或或typetype 它可以象它可以象ptrptr一样建立一个指定类型(一样建立一个指定类型(bytebyte、wordword或或dworddword)的或指定距离()的或指定距离(nearnear或或farfar)的地址操作数。该)的地址操作数。该操作数的段地址和偏移地址与操作数的段地址和偏移地

51、址与下一个下一个存储单元地址相同。存储单元地址相同。 例如:例如:first_type equ this bytefirst_type equ this byte word_table dw 100 dup word_table dw 100 dup(?)(?) 此时此时first_bytefirst_byte的偏移地址值和的偏移地址值和word_tableword_table完全完全相同,但它是字节类型的,而相同,但它是字节类型的,而word_tableword_table则是字类型的。则是字类型的。 又如:又如:start equ this farstart equ this far mo

52、v cx mov cx,100100 这样,这样,mov指令有一个指令有一个far属性的地址属性的地址start,这就允许其他段的这就允许其他段的jmp指令直接跳转到指令直接跳转到star来。来。 this用来建立新的存储器地址操作数,但不分配存储单元。用来建立新的存储器地址操作数,但不分配存储单元。 新的操作数类型在新的操作数类型在this中指定,而其段地址和偏移量就中指定,而其段地址和偏移量就 是汇编时的当前值。是汇编时的当前值。 用用this的变量与下一个变量有相同的段基址和偏移量,但的变量与下一个变量有相同的段基址和偏移量,但两者类型不同。两者类型不同。格式为:格式为: 变量变量/标量

53、标量 equ this 类型类型例如:例如: v11 equ this word v1 db 20h,30h 则:变量则:变量v11与与v1具有相同的段和偏移量,但具有相同的段和偏移量,但v11是是word型型变量,而变量,而v1是是byte型变量。型变量。 例:例: data1 segment wbuffer equ this word buffer db 12h, 34h, 00h, 91h data1 ends code1 segment assume cs: code1, ds: data1 start: mov ax, data1 mov ds, ax mov al, buffer

54、mov bx, wbuffer code1 ends end start12340091dsbufferwbufferal=12hbx=3412h段超越操作符段超越操作符 格式:格式:段前缀:变量或地址表达式段前缀:变量或地址表达式 说明:段寄存器加冒号为段前缀,即说明:段寄存器加冒号为段前缀,即 cs:,ds:,ss:,es: 。该操作符强迫当前指令的操作数寻址不按约定的。该操作符强迫当前指令的操作数寻址不按约定的段进行,而由段超越操作符指定的段寻址。段进行,而由段超越操作符指定的段寻址。 例如:例如:mov ax, es:si ;操作数不按约定的操作数不按约定的ds段,而段,而指定寻址指定

55、寻址es段。段。short操作符操作符 格式:格式:short 标号标号 说明:用来告诉汇编器转移类指令中转向地址的属性。说明:用来告诉汇编器转移类指令中转向地址的属性。转移的范围在转移的范围在-128+127 。highhigh和和 lowlow 称为字节分离操作符,它接收一个数或地址称为字节分离操作符,它接收一个数或地址表达式,表达式,highhigh取其高位字节,取其高位字节,lowlow取其低位字节。取其低位字节。例如:例如: const equ oabcdhconst equ oabcdh则则 mov ahmov ah,high consthigh const将汇编成将汇编成mov

56、ah, 0abh 运算符与操作符的优先级优先级 最高 运算符与操作符优先级 运算符与操作符 1length, size, ( ), , . 8 +, - (双目:加、减) 2 (结构字段名运算符) 9 eq, ne, lt, gt, ge 3 :(段寄存器名) 10 not 4 ptr, offset, seg, type 11 and 5 high, low 12 or, xor 6+, - (单目:表示正、负号)13最低 short 注释是用于使程序易于理解的句子,用注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分来表示某行或某段语句的作用或与其它部分的关系,一般写

57、在某语句的后面或某段的开的关系,一般写在某语句的后面或某段的开始处,注释的前面由始处,注释的前面由“;”前导,表示后面前导,表示后面的内容为注释。如果一行写不下,换行后也的内容为注释。如果一行写不下,换行后也要使用要使用“;”前导。前导。3.3 伪指令及其应用伪指令及其应用 在在8086/8088汇编语言中伪汇编语言中伪指令是用于诸如数据定义、存指令是用于诸如数据定义、存储区分配等功能。所谓伪指令储区分配等功能。所谓伪指令是非机器指令,它是在汇编期是非机器指令,它是在汇编期间进行操作的。间进行操作的。3.3.2数据定义语句数据定义语句 数据定义语句用于为数据分配相应的存储单元。用一个符号数据定

58、义语句用于为数据分配相应的存储单元。用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。名代表一个或一些单元,并可为这个或这些单元提供初始值。定义数据的操作符有定义数据的操作符有: 字节定义字节定义db (每一数据项占一个字节)(每一数据项占一个字节) 字定义字定义dw (每一数据项占二个字节)(每一数据项占二个字节) 双字定义双字定义dd (每一数据项占四个字节)(每一数据项占四个字节) 四字定义四字定义dq (每一数据项占八个字节)(每一数据项占八个字节) 十字节定义十字节定义dt (每一数据项占十个字节)(每一数据项占十个字节) 重复定义重复定义 m dup(n) (重复(重

59、复m次个数据次个数据 n ) 与数据相联系的符号名称为与数据相联系的符号名称为变量变量。 数据定义语句的格式为:数据定义语句的格式为: 其中:数据项表由逗号分隔的表达式组成。其中:数据项表由逗号分隔的表达式组成。例:例:通过下列定义,在存储器中将产生如通过下列定义,在存储器中将产生如图所示的结果,以图所示的结果,以data1到到data5为例为例: data1 db ? ;不置初值,为随;不置初值,为随 机值机值 data2 dw 1000h data3 dd 3000a455h data4 db 10,10h data5 dw 100, 0240h, 0360h ds随机随机001055a4

60、00300a10640040026003data1data2data3data4data5例例 datadatabyte db 10byte db 10,4 4,10h10h bata bataword dw 100word dw 100,100h100h,5 5 data datadw dd 3x20dw dd 3x20, offfdhofffdh汇编程序可以在汇编期间在存储器中存入数据汇编程序可以在汇编期间在存储器中存入数据 例例 操作数也可以是字符串,如:操作数也可以是字符串,如: message db hellomessage db hello则存储器存储情况如图则存储器存储情况如图4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论