微机原理与接口 第5章1_汇编语言程序设计_概念及格式.ppt_第1页
微机原理与接口 第5章1_汇编语言程序设计_概念及格式.ppt_第2页
微机原理与接口 第5章1_汇编语言程序设计_概念及格式.ppt_第3页
微机原理与接口 第5章1_汇编语言程序设计_概念及格式.ppt_第4页
微机原理与接口 第5章1_汇编语言程序设计_概念及格式.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第5章 汇编语言程序设计,主要内容: 汇编语言源程序的格式及上机过程 汇编语句源程序的编写 汇编语言程序的设计(一) 顺序与分支结构 汇编语言程序的设计(二) 循环结构与子程序,2,5.1汇编语言源程序的格式及上机过程,本节学习要求 学会在DEBUG 调试环境下察看程序结果 学会简单汇编程序的编辑、运行过程 掌握常见的输入及显示方法,3,计算机语言发展过程,机器语言,汇编语言,高级语言,FORTRAN BASIC COBOL PASCAL C/C+/C# JAVA .,4,机器语言:依赖于机器的低级语言,书写格式为二进制代码。 优点:执行速度快,效率高。 缺点:表达的意义不直观,编写、阅读

2、、调试较困难。 汇编语言:一种符号语言,与机器语言一一对应;使用助记符 优点:用户理解容易 缺点:不能被机器直接识别 高级语言:独立于机器的通用语言,接近人类的自然语言。 优点:易学易用,可移植性较好 缺点:目标代码冗长,占用内存多,执行效率不高,5,例一 编程实现c=a+b,并在屏幕上显示结果 解1:用C语言实现,#include stdio.h int main(int argc, char* argv) int a,b,c; a=1; b=2; c=a+b; printf(“c=%dn,c); return 0; ,编译后的目标文件达到3.59KB,6,data segment a db

3、 ? b db ? c db ? string db c=$ data ends code segment main proc far assume cs:code, ds:data assume es:data start: push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax,mov a,1 mov b,2 mov al,a add al,b mov c,al lea dx,string mov ah,09 int 21h add c,30h mov dl,c mov ah,2 int 21h mov dl,0ah int 21

4、h mov dl,0dh int 21h ret main endp code ends end start,解2: 用汇编语言实现,汇编后的目标文件只有208字节,7,汇编语言源程序的组织结构 汇编语言源程序采用的是分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以SEGMENT语句开始,以ENDS语句结束,整个程序的结尾是END语句。 在代码段中下面的内容是不可缺少的: (1) 定义段(使用SEGMENT/ENDS语句定义) (2) 约定段寄存器和段的关系(即物理段和逻辑段的关系,使用一个或多个ASSUME语句实现) (3) 装填段寄存器(只装填数据型段寄存

5、器) (4) 设置返回DOS的方法,8,汇编语言源程序的格式,例二 编程实现多字节加法,如 S=3B74AC60F8H+20D59E36C1H,9,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, 5 MOV SI, 0 CLC LOOPER:MOV AL, DATA2SI ADC DATA1SI,AL INC SI DEC CX JNZ LOOPER MOV AH, 4CH INT 21H CODE ENDS,END START,DATA SEGMENT DATA1 DB 0F8H, 60H,

6、 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATA ENDS,10,例如: MYDARA SEGMENT; 定义数据段起始语句 ; 定义数据 MYDATA ENDS; 定义数据段终止语句 MYCODE SEGMENT; 定义代码段起始语句 ASSUME CS:MYCODE,DS:MYDATA; 约定段寄存器和段的关系 START: MOV AX,MYDATA; 装填相应的段寄存器 MOV DS,AX ; 完成所需功能的程序段 MOV AH,4CH; 设置返回DOS INT 21H MYCODE ENDS; 定义代码段终止语句 END

7、START; 程序结束,11,5.1.2 汇编语言语句的类型和格式 1. 语句分类 指令性语句:也称指令语句,指令系统的指令,汇编后产生目标代码。 指示性语句:也称伪指令语句,告诉汇编程序如何汇编,汇编后不产生目标代码。 宏指令语句:自定义语句,由指令语句和伪指令语句组成的指令集合,不展开时不产生目标代码。,12,2. 语句的格式 指令语句与伪指令语句的格式是类似的。一般情况下,汇编语言的语句可以由部分构成: 名字 助记符 操作数 ;注释 其中带方括号的部分表示任选项,既可以有,也可以没有。 例5.1中有如下语句: LOOPER: MOV AL,DATA2SI ;取一个字节加数 DATA1 D

