高级汇编语言程序设计.ppt

上传人:za****8 文档编号:14567128 上传时间:2020-07-24 格式:PPT 页数:89 大小:205.51KB
返回 下载 相关 举报
高级汇编语言程序设计.ppt_第1页
第1页 / 共89页
高级汇编语言程序设计.ppt_第2页
第2页 / 共89页
高级汇编语言程序设计.ppt_第3页
第3页 / 共89页
点击查看更多>>
资源描述
1,封面,2,第五章高级汇编语言程序设计,第五章 高级汇编语言程序设计 5.1 高级语言特性 5.2 宏结构程序设计 5.3 模块化程序设计 5.4 输入输出程序设计 本章重点及习题分析,MASM 6.X 新特性,3,5.1 高级语言特性,5.1 高级语言特性 通过引入一些伪指令,使汇编语言程序设计具有高 级语言程序设计的特性,即可以采用类似高级语言的形 式设计分支、循环和子程序结构,大大减轻了使用汇编 语言编程的工作量。 5.1.1 条件控制伪指令 5.1.2 循环控制伪指令 5.1.3 过程声明和调用伪指令,返回第五章,4,5.1.1 条件控制伪指令,5.1.1 条件控制伪指令 .IF/.ELSEIF/.ELSE/.ENDIF:类似高级语言的 IF/THIN,ELSE和ENDIF的相应功能。汇编时展开,自动 生成相应的比较和条件转移指令,实现分支结构。 .IF 条件表达式 ;条件为真,执行分支体1 分支体1 .ELSEIF 条件表达式 ;前面IF及前面ELSEIF为假, 分支体2 ;当前条件为真,执行分支体2 .ELSE ;前面IF及前面ELSEIF为假, 分支体3 ;执行分支体3 .ENDIF ;分支结束,5,条件控制伪指令,不考虑多层嵌套,有4种基本格式 .IF 条件表达式 ;条件表达式为真,执行 分支体 ;分支体,否则执行后面 .ENDIF ;语句 .IF 条件表达式 分支体1 .ELSE 分支体2 .ENDIF ;分支体1、2必做其一,6,条件控制伪指令,.IF 条件表达式 分支体1 .ELSEIF 条件表达式 分支体2 ;分支体1和分支体2可能 .ENDIF ;都不做 .IF 条件表达式 ;条件为真,执行分支体1 分支体1 .ELSEIF 条件表达式;前面IF及前面ELSEIF, 分支体2 ;为假当前条件为真,执行分支体2 .ELSE ;前面IF及前面ELSEIF为假, 分支体3 ;执行分支体3 .ENDIF ;分支结束,7,条件表达式的三个问题,三个问题: 1.关于条件表达式中的操作符 2.条件表达式举例 3.条件表达式中的有符号数和无符号数的规定,8,1.关于条件表达式中的操作符,1.关于条件表达式中的操作符 1)表5.1列出的操作符用于伪指令的条件表达式, 第三章介绍的操作符用于数值表达式和地址表达式 (构成指令的操作数),两类操作符不可混淆。例如 表示相等,条件表达式用“=”,数值表达式用“EQ”; 表示逻辑与,条件表达式用“寄存器不为0,条件为真;为0,条件为假 .if al dec al .endif mem ;存储器不为0,条件为真;为0,条件为假 .if byte ptrbx dec al .endif carry? / overflow? 位测试操作符使用格式: 数值表达式 只有1个参数,Mov ax , bx ;只有1个参数,Maxnum 3, 4 ;有2个参数,Mov ax, 3 Cmp ax, 4 Jge ?0000 Mov ax, 4 ?0000:,43,/4,宏调用: 汇编结果:,Maxnum n1, n2, n3 ;有3个参数,mov ax, n1 cmp ax, n2 jge ?0000 mov ax, n2 ?0000: cmp ax, n3 jge ?0001 mov ax, n3 ?0001:,注意区别 条件控制伪指令 和 条件汇编伪指令,44,P149例题/1,P149例题:用宏结构实现信息显示。 dstringMACRO string;定义字符串 db 显示,形参为偏移地址 mov dx,offset message mov ah,09h int 21h ENDM,45,/2,mainendMACRO retnum;返回DOS,可不带参数 ifb ;宏调用没有实参数 mov ah,4ch else ; 有参数 mov ax,4c00h+(retnum AND 0ffh) endif int 21h ENDM,保证不破坏AH的内容,46,/3,.model small .stack 256 .data msg1 equ this byte dstring msg2 equ this byte dstring .code start:mainbegin data ;建立DS内容 dispmsg msg1 ;显示msg1字符串 dispmsg msg2 ;显示msg2字符串 mainend ;返回DOS end start,回 5.2,返回第五章,47,5.3 模块化程序设计,5.3 模块化程序设计 开发大型或较复杂的程序时,往往需要结合使用其 他方法,如源程序文件的包含、目标代码文件的连接、 子程序库的使用等等。 本节简单介绍以上三种方法。 5.3.1 源程序文件的包含 5.3.2 目标代码文件的连接 5.3.3 子程序库的使用,返回第五章,48,5.3.1 源程序文件的包含,5.3.1 源程序文件的包含 对大型源程序,可以分成几个源文件,待汇编时在 用包含伪指令INCLUDE将它们结合成一个文件进行汇编。 格式为:INCLUDE 文件名 汇编时,汇编程序将指定的文件插在伪指令所在的 位置,与其他部分同时汇编。 适用于:汇集常用的子程序为一个源文件(.asm); 汇集常用的宏定义为一个宏库文件(.mac); 汇集常用的常量定义和声明为一个包含文件(.inc)。 当源程序需要使用上述文件中的某些内容时,不用 重新编写,只要使用包含伪指令将文件包含即可。,49,例5.12a,例5.12a 利用源程序包含的方法实现将输入的数据 按升序输出。 要求:最多输入100个无符号字节数据;以十六进制 形式输入;按照升序排序并显示。 源程序由三个单独的文件组成: 宏库文件 lt512a.mac(显示字符和字符串) 子程序文件 sub512a.asm(输入、排序) 主程序文件 lt512a.asm(提供入口参数、处理 出口参数、排序、显示),50,宏库文件 lt512a.mac,1)宏库文件 lt512a.mac dispcharmacro char ;显示char字符 mov dl,char mov ah,2 int 21h endm dispmsgmacro message;显示message字符串 mov dx,offset message mov ah,9 int 21h endm,51,子程序文件 sub512a.asm,2)子程序文件 sub512a.asm 子程序源文件有3个子程序 ALdisp;显示2位16进制数子程序(例4.10) sorting;排序子程序(例4.8) input;键盘输入子程序(后面分析) 还包含一个宏 convert;将DX两位ASCII码转换为两位16进制数,52,主程序文件 lt512a.asm,3)主程序文件 lt512a.asm include lt421a.mac ;包含宏库文件,置于主程 .model /.stack /.data / .code等 序头部 dispmsg msg1 ;提示输入数据 mov bx,offset buf call input ;数据输入 cmp cx,0 je start4 ;没有输入数据则退出 mov count,cx . ;显示输入的数据 . ;数据排序 . ;显示经排序后的数据 start4:.exit 0 include sub421a.asm ;包含子程序文件 end,将三个文件分别编辑,主程序文件用两条包含伪指令将宏库文件和子程序文件包含(注意包含伪指令的位置),然后汇编并连接主程序文件,即可得到可执行文件。,53,键盘输入子程序/1,键盘输入子程序: ;每次输入1位或2位 十六进制数字; ;空格或逗号确认输入; ;退格键删除当前输入 的数据; ;回车表示所有数据 输入结束。 ;入口参数:ds:bx= 存放数据的缓冲区 ;出口参数:cx= 数据个数,54,/2,inputproc push ax push dx xor cx,cx ;数据个数清0 input01:xor dx,dx;输入字符清0 input02:mov ah,1 ;键盘输入一个字符 int 21h,55,/3,input10:cmp al,0dh je input30 ;是回车,结束整个数据的输入 cmp al, je input20 cmp al, je input20 ;是空格和逗号,确认输入了一个数据 cmp al,08h je input17 ;是退格,丢弃本次输入的数据,出错,56,/4,cmp al,0;有效数字判断(图5.2b) jb input17;小于0,不是有效数字,出错 cmp al,f ja input17;大于f,不是有效数字 cmp al,a jb input11 ;检查是否再aF之间 sub al,20h;af转换成大写AF jmp input12 ;有效数据处理 input11:cmp al,F ja input17;字符小于a、大于F,出错 cmp al,A jae input12;是AF,有效字符 cmp al,9 ja input17;字符小于A、大于9,出错,57,/5,input12:cmp dl,0;有效字符的处理 jne input13 ;dl0(已经有一位数据) mov dl,al ;dl=0,输入了一个数据的高位,则dlal jmp input02;转到字符输入 input13:cmp dh,0 jne input17 ;dl0,dh0输入3位数据,出错 mov dh,dl ;dl0,dh0输入了一个数据的低位 mov dl,al;dhdl,dlal jmp input02;转到字符输入,58,/6,input17:mov dl,7;输入错误处理(07h,控制码:鸣镝) mov ah,2 int 21h mov dl,? mov ah,2 int 21h jmp input01;转到输入一个数据,59,/7,;确认一个数据后,转换正确的输入数据(图5.2c) input20:convert jmp input01;转到输入一个数据 ;收到回车符,最后一个数据输入结束,转此 input30:convert pop dx pop ax ret;返回,出口参数已设定 inputendp,60,宏:convert macro/1,;将DX两位十六进制形式的ASCII码转换为两位16进 制数(8位二进制数): convertmacro local input21,input22 local input24,input25 cmp dl,0 je input25 ;dl=0,没有要转换的数据,退出,61,/2,cmp dl,9 jbe input21 sub dl,7 ;字符AF,则减7 input21:and dl,0fh ;转换低位 cmp dh,0 ;dh=0,没有高位数据 je input24 cmp dh,9 jbe input22 sub dh,7 ;字符AF,则减7 input22:shl dh,1 ;高位乘16 shl dh,1 shl dh,1 shl dh,1 ;转换高位 or dl,dh ;合并高、低位,62,/3(end),input24:mov bx,dl ;存入缓冲区 inc bx inc cx ;数据个数加1 input25: endm,Back5.3,63,5.3.2目标代码文件的连接,5.3.2 目标代码文件的连接 将常用子程序写成一个或多个源文件,并对其进行 汇编,得到一个个单独的OBJ文件;对主程序也单独进行 汇编得到OBJ文件,最后利用连接程序把多个OBJ文件连 接,形成可执行文件。 用这种方法可缩短汇编时间,但宏结构文件、常 量定义、声明文件等文件通常仍编辑成包含文件,因此 这种方法往往和“源程序文件的包含”共同使用。 需要遵循的原则: 声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题,64,/原则1,原则1 各个模块间公用的变量、过程等要说明 PUBLIC 标识符 ,标识符. ;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型. ;调用标识符的模块使用 标识符是变量名、过程名等 类型是byte / word / dword(变量)或near / far (过程) 在一个源程序中,public/extern语句可以有多条 各模块间的public/extern伪指令要互相配对,并且指 明的类型互相一致,65,/原则2,原则2 子程序文件必须定义在代码段中,也可以具有局部的数 据变量 采用简化段定义格式,只要采用相同的存储模式,容易 实现正确的近或远调用 完整段定义格式中,为了实现模块间的段内近调用 (near类型),各自定义的段名、类别必须相同,组合 类型都是public。实际的程序开发中,各个模块往往由 不同的程序员完成,不易实现段同名及类别相同,所以 索性定义成远调用(far类型) 定义数据段时,同样也要注意这个问题。当各个模块的 数据段不同时,要正确设置数据段DS寄存器的段基地址。,66,/原则3,原则3 少量参数可用寄存器或堆栈直接传送数据本身 大量数据可以安排在缓冲区,用寄存器或堆栈传送数据 的存储地址 还可利用变量传递参数,但是要采用public/extern声 明为公共(全局)变量 这些也是子程序间的参数传递方法 另外,更好的传递参数方法是用堆栈传递参数。,67,例5.12b,例5.12b 利用目标代码文件连接的方法,实现将输 入的数据按升序输出。 宏定义并入主程序lt512b.asm。 子程序文件sub512b.asm,要加上段定义语句、声明语 句等,但不需要起始点和结束点。 模块连接的操作步骤: 分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件,形成可执行文件,68,例5.12b主程序,例5.12b 主程序: .;宏定义(也可以使用包含语句) .code public count;定义(本模块的)count公用 extern ALdisp:near,sorting:near,input:far ;声明其他模块中的子程序 .startup . .exit 0 ;去掉(lt512a.asm中的)包含语句 end,69,例5.12b子程序(end),例5.12b子程序 .model small ;定义同样的存储模式 extern count:word ;在其他模块定义了字变量count .code ;子程序在代码段中 public aldisp,sorting,input ;3个子程序是共用的 Aldispproc ;仍然作为近调用 sortingproc ;仍然作为近调用 inputproc far ;修改为远调用 . mov count,cx ;提供出口参数 . inputendp end ;结束汇编,Back5.3,70,5.3.3 子程序库的使用,5.3.3 子程序库的使用 将子程序源文件生成OBJ文件,然后和主程序连接, 由于被连接的每个OBJ文件的全部代码都会成为可执行程 序的一部分,在最后生成的可执行文件中,会包括无用 的子程序,造成可执行程序庞大。为此,可使用子程序 库。子程序库(.LIB文件)是子程序模块的集合,库文 件中存放着各子程序的名称、目标代码以及有关的定位 信息。执行连接程序时,只要指定所需要的库文件,连 接程序将从库文件中摘取主程序调用的子程序,而未调 用的子程序不会进入最后的可执行程序。 库文件由MASM提供的LIB.EXE程序管理。,71,例题5.12c/1,例题5.12c 利用子程序库的调入方法,实现将输入 的数据按升序输出。 实现步骤: 1)编辑4个文件: 主程序文件 lt512c.asm 子程序文件 sub512c1.asm(显示) 子程序文件 sub512c2.asm(排序) 子程序文件 sub512c3.asm(输入),72,例题5.12c/2,2)分别汇编,得到4个目标模块(obj文件) 3)生成子程序库文件(或加入其它子程序库) LIB 库文件名 + 子程序目标文件名 LIB sub512c.lib + sub512c1.obj + sub512c2.obj + sub512c3.obj 4)运行连接程序:link lt512c.obj 提示输入库文件时,输入sub512c.lib ( 也可在主程序源文件中使用子程序库包含伪 指令includelib sub512c.lib 。),73,例题5.12主程序,例题5.12主程序 .;宏定义 .code Extern ALdisp:near,sorting:near,input:near ;声明其他模块中的子程序 .startup . call input . .exit 0 end,74,sub512c1.asm,sub512c1.asm .model small .code public aldisp Aldispproc . Aldispendp end,75,sub512c2.asm,sub512c2.asm .model small .code public sorting sortingproc . sortingendp end,76,sub512c3.asm(end),sub512c3.asm .model small .code public input inputproc . inputendp end,Back5.3,返回第五章,77,5.4输入输出程序设计,5.4 输入输出程序设计 完成CPU与外设端口之间数据传送的程序称为输入输 出程序。 通常有3种端口,数据口、状态口以及控制口,分别 对应接口中的数据寄存器、状态寄存器以及控制寄存器。 每个端口有一个端口地址,CPU使用该地址访问接口中的 相应寄存器,执行输入输出的指令为IN指令和OUT指令。 输入输出(数据交换)的方式分为两大类:程序控 制输入输出方式和直接存储器存取方式(DMA方式)。 由于该部分内容是微机原理和接口技术的主要 内容之一,本节只进行简单介绍。,返回第五章,78,数据交换方式,79,1.无条件传送方式,1.无条件传送方式 CPU可以在任何时刻向端口写入数据和从端口读入数 据,也就是说,CPU假设外设接口电路总是处于准备好的 状态。采用无条件传送方式,只适用于简单外设(或定 时关系以知的外设),如输出设备为数码显示电路,或 输入设备为一组提供某种数据的开关,在这种情况下, CPU执行输出或输入操作不需要任何先决条件。 无条件传送方式局限性比较大,对大部分外设不适 用,因而采用较少。,80,2.查询方式,2.查询方式 CPU在执行输入输出操作时,先查询外设的状态口, 当状态口表示外设已准备好时,CPU执行输入输出操作; 当状态口反映外设未准备好时,CPU继续查询状态口,直 到外设准备好,再执行输入输出操作。,查询方式适用于大部分外设,但CPU的利用率较低。,81,3.中断传送方式,3.中断传送方式 中断传送方式基于计算机的中断控制系统。当外设 准备好传送数据时,向CPU发出中断请求,如有关条件满 足,则CPU响应中断请求,执行相应中断服务程序,完成 数据的输入或输出,然后继续执行原来的程序。 中断传送方式相对查询方式,可提高CPU的利用率。 以上三种传送方式虽然各不相同,但有一点是相同 的,即通过CPU执行输入输出程序实现数据的传送,因而 数据传输率低,要得到高数据传输速率,应采用直接存 储器存取方式,即DMA方式,用DMA控制器控制数据的传 输过程。,返回第五章,回 5.4,82,本章重点及习题分析,本章重点及习题分析 本章重点 条件控制伪指令 循环控制伪指令 带参数的过程定义、声明及调用伪指令 宏结构的定义及宏调用 重复汇编伪指令 条件汇编伪指令,83,5.1,习题分析 5.1条件表达式中逻辑与“&”表示两者都为真,整个 条件才为真,对于程序段: .if (X=5)&(AX!=BX) INC AX .endif 用转移指令实现上述分支结构,并比较汇编程序生成的 代码序列。 cmp x,5 cmp x,005h jnz n1 jne c0001 cmp ax,bx cmp ax,bx jz n1 je c0001 inc ax inc ax N1: c0001:,84,5.2,5.2条件表达式中逻辑或“|”表示两者之一为真,整 个条件就为真,对于程序段: .if (X=5)|(AX!=BX) INC AX .endif 用转移指令实现上述分支结构,并比较汇编程序生成的 代码序列。 cmp x,5 cmp x,005h jz n1 je c0002 cmp ax,bx cmp ax,bx jnz n1 je c0001 jmp n2 c0002: inc ax N1: inc ax c0001: N2: ,85,5.3,5.3 对于程序段 .whileax!=10 mov bx,ax inc bx inc bx inc ax .endw 用处理器指令实现上述循环结构,并与汇编结果比较。 lop:cmp ax,10 jmp c0001 jz next c0002: mov bx,ax mov bx,ax inc bx inc bx inc bx inc bx inc ax inc ax c0001: cmp ax,00ah jmp short lop jne c0002 next: ,86,5.4,5.4 对于程序段 .repeat mov bx,ax inc bx inc bx inc ax .until ax=10 用处理器指令实现上述循环结构,并与汇编结果比较。 lop: mov bx,ax c0001: mov bx,ax inc bx inc bx inc bx inc bx inc ax inc ax cmp ax,10 cmp ax,10 jnz lopjne c0001,87,5.55.7,5.5 宏是如何定义、调用和展开的? 5.6 宏定义中的形参有和特点?是如何进行形参和 实参结合的? 5.7 宏汇编、重复汇编与条件汇编有何异同? 都是伪指令,都是在汇编时处理。 宏汇编适用于多次使用的程序段;重复汇编适用于 连续重复适用的语句;条件汇编适用于根据条件是否符 合,最终程序应包含的语句。,88,5.10,5.11,5.10 定义一个宏logical,代表4条逻辑运算指令: And/or/xor/test。 logical macro scode,sdest,ssorce scode sdest,ssorce endm 宏调用:logical and,ax,bx logical xor,al,80h 5.11 修改logical,将neg指令包括进去。 logical macro scode,sdest,ssorce ifnb scode sdest,ssorce else scode sdest endif endm 宏调用:logical neg,bx logical neg,byte ptrbx,89,5.12,5.12 编写一个宏指令 move doprnd,soprnd,实现任 意寻址方式的字量源操作数送到目的操作数,包括存储 单元到存储单元的传送功能。 movemacro doprnd,soprnd push ax mov ax,soprnd mov doprnd,ax pop ax endm 宏调用:move ax,cx move bx,bx+si,end,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!