第4章汇编程序设计PPT课件_第1页
第4章汇编程序设计PPT课件_第2页
第4章汇编程序设计PPT课件_第3页
第4章汇编程序设计PPT课件_第4页
第4章汇编程序设计PPT课件_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、4.1 4.1 汇编语言程序的语句格式 执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:标号: : 硬指令助记符 操作数, ,操作数;注释 说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:名字 伪指令助记符 参数,参数,;注释硬指令使CPUCPU产生动作、并在程序执行时才处理的语句,就是前面学习的处理器指令伪指令(DirectiveDirective)不产生CPUCPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关第1页/共70页 MOV CX, 0 ;传送指令,具有2个

2、操作数 DELAY: NOP ;空操作指令,没有操作数,带有标号 LOOP DELAY ;循环指令,标号DELAY说明转移位置 BUFFER DB 1,2,3,4,5,6,7 ;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址汇编语言语句实例第2页/共70页标号、名字与标识符标号是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的

3、字母大小写一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字第3页/共70页保留字 保留字(Reserved Word)是汇编程序已经利用的标识符,主要有:硬指令助记符例如:MOV、ADD伪指令助记符例如:DB、EQU操作符例如:OFFSET、PTR寄存器名例如:AX、CS预定义符号例如:data第4页/共70页4.2 伪指令4.2.1 符号定义伪指令 等值伪指令 EQU 格式: EQU 功能:把表达式的值赋给符号名。 等号伪指令 “” EMP=6 EMP=EMP+1 解除定义伪指令 PUREG 格式:PUREG 符号1,符号2,符号3 功能:解除对符号1、符号2、符号3的赋值

4、第5页/共70页4.2.2变量定义伪指令变量定义(Define)伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化格式: 变量名 DB/DW/DD 初值表第6页/共70页所有的变量都具有三种属性: (1) 段值(SEGMENT),即变量单元所在段的段地址(段的起始地址)的高16位,低4位始终为0; (2) 偏移量(OFFSET),即变量单元地址与段的起始地址之间的偏移量(16位); (3) 类型(TYPE),变量有三种类型: 字节(BYTE)、字(WORD)和双字(DOUBLE WORD)。 变量通常是用存储器初始化命令定义的。第7页/共70页初值表 初值表是用逗号分隔的参数

5、主要由数值常数、表达式或?、DUP组成?表示初值不确定,即未赋初值;DUP表示重复初值DUP的格式为:重复次数 DUP(重复参数)第8页/共70页 例如 BIGGEST DD 12345678H 在汇编时就会初始化,如图所示。它定义了一个双字变量,且给了初始值。第9页/共70页 例如: DB 100 DUP(0);100个字节全初始化为0DW 100 DUP(0);100个字全初始化为0DW 10 DUP(?);保留10个字 例如:ARRAY1 DB 2 DUP(0, 1, 2, ?)汇编后的存储情况如右图一所示例如: DB AB DW AB汇编后的存储情况如图2和图3所示.图2图342414

6、241第10页/共70页4.2.3 4.2.3 属性修改运算符PTRPTR使用格式为: :类型 PTR PTR 地址表达式例如: : DA_BYTE DB 20H DUP(0) DA_BYTE DB 20H DUP(0) DA_WORD DW 30H DUP(0) DA_WORD DW 30H DUP(0) MOV AX, WORD PTR DA_BYTE10 MOV AX, WORD PTR DA_BYTE10 ADD BYTE PTR DA_WORD20, BL ADD BYTE PTR DA_WORD20, BL第11页/共70页4.2.4 分析运算符 (1)SEG (2) OFFSET

