




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,第四章 8086汇编语言程序设计,2,导学,讲述了一些常见的伪指令、宏指令、各种程序设计以及如何调试和运行一个汇编程序, 要求在程序设计时能够熟练运用所学的伪指令, 对程序设计重点掌握三种程序结构,即顺序结构、分支结构、循环结构的程序设计方法, 掌握子程序的设计方法,以便能够设计具有良好结构的程序,3,内 容,4,第一节伪指令,伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理 伪指令不产生与之相应的目标代码。 伪指令用于定义数据、分配存储区、定义段以及定义过程等,5,一、数据定义伪指令,数据定义伪指令的用途是定义一个变量的类型,并赋初值,或者仅分配存储单元,而不赋值 ; 示例: DA
2、TA DB 100,OFFH ;存人64H,FFH STR DBWELCOME! ;存人8个字符 BA DWAB ;存入42H,41H ADRS DW TABLE,TABLE+5,TABLE+ 10 ;存入3个偏移地址 BUFFER DB 10 DUP(?) : 给BUFFER分配十个字节,不赋值,6,二、符号定义伪指令,1EQU: STR EQU 64*1024 2=(等号) COUNT= 10 3LABEL AREAW LABEL WORD ;变量AREAW类型为WORD AGAINF LABEL FAR ;定义标号AGAINF为FAR,7,三、段定义伪指令,1SEGMENT/ENDS 格
3、式:段名 SEGMENT 定位类型组合类型类别 段名 ENDS (1)定位类型(ALIGN)告诉汇编程序如何确定逻辑段的边界在存储器中的位置BYTE(1) WORD (2)PARA(16)缺省 PAGE (256) (2)组合类型(Combine) 不组合NONE PUBLIC STACK COMMON MEMORY AT表达式 (3)类型(Class) :具用相同类别名逻辑段被装入连续的内存区,8,2ASSUME / NOTHING,格式: ASSUME段寄存器名:段名,段寄存器名:段名, ASSUME伪指令告诉汇编程序,将某一个段寄存器设置为某一个逻辑段址 关键字NOTHING表示取消前面
4、用ASSUME伪指令对这个段寄存器的设置。 ASSUME CS:CODE,DS: DATAl,SS: STACK,9,四、过程定义伪指令PROC/ENDP,格式: 过程名 PROC NEAR/FAR RET 过程名 ENDP 示例: NAME2 PROC NEAR ; RET NAME2 ENDP,10,五、模块定义与连接伪指令,在编写规模比较大的汇编语言程序时,可以将整个程序划分为几个独立的源程序(或称模块),然后将各个模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。 各个模块之间可以相互进行符号访问。也就是说,在一个模块中定义的符号可以被另一个模块引用。 通常
5、称这类符号为外部符号,而将那些在一个模块中定义,只在同一模块中引用的符号称为局部符号,11,1NAME NAME伪指令用于给源程序汇编以后得到的目标程序指定一个模块名,连接时需要使用这个目标程序的模块名。 其格式为 NAME模块名 2END END伪指令表示源程序到此结束,指示汇编程序停止汇编,对于END后面的语句可以不予理会。 格式为: END 标号,12,3PUBLIC PUBLIC伪指令说明本模块中的某些符号是公共的,即这些符号可以提供给将被连接在一起的其他模块使用。 格式为: PUBLIC符号, 4EXTRN EXTRN伪指令说明本模块中所用的某些符号是外部的,即这些符号将在被连接在一
6、起的其他模块中定义(在定义这些符号的模块中还必须用PUBLIC伪指令说明)。 格式为: EXTRN 名字:类型,,13,第二节宏指令,在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义为一个宏指令,然后每次需要时,即可简单地用宏指令来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。,14,一、 MACRO/ENDM,格式: 宏指令名 MACRO 参数, ;(宏定义体) ENDM 示例: DECADD1 MACRO OPRl,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPRl,AL ENDM 调用:DECADDl DL,BU
7、FFER,15,二、PURGE:取消已有的宏定义。,格式PURGE 宏指令名,,16,三、宏指令与子程序的区别,1)宏指令由宏汇编程序MASM在汇编过程中进行,在每个宏调用处,将相应的宏定义插入;而调用指令CALL和返回指令RET则是CPU指令。执行CALL指令时,CPU使程序的控制转移到子程序的入口地址。 2)宏指令简化了源程序,但不能简化目标程序,汇编以后,在宏定义处不产生机器代码。但在每个宏调用处,通过宏扩展,重复程序段的机器代码仍然出现多次,因此不节省内存单元。对于子程序来说,在目标程序中定义子程序的地方将产生相应的机器代码,但每次调用时,只需用CALL指令,不再重复出现子程序的机器代
8、码,一般来说可以节省内存单元。 3)从执行时间来看,子程序调用和返回需要保护断点、恢复断点等等,都将额外占用CPU的时间,而宏指令则不需要,因此相对来说,执行速度较快,17,第三节程序设计,段是8086/8088系列微机汇编语言程序的基础。一个段就是若干指令和数据的集合。 编制汇编语言源程序时,首先要使用段定义伪指令和段寻址伪指令来构造-个由若干指令和数据组成的程序。 一个程序有几个段,完全根据实际情况来确定。通常是按照程序中的用途来划分段。 如存放数据的段,作堆栈使用的段,存放程序的段,存放子程序的段等等 段排列的先后顺序可以是任意的,18,程序的基本结构,代码段中,同其他高级语言程序一样,
9、无论程序复杂或简单,程序的基本结构形式有四种: 顺序程序、 分支程序、 循环程序 子程序。 即使复杂的程序,也可以分解为这四种基本结构形式,19,程序设计步骤,(1)分析问题,建立数学模型 (2)确定算法 (3)编制程序流程图 把解题的方法、步骤用框图形式表示。如果要解决的问题比较复杂,那么可以逐步细化,直到每一框图都可以很容易编制程序为止 (4)合理分配存储空间和寄存器 (5)编制程序 (6)调试程序,20,程序流程图,21,调试程序,使用编辑程序,送入已编写好的源程序,在盘上建立一个扩展名为.ASM的文件。 使用宏汇编程序MASM,把扩展名为.ASM的源程序汇编成目标程序,在盘上获得扩展名
10、为.OBJ文件。 使用连接程序LINK,把扩展名为.OBJ的目标程序连接装配成可执行文件(扩展名为EXE),并存放在盘上。 使用调试程序DEBUG,调试扩展名为.EXE可执行的目标程序,22,二、顺序程序设计,例4.4试编制一程序,求出下列公式中Z值,并存放在RESULT单元中;其中X,Y的值分别存放在VARX,VARY单元中,23,数据段定义,1 DATASEGMENT 2 VARX DW 6 3 VARY DW 7 4 RESULT DW ? 5 DATA ENDS,24,堆栈段定义,6 STACK1SEGMENT PARA STACK 7DW 20H DUP(0) 8 STACK1 EN
11、DS,25,设计代码段,COSEGSEGMENT PROCI PROC FAR ASSUME CS:COSEG,SS:STACKl,DS:DATA START : PUSH DS MOV AX,O PUSH AX MOV AX,DATA MOV DS,AX MOV DX,VARX;DXX ADD DX,VARY; DXX+Y MOV CL,3 SAL DX,CL; DX(X+Y) 8 SUB DX,VARX ; DX(X+Y) 8-X SAR DX,1; DX(X+Y) 8-X/2 MOV RESULT,DX RET;堆栈中弹出IP(00H)CS PROCI ENDP COSEG ENDS E
12、ND START,26,另外的返回方法,COSEGSEGMENT ASSUME CS:COSEG,SS:STACKl,DS:DATA START : MOV AX,DATA MOV DS,AX MOV DX,VARX;DXX ADD DX,VARY; DXX+Y MOV CL,3 SAL DX,CL; DX(X+Y) 8 SUB DX,VARX ; DX(X+Y) 8-X SAR DX,1; DX(X+Y) 8-X/2 MOV RESULT,DX MOV AH,4CH;返回操作系统 INT 21H COSEG ENDS END START,27,三、分支程序设计,在程序运行中改变程序执行的顺序
13、。 在程序运行中,执行哪条指令是由CS和IP所决定的。因此,程序流向的控制和转移,主要是改变CS和IP。 若转移仅在同一段内进行,就只需修改IP;若是在两个段之间进行,则CS和lP都需要修改,28,分支程序两种结构形式,(1)比较测试一分支结构 (2)分支表(跳转表)结构,29,1用比较测试一分支结构实现分支程序设计,在产生分支前,通常用比较、测试的办法,在标志寄存器中设置相应的标志位。 然后再选用适当条件转移指令,以实现不同情况的分支转移。 为进行比较,可使用比较指令( Compare): 指令格式: CMP DEST,SRC,30,31,2用跳转表形成多路分支程序设计,为了实现多路分支,常
14、用跳转表。例如某程序需n路分支,每路程序的入口地址分别为SUB1,SUB2,SUBn。 把这些转移的入口地址组成一个表,叫跳转表。表内每两个字节存放一个人口地址的偏移量。 跳转表也可以由若干个跳转指令组成,这时用无条件转移指令,且每条指令的目标代码长度要一致,否则分支程序的编制非常麻烦。,32,跳转表分支程序举例,COSEG SEGMENT ASSUME CS: COSEG,DS: DATA, SS: STACK1 BEGIN: MOV AX, DATA MOV DS,AX MOV AL, PARAM XOR AH,AH DEC AL;序号减1 SHL AL,1;乘2:地址占2字节 MOV B
15、X,OFFSET TABLE;跳转表首址 ADD BX,AX JMP BX SUB1 . . JMP END0 SUB2 JMP END0 SUB3: ; JMP END0 SUBn: ; END0: MOV AH4CH INT 21H COSEG ENDS END BEGIN,DATA SEGMENT TABLE DW SUB1,SUB2,SUB3,SUBn PARAM DB 3 ; 子程序入口序号 DATA ENDS STACK1 SEGMENT PARA STACK DW 10H DUP(0) STACK1ENDS,33,四、循环程序设计,五个部分组成 (1)初始化部分 (2)工作部分
16、(3)修改部分 (4)控制部分 (5)结束处理部分,34,循环控制方法,(1)用计数控制循环 这种方法直观、方便,易于程序设计。只要在编制程序时,循环次数已知,就可以使用这种方法设计循环程序。 (2)用条件控制循环有些情况无法确定循环次数,但是循环何时结束,可用某种条件来确定。这时,编制程序主要是寻找控制条件及对控制条件的检测,35,五、子程序设计,在一个程序中,当不同的地方需要多次使用某程序段(即完成一个给定功能的程序段)常常单独编制一指令序列。 在程序运行时,若需完成这个给定功能,就转移到这个指令序列,待指令序列执行完后,又返回到原来位置继续执行。 这个单独编制的指令序列就叫子程序。 转移
17、到子程序称为调用子程序,36,1编制子程序的基本要求,(1)子程序必须有一定的通用性 (2)选用适当的方法在主程序与子程序之间进行参量传递 (3)注意信息的保存 (4)正确使用堆栈 (5)编制子程序文件,37,2子程序设计举例,例4 .10:将两个给定的二进制数转换为二进制数的ASCII码。 这个代码转换用主程序与子程序结构形式。主程序提供被转换的数和转换后ASCII码的存储区首地址。 子程序完成二进制数的转换,为了提高子程序的代码转换通用性,即它可以完成8位或16位数的转换。,38,39,2进制转换为ASCII码子程序,BINASCPROC;待转换的2进制数存于DH中,结果送回DI MOV
18、CX,AX;转换2进制位数 LOP :ROL DX,1;循环左移一位,最高位到 DL中 MOV AX,DL;送取出的一位2进制数进累加器 AND AL,DL;将标志位清零 ADD AL,30H;转换为ASCII码 MOV DI,AL;送到目的地址 INC DI; 目的地址加1,指向下一个字节; LOOP LOP;CX=CX-1,不为零则回标号“LOP” RET ; 执行完毕,从堆栈中恢复IP和CS BANASC ENDP COSEG ENDS,40,3子程序的嵌套与递归调用,一个子程序调用另一个子程序叫子程序嵌套。由于调用子程序时,断点地址保存在堆栈中,因此子程序嵌套的层次受堆栈空间大小的限制
19、。 若一个子程序调用该子程序本身,则叫递归调用。递归调用是子程序嵌套的特例 。,41,42,第四节调试与运行,使用编辑程序,送入已编写好的源程序,在盘上建立一个扩展名为.ASM的文件。 使用宏汇编程序MASM,把扩展名为.ASM的源程序汇编成目标程序,在盘上获得扩展名为.OBJ文件。 使用连接程序LINK,把扩展名为.OBJ的目标程序连接装配成可执行文件(扩展名为EXE),并存放在盘上。 使用调试程序DEBUG,调试扩展名为.EXE可执行的目标程序,43,一、汇编器和连接器的使用,在DOS平台上使用得较普遍的汇编器是MASM和TASM,连接器是LINK和TLINK。 MASM和LINK由Mic
20、rosoft公司出品,TASM和TLINK由Borland公司出品。,44,1MASM的使用,命令格式如下: MASM/options source(.asm),out(. obj),list(. lst),cref(. crf); 示例:C MASM Microsoft( R) Macro Assembler Version 5 .00 Copyright(C)Microsoft Corp 1981一1985 ,1987. All rights reserved. Source filename .ASM;HELLO. ASM 指定源文件名为HELLO. ASM Object filenam
21、e HELLO.OBJ:TEST 指定目标代码文件名为TEST. OBJ Source listing NUL.LST: 按回车键,表示不要生成列表文件 Cross - reference NUL. CRF: 按回车键,表示不要生成交叉参考文件 51568 +426896 Bytes symbol space free 0 Warning Errors 0 Severe Errors,45,MASM的用法示例(续),C MASM HELLO 缺省的扩展名是ASM Microsoft( R) Macro Assembler Version 5 .00 Copyright(C)Microsoft
22、Corp 1981-1985,1987. All rights reserved. Object filename HELLO,OBJ: 按回车键,同意目标代码文件名HELLOOBJ Source listing NUL. LST: 按分号键,按缺省设置处理后续参数,不生成列表文件和交叉参考文件。 51568+ 426896 Bytes symbol space free O Waming Errors O Severe Errors C MASM HELLO; 命令行尾的分号表示其他参数按缺省设置处理,也即目标文件名同源文件名(扩展名为OBJ),不生成列表文件和交叉参考文件。,46,2LIN
23、K的使用,命令格式如下: LINK /options source(.obj),out(.exe),mapfile(.map),1ibrary(.lib. 可选的命令动作选项由符号“”引导。利用命令“LINK/HELP”可获得有关命令动作选项及其说明信息。 Source(obj)指定目标代码文件,缺省的扩展名是OBJ。可以有多个目标代码模块的文件,文件标识间用加号间隔或者用空格间隔。 Out(exe)指定输出的可执行程序文件,缺省的文件名同第一个目标代码模块的文件名。缺省的扩展名是EXE。 Mapfile( .map)指定输出的定位图文件,缺省的扩展名是MAP。缺省情况下不生成定位图文件。 L
24、ibrary( .lib)指定连接时使用的库文件,缺省的扩展名是LIB。可以有多个库,库文件标识间用加号间隔或者用空格间隔。缺省情况下不使用库。 命令行最后的分号表示其后的缺省项,按缺省设置处理。,47,LINK的使用示例,例如,利用LINK汇编独立的目标代码模块HELLO. OBJ,生成的可执行程序存放在文件TEST. EXE中 操作命令如下: C LINK Microsoft(R)8086 0bject linker Version 3.05 Copyright( C)Microsoft Corp 1983,1984,1985 All rights reserved. Object Mod
25、ules .OBJ:HELLO 指定目标代码模块文件标识,扩展名是OBJ Run File HELLO.EXE:TEST 指定可执行文件标识,缺省扩展名是EXE List File NUL. MAP: , 按回车键,不生成定位图文件 LibrariesLIB: 按回车键,不使用库 Waming: no stack segment,48,LINK的使用示例(续),C LINK HELLO 缺省的扩展名是OBJ Microsoft(R)8086 0bject Linker Version 3.05 Copyright(C) Microsoft Corp 1983,1984 1985. All ri
26、ghts reserved. Run File HELLO. EXE:;按分号键,缺省项按缺省设置处理,可执行文件HELLO. EXE,不生成定位图文件,不使用库。 C LINK HELLO; C LINK TESTl+TEST2,TEST; C LINK TESTl TEST2,ABC,GHI,DEF 上述命令把主目标代码模块TESTl. OBJTEST2OBJ与库DEF. UB内的函数(过程)连接,生成的可执行程序文件存放在文件ABCEXE中,生成定位图文件GHI. MAP;,49,二、调试器( DEBUG)的使用,每个版本的DOS都带有动态调试器。原因是DEBUG不仅是动态调试器,也是二
27、进制文件编辑器,还是简单的系统维护工具。DEBUG能提供一个动态调试程序的环境,程序员利用这个环境,可方便地调试目标代码程序,50,1启动和退出DEBUG,DEBUG是DOS的一个外部命令 1)启动格式如下: DEBUG 文件标识符参数表 文件标识符必须指定一个文件,也只能指定一个文件。 DEBUG根据文件标识符中的后缀是EXE还是.COM判定被调试程序的类型 其他类型的文件被认为是数据文件。 示例: C DEBUG HELLOEXE 2)退出DEBUG :在DEBUG提示符下发出退出命令Q即可,51,2命令一览,52,命令一览(续),53,(2)通用说明,DEBUG接受和显示的数都用十六进制表示。 命令都是一个字母,命令参数随着命令而异。 命令和参数可以用大写或小写字母或混合方式输入。 命令和参数间,可以用定界符分隔(空格、制表符、逗号等)。但是,定界符只是在 两个相邻接的十六进制数之间是必需的。因此下面的命令
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/TR 25295:2025 EN Footwear - Global last measurement systems
- 【正版授权】 ISO/IEC 9594-5:2020/Amd 1:2025 EN Information technology - Open systems interconnection - Part 5: The Directory: Protocol specifications - Amendment 1: Miscellaneous enhance
- 【正版授权】 ISO 12628:2022/Amd 1:2025 EN Thermal insulating products for building equipment and industrial installations - Determination of dimensions,squareness and linearity of prefo
- 2025年投资项目管理师之宏观经济政策题库附答案(典型题)
- 2020-2025年劳务员之劳务员基础知识强化训练试卷A卷附答案
- 圆的面积课件教学
- 第五章气相色谱分析法第二节气相色谱仪76课件
- 第六章反应器第三节管式反应器55课件
- 书法教学指导课件下载
- 儿童烘焙课堂教学课件
- 【真题】江苏省苏州市2025年中考物理试卷(含答案解析)
- 卡口及道路交通智能监控系统方案设计
- 呼吸机相关性肺炎的预防和护理
- 肺结核鉴别诊断
- 门诊口腔院感基础知识培训
- 论咏叹调《妈妈不在》的形象刻画与唱段处理
- 2025年邮政社招笔试考试历年真题及答案
- 2025年河南省中考数学试卷及答案
- 仓库技能考试试题及答案
- 六上科学知识点总结
- Q∕GDW 12127-2021 低压开关柜技术规范
评论
0/150
提交评论