ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:88.14KB ,
资源ID:4902099      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4902099.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第4章程序设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第4章程序设计.docx

1、第4章程序设计第4章 汇编语言程序设计一、内容简介: 1 汇编语言语法 2 汇编语言程序实现3汇编语言程序设计方法及应用 顺序结构程序设计; 分支程序设计; 循环程序设计; 子程序设计; 宏 系统功能调用4 汇编语言程序设计举例二、教学目标: 熟练掌握8086/8088微处理器汇编语言程序设计的方法。三、重点内容:汇编语言程序设计方法及应用四、教学时数:124.1 汇编语言语法4.1.1 源程序的结构及组成1. 汇编语言程序结构1)段式结构2)语句 指令语句:产生目标机器代码,供CPU执行并完成特定操作。标号: 前缀 指令助记符 操作数 ;注解其中用方括号括起来的部分,可以有也可以没有。每部分

2、之间用空格(至少一个)分开,一行最多可有132个字符。 1标号 是给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母:A z ; 数字:0 9 ; 特殊字符:?、 、一、$ 。 数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。 2指令助记符 表示不同操作的指令,可以是8088的指令助记符,也可以是伪指令。 3操作数 是指令执行的对象。依指令的要求,可能有一个、两个或者没有,例如: RET ;无操作数 COUNT: INC CX ;一个操作

3、数 如果是伪指令,则可能有多个操作数,例如: COST DB 3,4,5,6,7 ;5个操作数 MOV AX,BP十4 ;第二个操作数为表达式 4注解 该项可有可无,是为源程序所加的注解,用于提高程序的可读性。 伪指令语句:不产生机器码,告诉汇编程序如何对源程序进行正确的翻译和编排 标号: 伪指令助记符 操作数 ;注解 宏指令语句:若干语句组成的程序段,宏指令语句用于定义宏。 标号: 宏指令 参数1, ;注解2. 汇编语句中的名字一般规定: 1、程序主体:一个程序可有多个段,每段可有多个程序;每段由SEGMENT语句开始,ENDS语句结束;程序结束用END。 2、大、小写:任选 3、标号区:不

4、能用数字开头,不能用保留字 4、指令区:操作码助记符区(指令助记符,伪指令助记符) 5、操作数区:4.1.2 汇编语言伪指令指令助记符,汇编时生成相应指令代码伪指令汇编时解释执行,用于“控制和指挥”汇编操作共分8种:数据定义符号定义段定义过程定义宏定义及宏调用模块定义与结束处理器方式条件列表其他1. 数据定义伪指令该类伪指令用来定义存储空间及其所存数据的长度。 DB:定义字节,即每个数据是1个字节。 DW:定义字,即每个数据占1个字(2个字节)。 DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址。 DQ:定义4字长,即每个数据占4个字。 DT:定义10个字节长,用于压缩式

5、十进制数,例如:DATA1 DB 5,6,8,100 DATA2 DW 7,287 TABLE DB ? ;表示在TABLE单元中存放的内容是随机的当一个定义的存储区内的每个单元要放置同样的数据时,可用DUP操作符。一般格式:COUNT DUP(?),COUNT 为重复的次数,“()”中为要重复的数据。如:BUFFER DB 100DUP(0) ;表示以BUFFER为首地址的100个字节中存放00H数据BUFFER1 DB 100 DUP(3,5,2DUP(10),35),24,NUM)想一想存储区的情况?2. 符号定义伪指令EQU、=、及PURGE EQU 伪指令给符号定义一个值。在程序中,

6、凡是出现该符号的地方,汇编时均用其值代替,如:TIMES EQU 50 DATA DB TIMES DUP(?) 上述两个语句实际等效于如下一条语句:DATA DB 50 DUP(?) “=”伪指令可给初始变量赋值。如:COUNT=100 ;COUNT=100TIME=50 ;TIME=50 PURGE伪指令用于释放由EQU伪指令定义的变量,使这些变量可以被重新定义。 PURGE TIMES ; 释放TIMES变量 TIMES EQU 2 ; 重新定义LABLE 伪指令用于定义变量或标号的类型,变量或标号的段属性和偏移属性由该语句所处的位置决定。如:AREAW LABEL WORD ;字类型