7、 分析运算符SEG,返回的是一个存储单元的段地址(即它所在段的起始地址);OFFSET运算符返回的是每一个存储单元地址的段内偏移量,即它与段地址之间的偏差。例如: BUFFER1DB 100 DUP(0) MOVAX,SEG BUFFER1 MOVDS,AX MOVSI, OFFSET BUFFER1第12页/共70页4.2 汇编语言源程序4.2.1 80864.2.1 8086汇编语言程序的一个例子汇编语言程序的一个例子;完成两个字节数据相加 DATA SEGMENT ; 段定义开始 BUF1 DB 34H ; 第1个加数 BUF2 DB 2AH ; 第2个加数 SUM DB ? ; 准备用

8、来存放和数的单元 DATA ENDS ; 段定义结束(DATA) CODE SEGMENT ; 段定义开始(CODE段) ASSUME CS:CODE ,DS: DATA ;规定DATA、CODE分别为数据段和代码段 第13页/共70页 START: MOV AX, DATA MOV DS, AX ; 给数据段寄存器DS赋值 MOV AL, BUF1 ; 取第1个加数 ADD AL, BUF2 ; 和第2个加数相加 MOV SUM, AL ; 存放结果 MOV AH, 4CH INT 21H ; 返回DOS状态 CODE ENDS ; 段定义结束(CODE段) END START ; 整个源程

9、序结束第14页/共70页4.2.2 8086汇编语言源程序的格式汇编语言源程序的格式8086的汇编语言的源程序是分段的,由若干个段形成一个源程序。源程序的一般格式为: NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END标号 第15页/共70页 每一个段有一个名称,以符号SEGMENTSEGMENT作为段的开始,以语句ENDSENDS作为段的结束。这两者都必须有名称,而且名称必须相同。 由若干个段组成一个源程序,整个源程序以语句ENDEND作为结束。 总之,80868086的源程序是由若干段组成的,而一个段又是由若干

10、个语句行组成的。所以,语句行是汇编语言源程序的基础。 第16页/共70页4.2.3 段定义语句 80868086的存储器是分段的,所以80868086必须按段来组织程序和利用存储器,这就需要有段定义语句。段定义的主要命令有: (1) (1) SEGMENTSEGMENT,(2) ENDS(2) ENDS,(3) ASSUME(3) ASSUME, SEGMENTSEGMENT和ENDSENDS语句把汇编语言源程序分成段,这些段就相应于存储器段,在这些存储器段中,存放相应段的目标码。 汇编程序必须知道程序的段结构,并知道在各种指令执行时将访问哪一个段由段寄存器所指向。这个信息是由ASSUMEAS

11、SUME语句提供的。第17页/共70页 通常在汇编语言的源程序中,至少要定义码段(指令段)、堆栈段和数据段,有时还要定义附加段。每一个段必须有一个名称,如MY_DATA、MY_CODE等。一个段由命令SEGMENT开始,由命令ENDS结束,它们必须成对出现,而且它们的语句中必须有名称,名称必须相同。最后用语句END来结束整个源程序。 ASSUME语句,只是使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了代码段寄存器CS以外),还必须在程序执行时,用MOV指令来赋给。第18页/共70页4.3 4.3 汇编源语言程序设计汇编源语言程序设计分支结构示意图循环结构示意图第19页

12、/共70页.1分支结构举例分支结构举例 在一个实际的程序中,程序始终是直线执行的情况是不多见的,通常都会有各种分支。例1 变量x的符号函数可用下式表示:y=1 ,当x0y=0 ,当x=0y=-1,当x0 在程序中,要根据x的值给y赋值,如图4-所示。 注: x保存在AL中, y保存在YY单元中。第20页/共70页START: MOV AX, DATA MOV DS, AX CMP AL, 0 JGE BIGR MOV AL, 0FFH JMP EQUL BIGR: JE EQUL MOV AL, 1EQUL: MOV YY, AL 第21页/共70页例2 编制计算下面函数值的程