8、B 0F8H,60H,0ACH,74H,3BH;被加数 第一条语句是指令语句,其中“LOOPER:”是名字,“MOV”是指令助记符,“AL,DATA2SI”是操作数,“;”后面是注释部分; 第二条语句是伪指令语句,其中“DATA1”是名字,“DB”是伪指令定义符,“0F8H,60H,0ACH,74H,3BH”是操作数,“;”后面是注释部分。,13,1) 名字 汇编语言语句的第一个组成部分是名字(Name)。在指令语句中,这个名字是一个标号。指令语句中的标号实质上是指令的符号地址。并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其它地方就可以引用这个标号。在例5.1中,START

9、、LOOPER就是标号。标号后面有一个冒号。 标号有三种属性:段、偏移量和类型。 标号的段属性是定义标号在程序段的段地址,当程序中引用一个标号时,该标号的段值应在CS寄存器中。 标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量是一个16位无符号数。 标号的类型属性有两种:NEAR和FAR。前一种标号可以在段内被引用;后一种标号可以在其它段被引用。如果定义一个标号时后跟冒号,则汇编程序确认其类型为NEAR。,14,伪指令语句中的名字可以是变量名、段名、过程名。 与指令语句中的标号不同,这些伪指令语句中的名字并不总是任选的,有些伪指令规定前面必须有名字,有些则不允许有

10、名字,也有一些伪指令的名字是任选的。即不同的伪指令对于是否有名字有不同的规定。伪指令语句的名字后面不跟冒号,这是它和标号的一个明显区别。 很多情况下伪指令语句中的名字是变量名,变量名代表存储器中一个数据区的名字,例如例5.1中的DATA1、DATA2就是变量名。,15,变量也有三种属性:段、偏移量和类型。 变量的段属性是变量所代表的数据区所在段的段地址。由于数据区一般在存储器的数据段中,因此变量的段地址常常在DS和ES寄存器中。 变量的偏移量属性是该变量所在段的起始地址与变量的地址之间的字节数。 变量的类型属性有BYTE(字节)、WORD(字)、 DWORD (双字)、 QWORD (四字)、

11、TBYTE(十字)等,表示数据区中存取操作对象的大小。,16,2) 助记符 汇编语言语句中的第二个组成部分是助记符(Memonic)。 在指令语句中的第二部分是CPU指令系统中指令的助记符,例如:MOV ADC等等。助记符约有90多种,在第四章中已经进行了详细的讨论。 在伪指令语句中的第二部分是伪指令的定义符,例如:DB、SEGMENT、 ENDS 、 END等都是伪指令定义符。它们在程序中的作用是定义变量的类型、定义段以及告诉汇编程序结束汇编等。,17,3) 操作数 汇编语言语句中的第三个组成部分是操作数。 在指令语句中是指令的操作数,可能有单操作数或双操作数,也可能无操作数; 在伪指令中可

12、能有更多个操作数。当操作数不止一个时,相互之间应该用逗号隔开。 可以作为操作数的有:常数、寄存器、标号、变量和表达式等。,18,(1) 常数。常数就是指令中出现的那些固定值,可以分为数值常数和字符串常数两类。 例如,立即数寻址时所有的立即数、直接寻址时所有的地址、ASCII字符串等都是常数。 常数是除了自身的值以外,没有其他属性的数值。在源程序中,数值常数按其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同表示形式。汇编语言用不同的后缀加以区别。,19,(2) 寄存器 80868088CPU的寄存器可以作为指令的操作数。 (3) 标号 由于标号代表一条指令的符号地址,因此可以

13、作为转移(无条件转移或条件转移)、过程调用CALL以及循环控制LOOP指令的操作数。 (4) 变量 因为变量是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。 (5) 表达式 汇编语言语句中的表达式,按其性质可分为两种:数值表达式和地址表达式。数值表达式产生一个数值结果,只有大小,没有属性。地址表达式的结果不是一个单纯的数值,而是一个表示存储器地址的变量或标号,它有三种属性:段、偏移量和类型。,20,表达式是由操作数和运算符组成。即用一个运算符可以对一个或几个操作数进行运算,构成一个表达式。 表达式中常用的运算符有以下几种: 算术运算符:、和MOD。 逻辑运算符:AND、OR、NO

