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

下载本文档

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

文档简介

1、第四章 汇编语言程序设计微型计算机系统原理及应用微型计算机系统原理及应用Institute of Electrical Engineering第第4章章 汇编语言程序设计汇编语言程序设计 本章介绍以下内容本章介绍以下内容 汇编语言源程序的结构汇编语言源程序的结构 语句行的构成(汇编语言语句格式)语句行的构成(汇编语言语句格式) 指示性语句(伪指令)指示性语句(伪指令) 汇编语言程序设计及举例汇编语言程序设计及举例4.1 汇编语言源程序汇编语言源程序 用指令助记符、符号地址、标号和伪指令等用指令助记符、符号地址、标号和伪指令等符号书写程序的语言称为符号书写程序的语言称为汇编语言汇编语言。用汇编。

2、用汇编语言编写的程序称为语言编写的程序称为汇编语言源程序汇编语言源程序。 把源程序翻译成机器语言程序把源程序翻译成机器语言程序(目标程序目标程序)的的过程叫做过程叫做汇编汇编。 完成汇编任务的程序叫做完成汇编任务的程序叫做汇编程序汇编程序,常用的,常用的有有ASM、MASM等。等。 MASM称为称为宏汇编程序。宏汇编程序。 汇编语言源程序汇编程序用助记符编写用助记符编写汇编程序汇编程序汇编语言汇编语言源程序源程序机器语言机器语言目标程序目标程序源程序的编译程序源程序的编译程序4.1.1 汇编语言源程序的结构 8086汇编语言的源程序是分段的,每汇编语言的源程序是分段的,每一段都有名字,以符号一

3、段都有名字,以符号SEGMENT作作为段开始,以语句为段开始,以语句ENDS作为段的结束。作为段的结束。两者都必须有名字,而且名字必须相两者都必须有名字,而且名字必须相同。同。 由若干段组成一个源程序,整个源程由若干段组成一个源程序,整个源程序以语句序以语句END作为结束。作为结束。 name length_of_stringdata segmentstring db abcduvwxyz,0dh ;0DH为回车(为回车(CR)cr equ 0dhdata endsstack segment para stackstack db 100 dup(?)stack endscode segment

4、 assume cs:code,ds:data, ss:stack,es:datastart proc farbegin: push ds ;DS中包含程序段前缀起始地址中包含程序段前缀起始地址 mov ax, 0 push ax start endp code ends end begin常用的术语常用的术语 汇编语言语句可分为三种基本语句:汇编语言语句可分为三种基本语句:指令语句指令语句、伪指伪指令语句令语句和和宏指令语句宏指令语句。 每一个每一个指令语句指令语句在汇编时产生目标代码,对应着机器在汇编时产生目标代码,对应着机器的一种操作。如:的一种操作。如:MOV BX, 0 与与ADD

5、SI, AX 等,即等,即每一条指令语句对应着机器的一条或几条指令。每一条指令语句对应着机器的一条或几条指令。 伪指令语句伪指令语句没有目标代码与之对应,主要是为汇编程没有目标代码与之对应,主要是为汇编程序服务的。序服务的。 宏指令宏指令主要是为了简化程序的书写而设计的。若在汇主要是为了简化程序的书写而设计的。若在汇编语言源程序中某个程序段要多次使用,为了使在源编语言源程序中某个程序段要多次使用,为了使在源程序中不重复书写这个程序段,可以用一条宏指令来程序中不重复书写这个程序段,可以用一条宏指令来代替。由汇编程序在汇编时产生所需的代码。代替。由汇编程序在汇编时产生所需的代码。1. 汇编语言语句

6、类型汇编语言语句类型指令性语句指示性语句(伪指令)CPU执行的语句,执行的语句,能够生成目标代码能够生成目标代码CPU不执行,而由汇不执行,而由汇编程序执行的语句,编程序执行的语句,不生成目标代码不生成目标代码4.1.24.1.2 汇编语言语句类型及格式指令语句指令语句 格式:格式: 标号标号: : 前缀前缀 指令助记符指令助记符 操作数操作数,操作数操作数 ; ;注释注释 CYCLE: CMP SUM,100 ;SUM单元与单元与100比较比较2 汇编语言语句格式汇编语言语句格式指令的符号地址指令的符号地址标号后要有冒号标号后要有冒号操作码操作码注释前加分号注释前加分号伪指令语句伪指令语句

7、格式:格式:名字名字 伪指令指示符伪指令指示符 操作数操作数,操作数,操作数 ;注释注释THING DB ? ;定义一个字节定义一个字节变量的符号地址变量的符号地址其后不加冒号其后不加冒号指示性语句中至指示性语句中至少有一个操作数少有一个操作数1.1.常常 量量 数字常量 字符串常量 例:A MOV AL,A 例:ABCD汇编时被译成对应的汇编时被译成对应的ASCII码码用单引号引起的字符或字符串用单引号引起的字符或字符串4.1.34.1.3 数据项及表达式不同进制数表示的常量不同进制数表示的常量122. 2. 标号标号 标号后有冒号,在指令性语句前标号后有冒号,在指令性语句前 英文字母、数字

8、及专用字符组成英文字母、数字及专用字符组成, ,最大长度不最大长度不能超过能超过3131个个, ,且不能由数字打头且不能由数字打头, ,不能用保留字不能用保留字( (如寄存器名如寄存器名, ,指令助记符指令助记符, ,伪指令伪指令) )。 3.3.变变 量量 代表内存中的数据区,程序中视为存储器操作数 变量的属性: 变量所在段的段地址 变量单元地址与段首地址之 间的位移量。 字节型、字型和双字型段段 值值偏移量偏移量类类 型型变量和标号变量和标号 变量变量 存储单元中的操作数是变量,值可以改变。在程存储单元中的操作数是变量,值可以改变。在程序中出现的是存储单元地址的符号,即它们的名字序中出现的

9、是存储单元地址的符号,即它们的名字 段属性段属性 段的起始地址的高段的起始地址的高16位,低位,低4位始终为位始终为0 偏移量属性偏移量属性 变量单元与段地址的偏移量变量单元与段地址的偏移量16位位 类型属性类型属性 字节、字、双字字节、字、双字 标号标号 是指令存放单元的符号地址,是转移指令或调用是指令存放单元的符号地址,是转移指令或调用(CALL)指令的目标操作数。)指令的目标操作数。 段属性段属性 偏移量属性偏移量属性 类型(距离)属性类型(距离)属性 NEAR和和FAR 对于汇编程序来说,标号和变量是类似的,都对于汇编程序来说,标号和变量是类似的,都是存储单元的符号地址。只是是存储单元