13、序(X,Y均为字节符号数) z=1, 当x0,y0 z=0 , 当x和y异号 z=-1, 当x0, y0 分析 根据题意,先判断X,Y是否异号,异号Z赋值0;若不是异号即是同号,则只需要再判断其中任一数的符号即可得知X,Y是大于等于零还是小于零。另外,本程序采用先赋值后判断的方法可简化程序设计。第22页/共70页 DATA SEGMENT X DB 5 Y DB -9 Z DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AL, X XOR AL, Y JS BACK

14、MOV Z, 1 第23页/共70页 CMP X, 0 JNS BACK NEG Z MOV DL, Z BACK: MOV AH, 4CH INT 21H CODE ENDS END START第24页/共70页例3(P128) DATA SEGMENT TABLE DB -1, -120, 9, 19,. PLUS DB ? MINUS DB ? ZERO DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATA START: MOV AX, DATA MOV DS, AX 第25页/共70页 XOR AL, AL MOV PLUS, AL

15、MOV MINUS, AL MOV ZERO, AL LSE SI, TABLE MOV CX, 100 CLD CHECK: LODSB OR AL, AL JS X1第26页/共70页 JZ X2 INC PLUS JMP NEXT X1: INC MINUS JMP NEXT X2: INC ZERONEXT: LOOP CHECK HLT 第27页/共70页4.3.2 循环程序设计例1 在数据区中有一个数据存储区,该存储区中有若干个字节数据。要求编写程序统计这些字节数据中0出现的次数并送到另一个内存单元COUNT中。 DATA SEGMENT STR db 1, 2, 0, 0, 0,

16、 3, 45, 9, 0, 0, 0, 69, 0, 1, 89 CN EQU $-STR COUNT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX 第28页/共70页 MOV DI, OFFSET STR MOV DL, 0 MOV CX, CN MOV AL, 0 again: cmp di, al JNZ next INC DL next: inc di loop again MOV COUNT, DL MOV AH, 4CH INT 21H CODE ENDS END

17、 START第29页/共70页例2 设从开始存放若干无符号字节数据,找出其中的最小值,将其保存在寄存器中 分析因为需要重复进行数据大小的比较,所以可设计为循环程序结构形式,设计要点是:找出循环的规律;确定控制循环的方法第30页/共70页 参考程序:DATA SEGMENT BUF DB 26, 78, 196, 45, 16, 9 CNT EQU $-BUF DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, CNT-1 MOV SI, OFFSET BUF MOV BL,

18、 SI第31页/共70页 M2: INC SI CMP BL, SI JBE M1 MOV BL, SI M1: DEC CX JNZ M2 MOV DL, BL CODE ENDS END START第32页/共70页例3TABLE 是一字节数组的首地址,长度为100,统计此数组中正数零及负数的个数。并分别放在COUNT1、COUNT2、COUNT3变量中。 分析既存在循环操作,又存在分支。程序的分支一般用条件转移指令来产生,连续使用条件转移指令可使程序产生多个分支。第33页/共70页DATA SEGMENT TABLE DB 100 DUP(?) COUNT1 DB 0 COUNT2 DB

19、 0 COUNT3 DB 0 DATA ENDS CODE SEGMENT ASSUME CS: CODE ,DS: DATA第34页/共70页START: MOV AX, DATA MOV DS, AX MOV CX, 100 MOV BX, 0 AGAIN: CMP TABLEBX, 0 JGE M1 INC COUNT3 JMP SHORT NEXT M1: JG M2 INC COUNT2 JMP SHORT NEXT第35页/共70页M2: INC COPUNT1 NEXT: INC BX LOOP AGAIN MOV AH, 4CH INT 21H CODE ENDS END ST