14、T和XOR。 关系运算符:EQ、NE、LT、GT、LE、GE。结果只有两个全1或全0。如, MOV AX,4 EQ 3 ;关系不成立,故(AX)0 MOV AX,4 NE 3 ;关系成立,故(AX)0FFFFH 分析运算符:利用分析运算符可以把一个存储单元地址分解为段地址和偏移地址等。分析运算符有SEG 、OFFSET 、TYPE、SIZE和LENGTH等。,21,分析运算符:利用分析运算符可以把一个存储单元地址分解为段地址和偏移地址等。分析运算符有SEG 、OFFSET 、TYPE、SIZE和LENGTH等。 分析运算符表达式,注意:SIZELENGTHTYPE,22,分析运算符举例:,SE

15、G运算符 MOV AX,SEG ARRAY MOV DS,AX OFFSET MOV DI,OFFSET DATA1 TYPE LENTH,表示变量的个数 SIZE,变量所占空间,字节总数。,23, TYPE运算符。TYPE运算符的运算结果是一个数值,这个数值与存储器操作数类型属性的对应关系见表5.1。 下面是使用TYPE运算符的例子: VAR DW ?;变量VAR的类型为字 ARRAY DD 10 DUP(?) ;变量ARRAY的类型为双字 STR DB THIS IS TEST;变量STR的类型为字节 MOV AX,TYPE VAR ;(AX)2 MOV BX,TYPE ARRAY ; (

16、BX)4 MOV CX,TYPE STR ;(CX)1,24,25, LENGTH运算符。如果一个变量已用重复操作符DUP说明其变量的个数,则利用LENGTH 运算符可得到这个变量的个数。如果未用DUP说明,则得到的结果总是1。 例如,上面的例子中已经用“10 DUP(?)”说明变量ARRAY的个数,则LENGTH ARRAY的结果为10。 SIZE运算符。如果一个变量已用重复操作符DUP说明,则利用SIZE 运算符可得到分配给该变量的字节总数。 如果未用DUP说明,则得到的结果是TYPE运算的结果。 例如,上面的例子中变量ARRAY的个数为10,类型为DWORD(双字),因此,SIZE AR

17、RAY的结果为10440。由此可知,SIZE的运算结果等于LENGTH的运算结果乘以TYPE 的运算结果。,26,(5) 合成运算符。合成运算符可以用来建立或临时改变变量或标号的类型或存储器操作数的存储单元类型。合成运算符有PTR、THIS、SHORT等。 PTR运算符。PTR运算符可以指定或修改存储器操作数的类型,例如: INC BYTE PTRBXSI ;规定了存储器操作数的类型是BYTE(字节) 利用PTR运算符可以建立一个新的存储器操作数,它与原来的同名操作数具有相同的段和偏移量,但可以有不同的类型。不过这个新类型只在当前语句中有效。例如: STUFF DD ? ;定义STUFF为双字

18、类型变量 MOV BX,WORD PTR STUFF ;从STUFF中取一个字到BX,27, THIS运算符。THIS运算符也可指定存储器操作数的类型。使用THIS运算符可以使标号或变量更具灵活性。例如,要求对同一个数据区既可以字节为单位,又可以字为单位进行存取,则可用以下语句: TAB1 EQU THIS WORD TAB2 DB 100 DUP(?) 上面TAB1和TAB2实际上代表同一个数据区,其中共有100个字节,但TAB1的类型为WORD(字类型),而TAB2的类型为BYTE(字节类型)。 SHORT运算符。SHORT运算符指定一个标号的类型为SHORT(短标号),即标号到引用该标号

19、指令之间的距离在128+127个字节的范围内。短标号可以被用于无条件转移指令中。,28,(6) 其他运算符。 段超越运算符“:”。运算符“:”(冒号)跟在段寄存器名(DS,ES,SS和CS)之后,表示段超越,用以给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么。例如: MOV AX,ES:DI 字节分离运算符LOW和HIGH。运算符LOW和HIGH分别得到一个数值或地址表达式的低位和高位字节。例如: STUFF EQU 0ABCDH MOVAH,HIGH STUFF ;(AH)0ABH MOV AL,LOW STUFF ;(AL)0CDH,29,以上介绍了表达式中使用的各种运算符,

