第04章80868088汇编语言程序设计1.ppt

上传人:本田雅阁 文档编号:2907656 上传时间:2019-06-04 格式:PPT 页数:53 大小:604.02KB
返回 下载 相关 举报
第04章80868088汇编语言程序设计1.ppt_第1页
第1页 / 共53页
第04章80868088汇编语言程序设计1.ppt_第2页
第2页 / 共53页
第04章80868088汇编语言程序设计1.ppt_第3页
第3页 / 共53页
第04章80868088汇编语言程序设计1.ppt_第4页
第4页 / 共53页
第04章80868088汇编语言程序设计1.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《第04章80868088汇编语言程序设计1.ppt》由会员分享,可在线阅读,更多相关《第04章80868088汇编语言程序设计1.ppt(53页珍藏版)》请在三一文库上搜索。

1、1,4.1 程序设计语言概述,4.2 8086/8088汇编语言的基本语法,4.3 80868088汇编语言程序设计基本方法,第4章 8086/8088汇编语言程序设计,2,4.1 程序设计语言概述,汇编语言程序的上机与处理过程,3,4.2 8086/8088汇编语言的基本语法,引例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,4,5,汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字。 段可以从性质上分为代码段、堆栈段、数据段和附加段4种。,代码段是不可少的,堆栈

2、段、数据段与附加段可根据需要设置。代码段部分开始要设置段寄存器,要加载DS内容。 在上面这个例子中,一共定义了3个段: 1个数据段 1个堆栈段 1个代码段,6,每一行只有一条语句,且不能超过128个字符(从MASM 6.0开始可以是512个字符);但一条语句允许有后续行,最后均以回车作结束。 每一条汇编语句最多由4个字段组成,它们均按照一定的规则分别写在一个语句的4个区域内 ,各区域之间用空格或制表符(TAB键)隔开。 整个源程序必须以END语句来结束,它通知汇编程序停止汇编。END后面的标号START表示该程序执行时的起始地址。 汇编语言程序中至少要有一启动标号,作为程序开始时目标代码的入口

3、地址。启动标号常用START、 BEGIN、MAIN等命名。,7,(一)汇编语言语句的种类和格式 1.语句的种类 在8086/8088汇编语言中,有3种基本语句: 指令语句 伪指令语句 宏指令语句 (1)指令语句:是一种执行性语句,它在汇编时,汇编程序将为之产生一一对应的机器目标代码。 例: 汇编指令 机器码 MOV DS,AX 8E D8 ADD AX,BX 03 C3,8,(2)伪指令语句:是一种说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本身并不代表生成目标代码。 例: DATA SEGMENT AA DW 20H,-30H

4、 DATA ENDS (3)宏指令:是以某个宏名字定义的一段指令序列,在汇编时,凡有宏指令出现的地方都将用相应的指令序列的目标代码插入。 宏指令语句是一般性指令语句的扩展。,9,1.指令语句,指令语句的格式 标号:前缀指令助记符操作数表;注释 1)标号 标号代表“:”后面的指令所在的存储地址(这里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用,以寻找转移目标地址。,2语句格式,10,2)前缀 8086/8088中有些特殊指令,它们常作为前缀同其他指令配合使用,例如和“串操作指令”连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ), 以及总线封锁指令LOO

5、K等 3)指令助记符 4)操作数表 操作数表可以是一个或两个操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔。 5)注释 以“;”开始,用来简要说明该指令在程序中的作用,11,伪指令语句的格式 名字伪指令参数表;注释,2.伪指令语句,12,1)标号的属性 标号表示指令地址,是指令的符号地址,它具有3种属性段地址、段内偏移量(或相对地址)以及类型。 段值(SEG):标号所在段的起始地址 偏移量(OFFSET):段起点距离标号所指存储单元位置的字节数 类型(TYPE): NEAR , FAR )在指令的助记符之前,使用标号并紧跟一个冒号“:”, 表示该标号被定义为一个类型为的标号。 当

6、然,标号也可单列一行 例如: subrout: mov ax,3000h 3)使用过程定义,为过程取的名字也是一个标号 Right PROC NEAR Right ENDP 4) 通常,“标号”只在循环、转移和调用指令中使用。,1.标号,(二)指令语句,13,表达式是操作数的一种,由常量、变量、标号、寄存器与相关运算符组成,包括数值表达式和地址表达式。它的求值是由汇编程序完成的。,2.指令助记符,3.操作数,4.表达式,14,()常量是指那些在汇编过程中已经有确定数值的量,分“数值常量“与“符号常量”两种 ()符号常量的定义需用伪操作命令(伪指令)“”或“” (3)一个能被计算并产生数值的表达