7、相同数据区 ARWAB DB 100DUP(?);字节类型3.段定义伪指令SEGMENT和ENDS 一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。 段定义伪指令一般格式为 : 段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS SEGMENT和END5应成对使用,缺不可。其中段名是不可省略的。其它是可选项,是赋予段名的属性,可以省略。例如: DATA SEGMENT DW 20DUP(?)DATA ENDS4. 设定段寄存器伪指令ASSUME一般格式: ASSUME 段寄存器:段

8、名,段寄存器:段名,功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。在段名中,CODE表示代码段,DATA表示数据段,STACK表示堆栈段。由于ASSUME伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值CODE ENDS 当程序运行时,由于

9、DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中DS寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段地址。当使用附加段时,也要用MOV指令给ES赋段地址。5. 定义过程的伪指令PROC和ENDP在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。一个过程由伪指令PROC和ENDP来定义,其格式为: 过程名 PROC 类型 过程体 RET 过程名 ENDP 其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段

10、间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。过程可以嵌套,也可以递归使用。 例如一个延时100ms的子程序,其过程可定义如下, DELAY PROC PUSH BX PUSH CX MOV BL,10 ;延时10ms,改变BL和CX中的值,即可改变延时时间。AGAIN: MOV CX,2801 ; WAIT; LOOP WAIT DEC BL JNZ AGAIN POP CX POP BX RETDELAY ENDPCALL DELAY ;调用该过程 远过程调用时被调用过程必定不

11、在本段内。例如,有两个程序段,其结构如下: CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR RET FARPROC ENDP CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2CALL FARPROC.CODE2 ENDSCODE1 段中的FARPROC 过程被另一段CODE2调用,故为远过程。6. 宏指令 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。宏指令的一般格式为:宏指令名 MACRO 形式参量表 宏体

12、ENDM例如:SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM 这样定义以后,凡是要使AL中内容左移4位的操作都可用一条宏指令SHIFT来代替。宏指令与子程序有许多类似之处。它们都是一段相对独立的、完成某种功能的、可供调用的程序模块,定义后可多次调用。但在形成目的代码时,子程序只形成一段目的代码,调用时转来执行。而宏指令是将形成的目的代码插到主程序调用的地方。因此,前者占内存少,但执行速度稍慢;后者刚好相反。七、 ORG 伪指令ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。 一般格式: ORG 例如:DATA SEGMENT BUFF1 DB 23,56

13、H,EOF ORG 2000H BUFF2 DB STRING DATA ENDS上述变量定义中,BUFF1从DATA段偏移地址为0的单元开始存放,而BUFF2则从DATA段偏移为2000H的单元开始存放,两者不是连续存放。八、 汇编结束伪指令END 该伪指令表示源程序的结束令汇编程序停止汇编。因此,任何一个完整的源程序均应有END指令。一般格式: END 表达式其中表达式表示该汇编程序的启动地址。例如:END START ;表明该程序的启动地址为START。4.1.3 汇编语句由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由14个部分组成,其格式是: 标号 指令助记符

14、 操作数;注解1.常量常数:二进制、八进制、十六进制、十进制或ASCII码 表示范围 3276832767标号: 数据变量标号:段值所在段的地址 偏移量数据变量的位置地址与其段地址之差值类型数据变量是字节、字或双字 程序位置标号:NEAR段内调用或转移FAR段间调用或转移2.变量 可以具有不同值的量。通过数据定义伪指令定义,与某个存储区关联。类型有:字节型BYTE,字型WORDD,双字型DWORD,4字型DQ,5字型DT等3.汇编语言的运算符1)算术运算符、逻辑运算符和关系运算符 算术运算符可以应用于数字操作数,结果也是数字。而应用于存储器操作数时,只有、 运算符有意义。2)分析运算符SEG、

15、OFFSET、TYPE、SIZE和LENGTH SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。例如,定义: SLOT DW 25则:MOV AX,SLOT;从SLOT地址中取一个字送入AXMOV AX,SEG SLOT;将SLOT所在段的段地址送入AX存储器操作数的类型属性及返回值字节1字2双字4NEAR1FAR2MOV AX,OFFSET SLOT;将SLOT所在段的段内偏移地址送AX TYPE操作符返回一个表示存储器操作数类型的数值。各种存储器地址操作数类型部分的值如表3-1所示。 LENGTH和SIZE操作符只应用于数据存储器操作数。(用DB/DW/DD等定义的操作数)LE