20、如果一个表达式同时具有多个运算符,则按以下规则运算: 优先级高的先运算,优先级低的后运算。 优先级相同时按表达式中从左到右的顺序运算。 括号可以提高运算的优先级,括号内的运算总是在相邻的运算之前进行。,30,表5.2 运算符的优先级,31,4) 注释 汇编语言语句的最后一个组成部分是注释。对于一个汇编语言语句来说,注释部分并不是必要的,但是加上适当的注释以后,可以增加源程序的可读性。一个较长的实用程序,如果从头到尾没有任何注释,可能很难读懂。因此,最好在重要的程序段前面以及关键处加上简明扼要的注释。 注释前面要求加上分号(;)。如果注释的内容较多,超过一行,则换行以后前面还要加上分号。注释也可

21、以从一行的最前面开始,以表示对一个程序段的说明。 汇编程序对于注释不予理会,即注释对汇编后产生的目标程序没有任何影响。,32,语句类型及格式,1语句的类型 (1) 指令语句 (2) 伪指令语句(3)宏指令 2. 语句的格式 名字 助记符 操作数 ;注释 名字 标号实质是指令的符号地址。 伪指令语句中的名字可以是变量名、段名、过程名。 助记符 操作数:常数、寄存器、标号、变量和表达式等。 常数:分为数值常数和字符串常数两类。 寄存器 标号 变量 表达式:算术、逻辑、关系、分析、合成及其它运算符 4) 注释,33,上机环境,硬件,系统软件,应用软件,操作系统:DOS系统 编辑器: EDIT.exe

22、 汇编程序:MASM.exe 连接程序:LINK.exe,用户开发的程序:ABC.exe等,CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备,汇编语言源程序的上机过程,34,上机过程,.EXE文件,手写程序,.ASM文件,.OBJ文件,EDIT,MASM,LINK,有语法错误,无法正常连接,有算法错误,35,(1) 编辑程序 DOS 环境下用 EDIT 编辑器 WINDOWS 环境下用 记事本 (2)汇编源程序 宏汇编程序 MASM.EXE 或小汇编程序ASM.EXE 汇编程序主要有以下功能: 检查源程序中语法错误,给出错误提示信息 产生目标文件(.OBJ)、列表文件(.LST)及

23、交叉引用文件(.CRF) 展开宏指令,36,MASM宏汇编的提示信息及回答,交叉参考文件用的文件名 (缺省:无交叉参考文件),Cross referenceNUL.CRF: (交叉参考文件名),列表文件名 (缺省:无列表文件),Source listingNUL.LST: (源列表文件名),目标文件名 (缺省:源文件名.OBJ),Object filenameSource.OBJ: (目标文件名),欲汇编的.ASM源文件名 (缺省:命令中的文件名),Source filename.ASM: (源文件名),回 答,提 示 信 息,37,LINK的提示信息及回答,用到的库文件名 (缺省:无库文件)

24、,Libraries.LIB: (库文件名),建立连接映象文件名 (缺省:无连接映象文件),List file NUL.MAP: (连接映象文件名),欲连接的.OBJ文件名 (缺省:命令中的文件名),Run file .EXE: (可执行文件名),回 答,提 示 信 息,(3) 连接目标文件 通过 LINK.EXE 程序实现 将多模块连接,产生一个.EXE文件 连接库文件(.LIB)及产生连接映象文件(.MAP),38,(4) 运行程序 当我们建立了可执行文件后,就可以直接在DOS下执行该程序。 程序调试 DEBUG是一种面向汇编语言的动态调试工具,共有19条命令。DEBUG提供了可以跟踪、测

25、试程序的环境和条件,使编辑者能够对.EXE和.COM文件的执行进行动态跟踪调试,能够较快地查找出文件的错误和检查程序的运行结果。 还可以利用DEBUG直接编写一段小的汇编程序,并进行调试和运行。,39,DEBUG 常用命令 A 起始地址 汇编并保存一段指令语句 U 起始地址 反汇编 T =起始地址 单步执行(执行一条语句) R 寄存器 显示或修改寄存器内容 D 存储单元逻辑地址 显示存储单元 (80个字节/次) N 文件名 定义文件 L 装入文件,40,DATA SEGMENT NUM DB 82H,68H,88H SUM DB ? DATA ENDS CODE SEGMENT ASSUME