7、式称为数值表达式 一个数值表达式可由常量、字符串常量以及代表常量或串常量的名字等以算术、逻辑和关系运算符连接而成。,1)常量与数值表达式,15,例1: * , 即把送。,例2:AND AX, (NUMB LT 5)AND 30) OR (NMB GE 5) AND 20) 当NUMB时,指令含意为 ,; 当NUMB时,指令含意为 ,。 此例中,操作符与操作数表达式中的具有不同的含意,前者是助记符,后者是伪运算。,16,(1)变量 变量是内存中的一个数据区的名字,即数据所存放地址的符号地址。一方面代表所表示的值,另一方面代表相应存储空间地址。它可以作为指令中的存储器操作数,直接寻址。 变量一般都

8、是在数据段或附加段中使用伪指令(即伪操作命令)DB、DW、DD和DT 来进行定义 变量名 数据区定义伪指令 表达式 变量具有段、偏移、类型三个属性,2)变量与地址表达式,17,(1)段属性:指该变量定义所在段的段地址,称为变量的段值。 (2)偏移属性:指该变量定义所处位置至段地址的字节距离,称为变量的偏移值。 (3)类型属性:指存取该变量所需字节数,可以是字节、字、双字、四字和十字节之一。 注意: 变量和标号的区别 1)变量是数据区的名字,表示存储器操作数的地址;而标号是指令地址的符号表示 2)变量的类型是数据项存取单位的字节数大小;而标号的类型是NEAR和FAR 变量和常量的区别 常量不占存

9、储单元,而变量具有相应的存储空间。,18,数值表达式:在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区中的初值使用。 地址表达式:由变量、常量、标号、寄存器的内容和相关运算符组成的有意义的式子。它表示存储器地址,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性、类型属性。地址表达式主要用来表示执行性指令中的多种形式的操作数。 单个变量、标号、寄存器的内容是地址表达式的特例。在上一章中介绍的各种存储器寻址方式均属于简单的地址表达式。,(2)地址表达式,19,段超越运算符: 用于临时给变量或地址表达式指定段属性。 格式:段寄存器或段名:地址表达式 属性指定

10、操作PTR 用来明确指出或临时指定地址表达式的类型属性。 格式:数据类型 PTR 地址表达式 数据类型可以是BYTE、WORD、DWORD、NEAR、FAR等,20,例:ADD BYTE PTR DI,23H PRT指定地址表达式DI的类型为字节,此句表示将23H与内存字节单元DI中的字节数据相加,结果送回内存字节单元DI。,例:INC BYTE PTR ES:BP+3 ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操作数当前所在的段为附加数据段。 这时,操作数的物理地址将由ES中的内容左移4位与偏移地址BP+3相加而求得。 此句表示将附加数据段中偏移地址为BP+3的内存单元中的数据加1后

11、仍保留在该单元中。 如果没有跨段前缀“ES:”,那么,由BP+3地址表达式所表示的偏移地址将被系统默认为是在堆栈段中。,21,3)分析运算符,又叫取值运算符,可以获得变量、标号、过程名的段、偏移及类型属性值。包括SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW等。 SEG:得到变量、标号、过程名等的段地址。 OFFSET:得到变量、标号、过程名等的移地址。 TYPE:得到变量、标号的类型。 SIZE:得到分配给变量的字节总数。 LENGTH:得到分配该变量的数据项数。 HIGH:取地址表达式的高位字节。 LOW:取地址表达式的低位字节。,22,1、数据定义伪指令,(三)

12、伪指令语句,格式: 变量名 助记符 操作数列表 ;注释,变量名:是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序使其记以第一个字节的偏移地址。,注释:用来说明该伪操作的功能,它也是可有可无的。 助记符:说明所用伪操作的助记符,常用的有以下几种: DB, DW, DQ, DD , DT,23,)(定义字节) 用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初值。如果该数据区定义作为一个变量,则变量类型是。 )(定义字) 数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是。 )(定义双字) 数据项为双字,允

13、许用地址表达式为数据项赋初值(即段属性及偏移量属性),变量类型为。 )(定义4字) 数据项为4字,变量类型为BYTE。 )(定义10字节) 数据项为10个字节,变量类型为。,24, ,25,“ 变量” 语句表示利用该变量的偏移量来初始化相应的存储字;“ 变量”语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。,、可用于初始化存储器。这些伪指令的右边有一表达式,表达式之值即该存储“单位”的初值。,26, ;内容为 ;内容为 ;即高位字为,低位字为 ;内容为 _ ;内容为 * ;内容为 ,27,28,例 操作数也可以是字符串,如: MESSAGE

14、 DB HELLO,则存储器存储情况如右图所示:,注意:DB AB和DW AB的存储 分配空间的不同。如下图:,29,例 操作数?可以保留存储空间,但不存入数据。 如:ABC DB 0,?, ?, ?,0 DEF DW ?, 52, ? 经汇编后的存储情况如右图所示。,30,操作数字段还可以使用复制操作符来复制某个(或某些)操作数。其格式为: repeat_count DUP(operate, operate,),其中repeat_count可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。,例 ARRAYl DB 2 DUP(0, 1,2,?) ARRAY2 DB