16、NGTH返回一个与存储器地址操作数相联系的单元数,SIZE操作数返回一个为存储器操作数分配的字节数。例如:若 MULT-WORD DW 50DUP(0)则 LENGTH(MULT-WORD)=50SIZE(MULT-WORD)=100注意:SIZE(X)=(LENGTH X)* (TYPE X)3)属性运算符 属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。常用的有:(1) 合成运算符PTR它作用于操作数时,则忽略了操作数当前的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性,一般格式:类型 PTR 表达式功能:建立一个存储器地址操作数,它与其后的存

17、储器地址操作数有相同的段地址偏移量,但有不同的类型。例如:SLOT DW 25 此时SLOT已定义成字单元。若我们想取出它的第一个字节内容,则可用PTR对其作用,使它暂时改变为字节单元,即 MOV AL,BYTE PTR SLOT4.表达式算术表达式:算术运算符组成的表达式,、MOD(取余数)。是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表达式和地址表达式。 1)常数 汇编语言语句中出现的常数可以有7种: 二进制数 后跟字母B,如01000001B。 八进制数 后跟字母Q或O,如202Q或202O。 十

18、进制数 后跟D或不跟字母,如85D或85。 十六进制数 后跟H,如56H,0FFH。注意,当数字的第一个字符是AF时,在字符前应添加一个数字0,以示和变量的区别。 另有,十进制浮点数、十六进制实数、字符和字符串2)常量操作数 常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。可以为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制等计数形式;而后者则为相应字符的ASCII码。 3)存储器操作数存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符的形式出现。存储器操作数可以分为变量及标号两者类型,如果存储器操作数所代表的是某个数据在数据段、附加

19、段或堆栈段中的地址,那么这个存储器操作数就称为变量;如果存储器操作数所代表的是某条指令代码在码段中的地址,那么这个存储器操作数称为标号。变量所对应的存储单元内容在程序的运行过程中是可以改变的,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。 存储器操作数有三个方面的属性。 (1) 段地址:即存储器操作数所对应的存储单元所在段的段地址; (2) 偏移地址:即存储器操作数所对应的存储单元在所在段内的偏移地址; (3) 类型:变量的类型是相应存储单元所存放的数据项的字节数;而标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可有两种情况,即 NEA

20、R和FAR。具体值可见表3-1 4)常量表达式:由常量操作数及运算符构成,在汇编时产生一个常量。如PORT、VAL十1、 OFFSET SUM、SEG SUM、TYPE CYCLE等。 5)地址表达式:由存储器操作数与运算符构成,必须有明确的物理意义。 例如 SUM2、CYCLE5表达式SUM2、CYCLE5的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM及CYCLE大2或小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。逻辑表达式:逻辑运算符组成的表达式,AND、OR、XOR、NOT, 逻辑运

21、算按位进行。关系运算表达式:关系运算符组成的表达式,EQ(等于)、NE(不等)、LT(小于)、GT(大于)、GE(大于等于);满足条件,表达式的值为1,否则为0。分析运算表达式:把存储器操作数分解为几个组成部分。合成运算表达式:把这些组成部分综合为存储器操作数。4.2 汇编语言程序实现4.2.1汇编语言程序实现步骤 图4-1 汇编语言程序实现流程1.编辑源程序字处理,如:EDIT,WORD等2.汇编用汇编工具将源文件 XX.ASM进行汇编,生成目标文件XX.OBJ。3.连接用连接工具将目标文件 XX.OBJ进行连接,生成可执行文件XX.EXE。4.程序运行提示符下键入文件名。查错 修改源程序

22、汇编、连接、运行。5.程序调试及结果查看动态调试工具DEBUG。4.2.2 COM文件的生成1. 把EXE文件转换成COM文件2. 用DEBUG生成COM文件4.2.3 可执行程序的装入1. EXE程序图4-2 程序连接与定位过程图 2. COM文件图4-3 COM文件内存映像3. 程序段前缀图4-4 程序段前缀结构4.2.4 汇编语言和操作系统MS-DOS的接口1.标准方法1) 将应用程序的主程序定义成一个FAR过程,其最后一条指令为RET。2) 在代码段的主程序开始部分用三条指令,把PSP中INT 20H指令的段地址(CS = DS = ES)及偏移地址(0)压入堆栈。PUSH DSMOV