10、的符号地址。只是标号对应的存储单元标号对应的存储单元中存放的是指令,而变量所对应的存储单元中存放中存放的是指令,而变量所对应的存储单元中存放的是数据。的是数据。【例】ARRAY DW 12H,13H,14HXT DW ?MOV CX, (XT-ARRAY)/2因XT与ARRAY是顺序存放, (XT-ARRAY)/2即为数组字长度数4 4 表达式表达式 汇编语言中使用了运算符有以下几种,即:汇编语言中使用了运算符有以下几种,即: 算术运算符算术运算符 逻辑运算符逻辑运算符 关系运算符关系运算符 取值和属性运算符取值和属性运算符 其它运算符其它运算符 1)算术运算符)算术运算符q共有共有7种算术运

11、算符种算术运算符 +, -, * , /, MOD, SHL, SHRq说明:说明: / (除,只取除法运算结果之商除,只取除法运算结果之商)、MOD(模,只模,只取除法运算结果之余数取除法运算结果之余数)、SHL(左移,左移左移,左移1位相当位相当于乘于乘2)、SHR(右移,右移右移,右移1位相当于除位相当于除2)。 所有的算术运算符均可以对数据进行运算,运算所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。若对地址运算,通常是对象与运算结果都是整数。若对地址运算,通常是在标号上加减某一个数字量,例如在标号上加减某一个数字量,例如SUM+2、CYCLE-3各表示一个存储单元的

12、地址,对地址乘是各表示一个存储单元的地址,对地址乘是没有意义的。没有意义的。例例 源程序指令如下:源程序指令如下: DA EQU 300 MOV AX, DA-80 MOV BX, DA MOD 100 MOV CX, DA/100 MOV DH, 01100100B SHR 1 汇编时,计算表达式形成指令为:汇编时,计算表达式形成指令为:DA EQU 300MOV AX, 220MOV BX, 0MOV CX, 3MOV DH, 32H2)逻辑运算符)逻辑运算符q共有共有4种逻辑运算符种逻辑运算符 AND, OR, NOT, XORq说明:说明: 逻辑运算符与逻辑运算符与8086指令系统中的