15、100 DUP(?),汇编后的存储情况如下图所示。,ARRAYl DB 2 DUP(0, 1,2,?) 和以下语句是等价的: ARRAYl DB 0,I,2,?,0,1,2,?,31,汇编语言中所有的变量名、标号名、过程名、指令助记符、寄存器名等统称“符号”,这些符号可以通过伪指令重新命名,也可以通过伪指令为其定义其他名字及新的类型属性。 (1) EQU(赋值伪指令) EQU可以给表达式赋予一个名字,其后指令中凡需要用到该表达式的均可以用这个名字代替。不申请分配内存。 格式: 符号名 表达式,符号定义伪指令,32,()(等号伪指令) 格式: 符号名 = 表达式 它与基本类似,起赋值作用,区别在

16、于: 使用“”定义的符号名可以被重新定义,使符号名具有新值。 例: ;先将12赋于符号名X ;将符号名X重新定义使其具有新值 则在第2个语句经过汇编后,最终。 。,33,3、段定义伪指令,段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器。所用命令主要有SEGMENT,ENDS,ASSUME,ORG等。 汇编源程序一般由若干段组成, 以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字,34,段名 一系列汇编指令 段名 ,(1) SEGMENT和ENDS伪指令,35,(2) 设定段寄存器伪指令ASSUME,ASSUME 段寄存器名:段名,段寄存器名

17、:段名,.,告诉汇编程序用SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中。 其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由segment定义的段中的段名。,36,伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。 其格式为: 表达式 汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的指令。若省略,则从本段起始地址开始连续存放。,(3)ORG伪指令,37,(1)过程定义伪指令格式: 过程名 类型 ;指令序列 过程名 (2)调用过程 调用过程用“过程名”来实现。 (4)过程返回 通常子程序中包括一至多条返回指令,即当过程运行至

18、某种条件满足时返回至主程序中调用指令的下一条指令继续执行。,4、过程定义伪指令,38,一、顺序结构程序,顺序结构是最基本、最常用的程序结构。其特点是,完全按照程序指令编排的顺序依次执行。 例:对两个字节无符号数求和,这两个数分别用变量及表示。将两数之和的最高位进位放在中,两数之和的其他位按从高到低顺序依次放在,中。,4.3 汇编语言程序设计基本方法,39,D SEGMENT D1 DB 12H,34H,56H,78H, 9AH,0ABH,0BCH,0CDH D2 DB 0CDH,0BCH,0ABH, 9AH,78H,56H,34H,12H D ENDS C SEGMENT ASSUME CS:

19、C,DS:D ;说明代码段、数据段 BG: MOV AX,D MOV DS,AX ;给DS赋段值 LEA DI,D1 ;将D1表示的偏移地址送DI,MOV DX, DI ;取第1操作数到寄存器中 MOV CX, DI+2 MOV BX, DI+4 MOV SI, DI+6 LEA DI,D2 ;将D2表示的偏移地址送DI ADD DX, DI ;将D1和D2相加,结果存放在SI、BX、CX、DX中 ADC CX, DI+2 ADC BX, DI+4 ADC SI, DI+6 MOV AL,0 ADC AL,0 MOV AH,4CH INT 21H C ENDS END BG,40,二、分支结构

20、程序,程序中按照所设置的逻辑条件,在判定当前的状态标志位是否满足后,决定程序两个可能的出口:当满足条件时,后续程序将转向条件转移指令所指的转移地址;当条件布满足时,程序将继续顺序执行。 例:比较以存储器变量和表示的两个有符号字数据的大小,将其中较大数据放在寄存器中,41,DATA SEGMENT D1 DW -123 ;补码为FF85H D2 DW -120 ;补码为FF88H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ;说明代码段、数据段 BEGIN: MOV AX,DATA MOV DS,AX ;给DS赋段值 MOV BX,D1 CMP B

21、X,D2 JGE NEXT ;若D1D2,则不交换,转NEXT MOV BX,D2 ;若D1D2,则交换 NEXT: MOV AH,4CH INT 21H CODE ENDS END BEGIN,42,三、循环结构程序,程序按照所设置的循环条件,自动判断是否继续循环地重复执行循环体,还是终止循环体中程序段地操作,顺序执行后续程序指令。 例:找出从无符号字节数据存储变量开始存放的个数中的最大数放在中. DSEG SEGMENT ;定义数据段 VAR DB 5,7,19H,23H,0A0H N EQU 5 DSEG ENDS,43,CSEG SEGMENT ASSUME CS: CSEG,DS:D