23、 AX, 0PUSH AX 2.用DOS功能调用4CH在用户程序中不定义过程段,只在代码段结束之前增加2条语句:MOV AH, 4CHINT 21H内中断21H是操作系统向用户提供服务程序的窗口,4CH号功能服务用于结束用户程序,操作系统收回CPU的控制权。类似功能有INT 20H。4.3 汇编语言程序设计方法及应用4.3.1 概述1. 程序设计步骤分析问题,建立数学模型确定解决问题的算法绘制流程图或结构图分配存储空间及工作单元(包括寄存器)编写程序静态检查上机运行调试2. 结构化程序设计 程序质量标准“清晰第一,效率第二” 程序设计过程“自顶向下,逐步求精” 三种基本结构:顺序、分支、循环4

24、.3.2 顺序结构程序设计简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。【例1】利用查表法计算平方值。已知0 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。分析:建立平方表,通过查表完成。STACK SEGMENT DB 100 DUP(?)STACK ENDSDATA SEGMENT SUR DB ? DIS DB ? SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 09的平方表DATA ENDSCODE SEGMENT ASSUME CS:CODE,D

25、S:DATA,SS:STACK,ES:DATABEGIN:PUSH DS MOV AX,0 PUSH AX ;保证返回DOS, MOV AX,DATA MOV DS,AX ;为DS送初值 LEA BX,SQTAB ;以下程序部分完成查表求平方值 MOV AH,0 ;亦可用查表指令完成(如下程序段) MOV AL,SUR ;AL=X LEA BX, SQTAB ADD BX,AX ; MOV AL, SUR MOV AL,BX ; XLAT MOV DIS,AL ; MOV DIS, ALCODE ENDS END BEGIN【例2】已知 Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩

26、BCD码表示的数,写出程序。分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下: MOV AL,Z MOV BL,W ADD AL,BL DAA MOV BL,AL ; BL=(W+Z) MOV AL,X MOV DL,Y ADD AL,DL ; AL=(X+Y) DAA ;十进制调整 SUB AL,BL ; AL=(X+Y)-(Z+W) DAS ;十进制调整 MOV Z,AL ;结果送Z 4.3.3 分支程序设计分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。 图4-5 分支程序结构1.双分支程序实现【

27、例3】试编写程序段,实现符号函数。分析:变量X的符号函数可表示为: 1 X0 Y= 0 X=0 -1 X0 程序可通过对符号标志的判别来确定执行哪一分支。START: MOV AX,BUFFER ;(BUFFER)=X OR AX,AX JE ZERO ;X0,则转ZERO JNS PLUS ;X为正数,则转PLUS MOV BX,0FFFFH ;X为负数,则1送BX JMP CONT1ZERO: MOV BX,0 JMP CONT1PLUS: MOV BX,1CONT1: 【例4】两数比较大小图4-6 比较大小2.多分支程序设计 相异性条件:所有条件中只有一个条件成立。 相容性条件:所有条件

28、中可能有两个以上甚至所有条件都成立常用方法:转移表法、地址表法、逻辑分解法1) 转移表法【例5】一监控程序,有10个控制命令键。这些命令的实现由监控程序中10个子程序完成,子程序入口地址为ADR0ADR9。据此建立跳转表,表内存放10条跳转指令,JMP ADR0JMP ADR9。设10个命令键编号为09。分析:表地址 = 表基地址 + 偏移量,按键号X为条件,每条跳转指令长度为3个字节,则按键号X对应的命令子程序的跳转指令在跳转表中的偏移量是3X。JMP NEAR BRA1JMP NEAR BRA2JMP NEAR BRA3BRA-TAB 程序:MOV AH,0MOV BL,ALADD AL,

29、AL ;求2XADD AL,BL ;求3X,即位移量MOV BX,OFFSET BRA-TAB ;设BRA-TAB为表首ADD BX,AXJMP BX2) 地址表法【例6】 利用表实现分支表4-1 子程序R1R8的入口地址表P1子程序R1的入口偏移地址P2子程序R2的入口偏移地址P3子程序R3的入口偏移地址.P7子程序R7的入口偏移地址P8子程序R8的入口偏移地址根据AL中各位被置位情况,控制转移到8个子程序P1P8之一中去。地址表的结构如表4-1所示。分析:对于这种程序关键要找出每种情况的转移地址,从图中可见表地址=表基地址+偏移量, 而偏移量可由AL各位所在位置*2求得。流程图见图4-7。DATA SEGMENTBASE DW SR0,SR1,SR2,SR3, SR4,SR5,SR6,SR7DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATABEGIN: PUSH DS XOR AX,AX PUSH AX

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1