20、ART第36页/共70页4.2.3 子程序设计 例1 1 编写一子程序,完成一个2 2位十六进制数到对应的ASCIIASCII码的转换。 子程序名: CONHA: CONHA 功 能:将2 2位十六进制数转换成对应的ASCCIIASCCII码输入参数: ALAL待转换的数输出参数: BXBX转换好的ASCIIASCII码使用寄存器:ALAL、AHAH、BXBX、CLCL第37页/共70页CONHA PROC FARMOV AH , AL ;保存待转换的数AND AL , 0FH ;处理十六进制数低位CMP AL , 0AH ;是16进制中的字母吗?JB ASC1 ;否,转移ADD AL , 0

21、7 ;是,先加7ASC1: ADD AL , 30H ;转换为ASCII码 MOV BL , AL ;保存转换好的低位 MOV CL , 4 ;移位控制 SHR AH , CL ;将原数右移,处理高位CMP AH , 0AH ;是16进制中的字母吗?JB ASC2 ;否,转移ADD AH , 07 ;是,先加7ASC2: ADD AH, 30H MOV BH , AH ;保存转换好的高位RETCONHA ENDP第38页/共70页P191 CSEG SEGMENT ASSUME CS:CSEG ASC_BIN PROC FAR PUSH AX MOV CH, CL CLD XOR AX, AX

22、 MOV DX, AX AGAIN: LODSB AND AL, 7FH CMP AL, 9 JG A_TO_F SUB AL, 30H第39页/共70页 JMP SHORT ROTATEA_TO_F: SUB AL, 37HROTATE: OR DL, AL ROR DX, CL DEC CH JNZ AGAIN POP AX RETASC_BIN ENDP CSEG ENDS 第40页/共70页子程序指令 子程序是完成特定功能的一段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 当运行完子程序功能后,采用RET返回指令回到主程序继续执行第41页

23、/共70页子程序调用和返回指令1)CALL指令 段内直接调用例:CALL NEAR 目标地址 段内间接调用例:CALL WORD PTR SI CALL WORD PTR SI 段间直接调用 例:CALL FAR CALL FAR 目标地址 段间间接调用 例:CALL WORD PTR SICALL WORD PTR SI第42页/共70页) RET 子程序返回指令 和调用指令CALL 相对应的是返回指令RET。返回指令通常作为一个子程序或过程的最后一条指令,它用以返回到调用这个子程序的断点处。第43页/共70页过程名proc near/far.过程名endp 过程名(子程序名)为符合语法的标

24、识符 NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用 FAR属性(段间远调用)的过程可以被不同代码段的程序调用子程序定义第44页/共70页主程序与子程序CALL label主程序RET子程序回到CALL指令后的指令处返回地址第45页/共70页中断指令-1-1 中断指计算机暂时停止正在执行的程序而转向处理某件事件,处理完后再回到原程序断点处继续执行的过程。对某件事的处理即执行一段例行程序,该程序被称为中断服务程序。8086/8088的中断分为内部 中断和外部中断。第46页/共70页中断指令-2-2 中断服务程序的入口地址,称为“中断向量”,由中断服务程序所在段地址及偏移地址组成,

25、共32位,占4个字节。 8086/8088 CPU规定内存0000:0000H0000:03FFH处存放中断向量,共1K字节,可存入256个中断向量,总称为“中断向量表”。第47页/共70页中断指令-3-3 中断向量在中断向量表中的位置由其类型决定,类型取值为0 0FFHFFH,共256256个。每个中断向量占4 4个字节,类型为n n的中断,其中断向量存放处为0000:40000:4* *n n0000:40000:4* *n+3n+3连续的4 4个单元,其中低1616位为偏移地址,高1616位为段地址。 与中断相关的指令有:中断调用指令INT nINT n、溢出中断指令INTOINTO、中

26、断返回指令IRETIRET。第48页/共70页 (1) (1) 中断调用指令 INT nINT n 格式:INT nINT n 功能:产生一个类型为n n的软中断 操作: 标志寄存器入栈; 断点地址入栈,先CSCS入栈,后IPIP入栈; 从中断向量表中获取中断服务程序入口地址,即: IP (0000:4n+1IP (0000:4n+1,0000:4n)0000:4n) CS (0000:4n+3 CS (0000:4n+3,0000:4n+2)0000:4n+2)第49页/共70页 (2) (2) 溢出中断指令 INTOINTO 格式:INTOINTO 功能:检测OFOF标志位,当OF=1OF