22、SEG ;说明代码段、数据段 BG: MOV AX,DSEG MOV DS,AX ;给DS赋段值 MOV CX,N-1 ;置循环控制数 MOV SI,0 MOV BH,VARSI ;取第1字节数到BH JCXZ LAST ;如果CX=0则转 AGIN: INC SI CMP BH,VARSI JAE NEXT ;若BH中已为较大的数,则转移 MOV BH,VARSI ;改变BH的值,使其为较大的数 NEXT: LOOP AGIN ;CXCX-1,若CX不等 于0则转 LAST: MOV AH,4CH INT 21H CSEG ENDS END BG,44,所谓DOS及BIOS中断调用,就是为了

23、节省编程工作量与优化程序结构,在DOS及BIOS中预先设计好了一系列的通用子程序,以便供DOS及BIOS调用。 由于这种调用采用的是以中断指令INT n 的内部中断方式进行的,因此常称为DOS及BIOS中断调用;又因为在一个中断服务程序中往往包含多个功能相对独立的子程序,所以也将中断调用称为系统功能调用或功能调用或中断功能调用。,四、DOS及BIOS中断调用,45,DOS的功能调用是指DOS为系统程序员和用户提供的一组常用子程序如何使用的问题,DOS规定用中断指令INT 21H进入各功能调用子程序的总入口 所有DOS提供给用户的功能调用格式(包括ROM-BIOS调用)都是一样的,一般分为4个步

24、骤: 在AH寄存器中设置系统功能调用号; 在指定的寄存器中设置中设置入口参数; 用INT 21H指令执行功能调用; 根据出口参数分析功能调用的执行情况。,常用功能调用举例,46,返回 向量号 功能号 该功能使系统结束程序运行后返回DOS状态。 例: , . 键盘输入并显示 向量号 功能号 该功能从键盘输入一个字符,将其码保存在中,输入字符回显在CRT上。 例: , 中断返回时,输入字符的码被存放在中,该字符并显示在屏幕上。,47,.键盘输入但不显示输入字符 向量号 功能号 该功能输入一字符,其码存放在中,但不显示。这种功能往往在设置口令时使用。 例: , .显示一字符 向量号 功能号 入口参数

25、:待显示字符的码 该功能显示中的字符。 例:显示字母b ,2 ,62H ,48,. 在打印机上打印一字符 向量号 功能号 入口参数:待打印字符的码 . 显示以“”结尾的字符串 向量号 功能号 入口参数:指向字符串的首地址 例: 在显示器上显示“How are you?”,49,7.字符串输入 向量号 功能号 0AH 入口参数:DS:DX指向输入缓冲区。 输入缓冲区格式如下:第1字节为预定的最大输入字符数,第2字节空出,待中断服务程序填入键盘连续输入到回车前实际输入字符数。第3字节及以后字节,待中断服务程序填入字符串的ASCII码。 例: 从键盘输入字符串 D SEGMENT D1 DB 20

26、DB ? DB 20 DUP(?) D ENDS,C SEGMENT ASSUME CS:C, DS:D ;说明代码段、数据段 BG: MOV AX,D MOV DS,AX ;给DS赋段值 LEA DX,D1 ;将D1的偏移地址送DX MOV AH,0AH ;输入字符串,最大为20个字符 INT 21H MOV AH,4CH INT 21H C ENDS END BG,50,8.设置日期 向量号 功能号 入口参数:CX=年号,DH=月份,DL=日 例: , , , , 9.取日期 向量号 功能号 其功能与2BH的操作相反。,51,10.设置时间 向量号 功能号 入口参数:CH=小时,CL=分,

27、DH=秒,DL=百分之一秒 11.取时间 向量号 功能号 其功能与2DH的操作相反。,52,1. 已知程序中DATA字数组中存放了100H个补码数,读程序填空,并回答问题: (1)程序执行后,AX与BL存放的是何值 (2)画出此程序的流程图,课堂测试,CODE SEGMENT ASSUME CS: CODE, DS: CODE START: MOV AX, CODE MOV DS, AX MOV CX, 100H MOV SI, OFFSET DATA MOV AX, 0 MOV DX, 0 LP: ADD AX, SI INC SI INC SI ADC DX, LOOP LP ;求和 MO

28、V CX, 100H,;求平均 MOV SI, OFFSET DATA LP1: CMP SI, AX JGE GRT INC BL GRT: INC SI INC SI LOOP LP1 ;求小于平均数的个数 MOV AH, 4CH INT 21H DATA DW 100H DUP(?) CODE ENDS END START,(1),(2),(3),(4),53,2. 已知从数据段的有效地址0070H单元开始存放50个字节数据。请编相应的指令程序,找出数据区中第一个为88H的数据,并将其在数据段中所处的位置序号存入有效地址为1160H的单元中。 要求:采用CX保存计数值50;用SI存放序号;每行写注释。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1