13、指令助记符指令系统中的指令助记符AND、OR、NOT、XOR符号完全相同,但符号完全相同,但二者是不会混淆的。作为二者是不会混淆的。作为MASM的运算符是的运算符是在汇编过程中进行计算的,而指令助记符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。在程序执行时进行运算的。例例 源程序指令如下:源程序指令如下: MOV AH, NOT 0FFH MOV BH, 8CH AND 77H MOV AL, 8CH OR 73H MOV BL, 0FFH XOR 44H 汇编时,计算表达式形成指令为:汇编时,计算表达式形成指令为:MOV AH, 00HMOV BH, 04HMOV AL,

14、 0FFHMOV BL, 0BBH 例例 IN AL, PORT ;PORT为输入端口号为输入端口号 AND DX, PORT AND 0FEH OUT DX, AX ;DX为输出端口号为输出端口号 第第2条指令说明:条指令说明: 后一个后一个AND(运算符运算符),汇编时计算表达式,汇编时计算表达式,得到一个端口号,如原输入端口号得到一个端口号,如原输入端口号PORT为为80H,则表达式则表达式PORT AND 0FEH的值为的值为80H,若原输,若原输入端口号入端口号PORT为为81H,则计算表达式值也得到,则计算表达式值也得到80H。前一个。前一个AND(指令助记符指令助记符),在运行程

15、序时,在运行程序时将将DX内容与计算出的表达式值相内容与计算出的表达式值相与与,结果送,结果送到到DX中,中,DX为输出端口号。为输出端口号。3)关系运算符)关系运算符q关系运算符包括关系运算符包括EQ(相等)、(相等)、NE(不等)、(不等)、LT(小于)、(小于)、GT(大于)、(大于)、LE(小于或等(小于或等于)、于)、GE(大于或等于)(大于或等于)6种。种。q关系运算符的两个操作数必须是数据,或是同关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值。若结果为真,的比较操作后,结果是一个

16、数值。若结果为真,输出全是输出全是1,即,即0FFH或或0FFFFH。若结果为假,。若结果为假,输出全是输出全是0。关系运算符一般与逻辑运算符组。关系运算符一般与逻辑运算符组合起来使用。合起来使用。例例:MOV AX, 5 EQ 0101B MOV AX,0FFFFH MOV BX, 10H GT 16 MOV BX, 0000H4)取值运算符和属性运算符)取值运算符和属性运算符 取值运算符取值运算符OFFSET、SEG 它们加在变量或标号前,返回运算对象的它们加在变量或标号前,返回运算对象的某个参数值。例如偏移地址值、段地址值某个参数值。例如偏移地址值、段地址值SEG和和OFFSET SEG

17、返回一个存储单元的段地址。返回一个存储单元的段地址。 OFFSET返回每一个存储单元的段内偏移量。返回每一个存储单元的段内偏移量。例:例:DATA-SEG 是从存储器是从存储器0500H处开始的处开始的一个数据段。一个数据段。OP1是其中一个变量名,偏是其中一个变量名,偏移地址为移地址为1000H。 MOV AX, SEG OP1 MOV BX, OFFSET OP1 则则 (AX)=0500H, (BX)=1000H属性运算符属性运算符 PTR 格式:格式: 类型类型/距离距离 PTR 变量或标号变量或标号 功能:将功能:将PTR左边的类型属性赋给右边左边的类型属性赋给右边的变量或标号。的变

18、量或标号。PTR本身并不分配存储本身并不分配存储单元,仅给已分配的存储单元赋予新的单元,仅给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型属性,这样可以保证运算时操作数类型的匹配,常与类型的匹配,常与类型BYTE、WORD、NEAR、FAR等连用。等连用。 PTR运算符仅对当前指令有效。运算符仅对当前指令有效。 例例: N1 DB 15H, 36H N2 DW 1122H, 3344H LO: MOV AX, WORD PTR N1 ;使使N1类型转换成字与类型转换成字与AX类型匹配类型匹配 MOV BL, BYTE PTR N2 ;使使N2类型转换成字节与类型转换成字节与BL类型