26、CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV BX,OFFSET NUM MOV AL,BX INC BX ADD AL,BX INC BX ADD AL,BX MOV SUM,AL MOV AH,4CH INT 21H CODE ENDS END START,例:,41,5.2 汇编语言和DOS操作系统的接口 1. 用户程序在存储器中的位置,ROM,RAM,DOS,磁,盘,应,用,程,序,其他,系统,程序,引导程序,ROM BIOS,系统检测程序,内,存,FFFFFH,00000H,IO.SYS,COMMAND.COM,MSDOS.SYS,I

27、O.SYS模块,MSDOS.SYS模块,COMMAND.COM,hello.asm,hello.obj,hello.exe,用户程序空间,hello.exe,1KB 中断向量表,EDIT.EXE,MASM.EXE,LINK.EXE,DEBUG.EXE,42,2.用户程序的装入,完成以下操作: 确定内存可用部分 以便存放要执行的 .exe 文件。 建立程序段前缀 PSP (Program Segment Prefix) 程序段前缀大小100H, 即256个字节。 存放执行过程中的控制信息。 PSP最开始的两个字节 CD20, 是一条 INT 20H指令。 装入可执行程序.exe,SP,SP,43

28、,DSEG SEGMENT STRING1 DB 1,2,3,4,5 DSEG ENDS ESEG SEGMENT STRING2 DB ? ESEG ENDS SSEG SEGMENT STACK STACK DW 10 DUP(?) TOP LABEL WORD SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME ES:ESEG,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX,MOV SP,OFFSET TOP LEA SI

29、,STRING1 LEA DI,STRING2 MOV CX,5 CLD REP MOVSB MOV AH,4CH INT 21H CSEG ENDS END START,44,3.返回DOS的方法 执行用户程序后,若要返回 DOS状态,即在屏幕上出现 DOS提示符,等待输入新的命令,应在用户程序的最后安排完成此功能的程序段。 为了保证用户程序执行完后,能回到DOS,可使用如下两种方法: (1) 非标准方法:调用INT 21H的4CH功能,例如: MOV AH,4CH INT 21H,45,(2) 标准方法:借用PSP首单元的INT 20H返回DOS。 这种方法较麻烦。由于执行INT 20H的

30、前提是CS:IP必须指向PSP首单元,否则执行INT 20H反而会造成死机,因此在EXE文件汇编格式中,不能直接执行INT 20H。用下列方法可使在需返回DOS时,CS:IP指向PSP首单元。 把主程序定义成一个远过程。即: 过程名 PROC FAR RET 过程名 ENDP,46, 在给DS、ES赋初值之前,用下列三条指令,把PSP首单元的逻辑地址压入堆栈,即 PUSH DS ;PSP段地址压栈 MOV AX,0 ;或用XOR AX,AX指令 PUSH AX ;PSP段首单元的偏移地址 ;压栈(偏移地址为0000H) 采取了以上措施之后,程序在返回DOS的时候,执行一条RET指令即可返回DO

31、S。因为这条RET指令是远过程中的RET指令,它将从栈顶弹出四个字节,即把PSP首单元的逻辑地址反弹到CS:IP之中,于是CPU就自动从PSP首单元取出INT 20H,执行它返回DOS。,47,例:,DATA SEGMENT NUM DB 82H,68H,88H SUM DB ? DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA BX, NUM MOV AL,BX INC BX ADD AL,BX INC B

32、X ADD AL,BX MOV SUM,AL,RET MAIN ENDP CODE ENDS END START,48,4.数据的输入与输出(DOS功能调用) 微型计算机系统为汇编用户提供了两个程序接口来使用计算机的硬件资源,一个是DOS功能调用,另一个是ROM中的BIOS(basic input/output system) 功能调用。DOS功能调用和BIOS功能调用都是由一系列的服务子程序构成的,但调用与返回不是使用子程序调用指令 CALL和返回指令RET,而是通过软中断指令INT n 和中断返回指令IRET调用和返回的。 软中断(INT n指令)可分为三部分:,49, ROM BIOS中断,占用类型号为10H1FH。 DOS中断,占用类型号为 20H3FH。目前使用的有20H27H和2FH,其余类型号保留。 自由中断,占用类型号为40HFFH,可供系统或应用程序设置开发的中断处理程序用。 1)DOS中断及功能调用 目前DOS常用的9类中断(20H27H和2FH)分为两种: DOS专用中断:INT 22H、INT 23H和INT 24H,用户不能使用。 DOS可调用中断:INT 20H、INT 27H(程序退出); INT 25H、INT 26H(磁

温馨提示

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

评论

0/150

提交评论