27、=1时,产生中断类型为4 4的中断;当OF=0OF=0时,不起作用。 操作: 标志寄存器入栈; 断点地址入栈,先CSCS入栈,后IPIP入栈; 从中断向量表中获取中断服务程序入口地址,即: I P ( 0 0 0 0 : 0 0 1 1 HI P ( 0 0 0 0 : 0 0 1 1 H ,0000:0010H)0000:0010H) C S ( 0 0 0 0 : 0 0 1 3 H C S ( 0 0 0 0 : 0 0 1 3 H ,0000:0012H)0000:0012H) 第50页/共70页 (3) (3) 中断返回指令IRETIRET 格式:IRETIRET 功能:从中断服务程

28、序返回断点处,继续执行原程序。IRETIRET指令是中断服务程序执行的最后一条指令。 操作: 断点出栈,先IPIP出栈,后CSCS出栈; 标志寄存器出栈;第51页/共70页4.4 DOS功能调用 前面一些程序的运行结果,或是保留在寄存器中,或是保留在存储器中,不能方便直观的看到。要了解运算的结果,应在显示器上输出,方便的方法是调用操作系统中的I/O子程序. 第52页/共70页 为给编写汇编语言源程序提供方便,MS-DOS系统中设置了几十个内部子程序,它们可完成I/O设备管理、存储管理、文件管理和作业管理等功能。 其入口地址已由系统置入中断入口地址表中,在汇编语言源程序中可用软件中断指令调用它们

29、。第53页/共70页系统功能调用方法系统功能调用方法调用过程为: 在AH寄存器中设置系统功能调用号 在指定寄存器中设置入口参数 执行指令INT 21H实现中断服务程序的功能调用 根据出口参数分析功能调用执行情况第54页/共70页1、单字符输入1号 功 能:从键盘输入1个字符输入参数:无 输出参数:AL=ASCII码2、单字符输出2号 功 能:在屏幕上显示1个字符(ASCII码) 输入参数:DL=ASCII码 输出参数:无第55页/共70页例 在显示器上输出字母“B”: MOV AH, 2 MOV DL, B INT 21H INT 20H第56页/共70页 3、多字符输入0AH 功 能: 多个

30、字符输入到缓冲区输入参数:DS:DX=输入缓冲区首地址输出参数:DS:DX=输入字符串所在缓冲区 地4、多字符输出9号功 能:多个字符输出到屏幕显示输入参数:DS:DX=输出字符缓冲区首地址输出参数:无 第57页/共70页例 在屏幕上显示一串字符 DATA SEGMENT BUFF DB How do you do?,0DH,0AH,$ DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX , DATA MOV DS , AX LEA DX , BUFF MOV AH , 9 INT 21H第58页/共70页4.5汇编语言程序的

31、开发过程编辑文本编辑器,如 EDIT.COM源程序:文件名.asm汇编汇编程序,如 MASM.EXE目标模块:文件名.obj连接连接程序,如 LINK.EXE可执行文件:文件名.exe调试调试程序,如 DEBUG应用程序错误错误错误错误第59页/共70页 汇编语言源程序 汇编目标程序连接执行/调试程序编辑程序EDIT.EXE汇编程序MASM.EXE连接程序LINK.EXE汇编语言程序的开发过程ML 文件名.ASM 第60页/共70页复习题目 有下列程序段: AGAIN:MOV ES:DI,AL INC DI LOOP AGAIN 下列指令中 可完成与上述程序段相同的功能。 A)REP MOVSB B)REP LODSB C)REP STOSB D)REPE SCASB第

温馨提示

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

评论

0/150

提交评论