19、匹配类型匹配 方括号方括号 。 指令中用方括号表示存储器操作数,方括号里的内容表示操作数的偏移地址。 段重设运算符段重设运算符“:”。 运算符“:”跟在某个段寄存器名(DS、ES、SS)之后表示段重设。 MOV AX, ES:DI5)其它运算符)其它运算符4.2 指示性(伪指令)语句指示性(伪指令)语句 伪指令语句没有对应的机器代码,并不伪指令语句没有对应的机器代码,并不像指令语句那样由像指令语句那样由CPU来执行,它是由来执行,它是由MASM汇编程序对源程序汇编期间进行汇编程序对源程序汇编期间进行处理的。主要完成变量定义,存储器分处理的。主要完成变量定义,存储器分配,指示程序开始和结束,段定

20、义,段配,指示程序开始和结束,段定义,段分配等。分配等。伪指令的类型伪指令的类型 伪指令语句有如下几种类型:伪指令语句有如下几种类型: 数据定义伪指令数据定义伪指令 DB,DW,DD 符号定义伪指令符号定义伪指令 EQU, 段定义伪指令段定义伪指令 SEGMENTENDS 设定段寄存器伪指令设定段寄存器伪指令 ASSUME 过程定义伪指令过程定义伪指令 PROCENDP 模块定义与连接伪指令模块定义与连接伪指令 END,NAME4.2.1 数据定义伪指令数据定义伪指令 为一个数据项或数据表分配存储单元,用为一个数据项或数据表分配存储单元,用一个符号名与这个或这些存储单元相联系,并为一个符号名与

21、这个或这些存储单元相联系,并为这个数据项提供一个任选的初始值。这个数据项提供一个任选的初始值。 语句格式:语句格式: 变量名变量名 DB/DW/DD/DQ/DT 数据项表数据项表例例如:如: THING DB ? ;定义一个字节;定义一个字节 BIG-THING DW ? ;定义一个字;定义一个字 (两个字节两个字节) BIGGEST-THING DD ? ;定义一个双字;定义一个双字 (四个字节四个字节) BUFFER DB 30 DUP(?) ;定义连续;定义连续30个字节个字节321.1. 数据定义伪指令助记符 DB 定义的变量为字节型定义的变量为字节型 DW 定义的变量为字类型(双字节

22、)定义的变量为字类型(双字节) DD 定义的变量为双字型(定义的变量为双字型(4字节)字节) DQ 定义的变量为定义的变量为4字型(字型(8字节)字节) DT 定义的变量为定义的变量为10字节型字节型33数据定义伪指令例 DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H以上变量在内存以上变量在内存中的存放形式中的存放形式34数据定义伪指令例_变量在内存中的分布变量在内存中的分布DATA111223344DATA2224411000033DATA3220000 2200000000 66554

23、43335数据定义伪指令的几点说明 伪指令的性质决定所定义变量的类型; 定义字符串必须用DB伪指令 例: DATA1 DB ABCD,66HABCD41H42H43H44H66H 数据定义伪指令例: 数据段起始 M1 DW 10H,20H M2 DB 11H,Hello! 数据段结束36M110002000M2656C11486C6F21H0000Hllo!e0004H4.2.2 符号定义伪指令符号定义伪指令 1赋值伪指令赋值伪指令EQU 赋值伪指令是为表达式赋予一个符号名,其后赋值伪指令是为表达式赋予一个符号名,其后指令中凡需要用到该表达式的地方均可以用此指令中凡需要用到该表达式的地方均可以

24、用此名字来代替。编写程序时,通过使用赋值伪指名字来代替。编写程序时,通过使用赋值伪指令可以使汇编语言简明易懂,便于程序的调试令可以使汇编语言简明易懂,便于程序的调试和修改。赋值伪指令的格式如下:和修改。赋值伪指令的格式如下: 符号名符号名 EQU 表达式表达式 必须用必须用PURGE(解除语句)来解除定义的(解除语句)来解除定义的符号符号例:例:BUFFER_SIZE EQU 32 NEW_PORT EQU PORT_VAL+1 PURGE BUFFER_SIZE, NEW_PORT 2等号伪指令等号伪指令 语句格式如下:语句格式如下: 符号名符号名=表达式表达式 可以对符号再定义可以对符号再

25、定义例:例:EMP=6 EMP=7 EMP=EMP+1数据的初始值确定数据的初始值确定 例如例如 THING DB 25 ONE DB 5 DUP (0) ;重复;重复5个个0存入存入ONE起始的存起始的存 储单元储单元 TWO DW 10 DUP (?) ;保留;保留10个字的储存单元空间个字的储存单元空间 THREE DB 4 DUP (1, 2 DUP(20H) ;DUP嵌套嵌套 通常,初始值可用一个表达式来规定,因为表达式通常,初始值可用一个表达式来规定,因为表达式是在汇编时计算的,所以有如下的合法的语句:是在汇编时计算的,所以有如下的合法的语句: PORT_VAL EQU 2 IN-

26、PORT DB PORT_VAL OUT-PORT DB PORT_VAL +1 SEGMENT/ENDS 段定义伪指令的功能就是把源程序划分为逻辑段定义伪指令的功能就是把源程序划分为逻辑段,便于汇编程序在相应段名下生成目标码,段,便于汇编程序在相应段名下生成目标码,同时也便于连接程序组合、定位、生成可执行同时也便于连接程序组合、定位、生成可执行的目标程序。利用段定义伪指令可以定义一个的目标程序。利用段定义伪指令可以定义一个逻辑段的名称和范围,其指令格式如下:逻辑段的名称和范围,其指令格式如下: 段名段名 SEGMENT (本段语句序列本段语句序列) (本段语句序列本段语句序列) 段名段名 E

27、NDS4.2.3 段定义伪指令段定义伪指令 4.2.4 设定段寄存器伪指令设定段寄存器伪指令ASSUME 设定段寄存器伪指令设定段寄存器伪指令ASSUME,一般出现在,一般出现在代码段中,它用来告诉汇编程序由代码段中,它用来告诉汇编程序由 SEGMENTENDS伪指令定义的段和段寄存伪指令定义的段和段寄存器的对应关系,即设定已定义段各自属于哪个器的对应关系,即设定已定义段各自属于哪个段寄存器。其指令格式为:段寄存器。其指令格式为:ASSUME 段寄存器名:段名段寄存器名:段名 , 段寄存器名:段名段寄存器名:段名 段寄存器名是段寄存器名是CS、DS、SS或或ES,段名必须是由,段名必须是由SE

28、GMENTENDS定义过的段名。定义过的段名。 应当注意:使用应当注意:使用ASSUME伪指令,仅仅告诉汇编程伪指令,仅仅告诉汇编程序,关于段寄存器与定义段之应关系。但它并不意序,关于段寄存器与定义段之应关系。但它并不意味着汇编后这些段地址已装入了相应的段寄存器中,味着汇编后这些段地址已装入了相应的段寄存器中,这些段地址的真正装入,仍需要用程序来送入,这些段地址的真正装入,仍需要用程序来送入,且且这这4个段寄存器的装入略有不同个段寄存器的装入略有不同。 设置起始地址伪指令设置起始地址伪指令ORG ORG伪指令用来指出其后的程序段或数据块伪指令用来指出其后的程序段或数据块的起始地址的偏移量。的起

29、始地址的偏移量。 其指令格式为:其指令格式为:ORG 表达式表达式例:例:ORG 0003H 汇编程序把语句中表达式之值作为起始地址,汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的连续存放程序和数据,直到出现一个新的 ORG指令。指令。 若省略若省略ORG,则从本段起始地址开始连续存,则从本段起始地址开始连续存放。放。 汇编汇编程序程序例题例题 段寄段寄存器存器设定设定 在程序设计中,我们把具有一定功能的程在程序设计中,我们把具有一定功能的程序段设计成一个子程序序段设计成一个子程序(过程过程)。 过程定义伪指令格式如下:过程定义伪指令格式如下:过程名过程名 PROC 属性属性 (过程体序列语句过程体序列语句) (过程体序列语句过程体序列语句)过程名过程名 ENDP 过程以过程以PROC伪指令开始,以伪指令开始,以ENDP伪指令结束。伪指令结束。4.2.5 过程定义伪指令过程定义伪指令过程属性过程属性 过程名具有三种属性。(与标号相同)过程名具有三种属性。(与标号相同) 段属性:段属性: 为该过程所在段的段基址。为该过程所在段的段基址。 偏移地址属性:偏移地址属性: 指该过程第一个字节与段首址之间距离字节。指该过程第一个字节与段首址之间距离字节。 距离属性:距离属性: NEAR或或FAR 格式中的属性就指距离属性,定义格式中的属性就

温馨提示

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

评论

0/150

提交评论