欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第6章汇编语言程序设计.ppt

    • 资源ID:2551417       资源大小:574.01KB        全文页数:107页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第6章汇编语言程序设计.ppt

    第6章 汇编语言程序设计,6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为EXE的可执行文件,称为EXE文件的编程格式;另一种格式可以生成扩展名为COM的可执行文件,称为COM文件的编程格式。 6.1.1 EXE文件的编程格式 EXE文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64KB,适合于编写大型程序。,开 始,6.1.2 COM 文件的编程格式 COM文件的编程格式必须必须符合以下规定: (1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段; (2)程序使用的数据,可以集中设置在代码段的开始或末尾; (3)在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令; (4)代码段目标小于64KB。,6.1.3EXE文件和COM文件的内存映像 EXE文件包括两部分:一部分为装入模块,另一部分为“重定位信息”。调入后生成PSP(程序段前缀) DOS自动给DS,ES,FS和GS赋值,使DS=ES=存放PSP的段基址,FS=GS=0,并使CS:IP用户程序的启动地址,SS:SP指向用户堆栈段的栈顶,在这以后,DOS才把控制权交给用户程序。 COM文件没有重定位信息,因此比EXE文件的体积小的多。DOS装载COM文件时,也生成PSP,然后从偏移地址100H开始依次存放用户程序。DOS自动赋值使CS=DS=ES=SS=PSP段基址,FS=GS=0,并使IP=100H,SP=FFFEH。,6.1.4 程序段前缀 6.1.5返回DOS的其他方法 对于COM文件有三种方法: (1)直接执行INT20H; (2)调用INT21H的0号功能。 (3)执行RET指令 对于EXE文件: (1)调用INT 21H的4CH功能 (2)执行INT 20H,首先把执行过程包含在一个远过程中; 其次在给DS赋值前,用3条指令把PSP首单元的物理地址压入栈顶,即:PUSH DS MOV AX,0 PUSH AX,最后程序在需要返回DOS的地方执行一条RET指令。 6.1.6 源程序堆栈段的设置,对8086系列机来说,MS-DOS操作系统是最主要的操作系统。MS-DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COMMAND.COM。 DOS系统功能调用的方法一般可分为以下几步: 设置所要调用功能的入口参数。 在AH寄存器中存入所要调用功能的功能号。 INT 21H指令自动转入中断子程序入口。 相应中断子程序运行完毕,可按规定取得出口参数。,返回本节,6.2 DOS系统功能调用,6.2 常用的DOS系统功能调用,1单字符输入(1号调用) 2单字符显示(2号调用) 3打印输出(5号调用) 4结束调用(4CH号调用) 5显示字符串(9号调用) 6字符串输入(10号调用),1单字符输入(1号调用) 格式:MOV AH,1 INT 21H 功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。 2单字符显示(2号调用) 格式:MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 功能:将DL寄存器中的字符送显示器显示,如果DL中为CTRL+BREAK的ASCII码,则退出。,3打印输出(5号调用) 格式:MOV DL,待打印字符的ASCII码 MOV AH,5 INT 21H 功能:将DL寄存器中的字符送打印机打印。 4结束调用(4CH号调用) 格式:MOV AH,4CH INT 21H 功能:终止当前程序并返回调用程序。,5显示字符串(9号调用) 格式:LEA DX,待显示字符串首偏移地址 MOV AH,9 INT 21H 功能:将当前数据区中以结尾的字符串送显示器显示。 6字符串输入(10号调用) 格式:LEA DX,缓冲区首偏移地址 MOV AH,10 INT 21H 功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。,DATA SEGMENT STR DB 0DH,0AH,Example of string display! DATA ENDS STACK SEGMENT STACK DB 100 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,【例3.25】若要在屏幕上显示字符串“Example of string display!”,则程序如下:,BEGIN: MOV AX ,DATA MOV DS,AX LEA DX,STR MOV AH ,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEGIN,返回本节,综合举例,【例3.27】已知一数据段中的数据为: DATA SEGMENT A DW M BUF DB AB,0DH,0AH C EQU 500H B DW 0FFAAH D DD BUF M DB 2DUP(1) ,2DUP(2,B) DATA ENDS 请画出该数据段数据存储的形式。,返回本章首页,该数据段在主存中的存储形式如左图所示。,DATA SEGMENT NUM DB 01000101B BUF DB 0DH,0AH,(NUM)= STR DB 4 DUP(?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE,【例3.28】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。,START: MOV AX,DATA MOV DS,AX LEA DI,STR MOV AL,NUM MOV CL,4 SHR AL,CL OR AL,30H MOV DI,AL INC DI MOV AL,NUM AND AL,0FH OR AL,30H MOV DI,AL,INC DI MOV BYTE PTR DI,H INC DI MOV BYTE PTR DI, LEA DX,BUF MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,DATA SEGMENT INFO1 DB 0DH,0AH,INPUT STRING: INFO2 DB 0DH,0AH,OUTPUT STRING: BUFA DB 81 DB ?,【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。,DB 80 DUP(0) BUFB DB 81 DUP(0) DATA ENDS STACK SEGMENT DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX,LEA DX,INFO1 MOV AH,9 ; 9号调用,显示输入提示信息 INT 21H LEA DX,BUFA MOV AH,10; 10号调用,键盘输入字符串到缓 冲区BUFA INT 21H LEA SI,BUFA+1 MOV CH,0 ; 取字符长度CX MOV CL,SI ADD SI,CX ;SI 指向字符串尾部 LEA DI,BUFB ;DI指向字符串变量BUFB,NEXT: MOV AL,SI MOV DI,AL DEC SI INC DI LOOP NEXT MOV BYTE PTR DI, LEA DX,INFO2 MOV AH,9; 9号调用,显示输出 提示信息 INT 21H,LEA DX,BUFB MOV AH,9 ;反向显示字符串 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,返回本节,6.3 BIOS键盘输入功能调用 调用模式: MOV AH,功能号 设置入口参数 INT n 分析出口参数 BIOS键盘输入功能使用INT 16H 1 功能号00H:读取键入的一个字符,无回显,响应CTRL_C,无键入则等待。 入口参数:无 出口参数:AL=输入字符的ASCII码 2 功能号01H:查询键盘缓冲区 入口参数:无 出口参数:Z=0,表示有键入,否则无键入,3 功能号02H:读取当前转换状态 入口参数:无 出口参数:AL=键盘状态字(P94) 4 功能号10H:读扩展键盘,无回显,响应CTRL_C。 入口参数:无 出口参数:同00H 5 功能号11H:查询键盘缓冲区 6 功能号12H:读取扩展键盘的转换状态。,6.4 文本方式BIOS屏幕功能调用 6.4.1 显示器 6.4.2 文本方式BIOS屏幕调用 调用指令 INT 10H 1 功能号00H:设置屏幕显示方式 2功能号01H:设置光标形状 3功能号02H:预置光标位置 4功能号03H:读取光标的当前位置 5功能号05H:设置当前显示页 6功能号06H:窗口上滚 7功能号07H:窗口下滚 8功能号08H:读取光标所在位置的字符及其属性 9功能号09H:从光标所在位置开始,显示若干个相同的字符,10功能号0AH:从光标所在位置开始,显示若干个相同的字符 11功能号0EH:显示一个字符 12功能号13H:显示字符串,6.5 程序设计方法,1 概述 2 顺序程序设计 3 分支程序设计 4 循环程序设计 5 子程序设计 6 模块化程序设计 7 高级汇编语言技术,开 始,1 概述,(1) 汇编语言程序设计的一般步骤 (2) 流程图,返回本章首页,程序设计方法,汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤: 1分析问题,确定算法 2绘制流程图 3根据流程图编制程序 4调试程序,返回本节,流程图,1流程图的概念 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示 (1)起止框:表示程序的开始和结束。,起止框,(2)判断框,(3)处理框,(4)调用框,(5)指向线,(6)连接框,返回本节,2 顺序程序设计,下面举例说明顺序程序的设计。 【例4.1】试编写一程序计算以下表达式的值。 =(v-(*+-540)/x 式中x、v均为有符号字数据。 设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图4.1所示。,返回本章首页,图4.1 顺序运算程序流程图,源程序如下: DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP(?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,START: MOV AX,DATA MOV DS,AX ;DATAAX MOV AX,X IMUL Y ;(X)*(Y)DX:AX MOV CX,AX MOV BX,DX ;(DX:AX)(BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540(BX:CX) MOV AX,V,CWD ;(V)符号扩展 SUB AX,CX SBB DX,BX;(DX:AX)-(BX:CX)(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商W MOV W+2,DX ;余数DXW+2 MOV AH,4CH INT 21H CODE ENDS ;退出DOS 状态 END START,【例4.2】,【例4.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:,STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 80,85,86,71,79,96 DB 83,56,32,66,78。84 NO DB 10 ENGLIST DB? DATA ENDS CODE SEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODE BEGIN: MOV AX,DATA MOV DS ,AX LEA BX,TAB MOV AL,NO DEL AL XLAT TAB MOV ENGLISH,AL MOV AH,4CH INT 21H CODE ENDS END BEGIN,6.5 分支程序设计,(1) 用条件转移指令实现程序分支 (2) 用跳转表实现多路分支,返回本章首页,(1) 用条件转移指令实现程序分支,【例4.3】编写计算下面函数值的程序: 1 X0 Y= 0 X=0 -1 X 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。 程序如下:,DATA SEGMENT X DB -10 Y DB ? DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA,MOV DS,AX CMP X,0 ;与0进行比较 JGE A1 ;X0转A1 MOV Y,-1 ;X 0时,-1Y JMP EXIT A1: JG A2 ;X0转A2 MOV Y,0 ;X=0时,0Y JMP EXIT A2: MOV Y,1 ;X0,1Y EXIT: MOV AH,4CH INT 21H CODE ENDS END START,MOV DS,AX CMP X,0 ;与0进行比较 JGE A1 ;X0转A1 MOV Y,-1 ;X 0时,-1Y JMP EXIT A1: JG A2 ;X0转A2 MOV Y,0 ;X=0时,0Y JMP EXIT A2: MOV Y,1 ;X0,1Y EXIT: MOV AH,4CH INT 21H CODE ENDS END START,图4.2 分支运算程序流程图,【例4.4】,【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。 设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示,图4.3 例4.4程序流程图,程序如下: STAC SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT X DW 00ABH Y DW 5 Z DW 200 MAX DW ? DATA ENDS CODE SEGMENT,ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AX,X CMP AX,Y ;XY? JG L1 MOV AX,Y ;YZ? CMP AX,Z JG EXIT L2: MOV AX,Z JMP EXIT,L1: CMP AX,Z ;XZ? JLE L2 EXIT: MOV MAX,AX MOV AH,4CH INT 21H CODE ENDS END START,返回本节,(2) 用跳转表实现多路分支,【例4.5】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。 程序流程如图4.4所示。,程序如下: DATA SEGMENT TAB DW P1,P2,P3,P4,P5,P6,P7,P8 N DB 5 DATA ENDS STACK SEGMENT DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE,START: MOV AX,DATA MOV DS,AX MOV AL,N DEL AL ADD AL,AL MOV BM,AL MOV BH,0 JMP TABBX,P1: JMP EXIT P2: JMP EXIT P2: JMP EXIT P3: ,JMP EXIT P8: EXIT: MOV AH,4CH INT 21H CODE ENDS END START 上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。,返回本节,6.6 循环程序设计,6.1 循环程序的结构 6.2 单重循环程序设计 6.3 多重循环程序设计,返回本章首页,6.6 循环程序的结构,1初始化部分 2循环体部分 3循环控制部分,循环程序的常见结构形式如图4.5(a)、(b)所示。,返回本节,一、单重循环程序设计,1计数控制 2条件控制,1计数控制,【例4.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。 显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图4.6所示。,图4.6 程序流程图,【例4.8】,【例4.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示MATCH!,若不相同则显示NO MATCH!。(程序略) 其流程图如图4.7所示。,图4.7 程序流程图,【例4.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。 其流程图如图4.8所示。,2条件控制,程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK EDNS DATA SEGMENT BUF DW 0011110010101011B COUNT DB ? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK,START: MOV AX,DATA MOV DS,AX MOV AX,BUF MOV CL,0 ;计数器为0 COPA: AND AX,AX JE EXIT ;(AX)=0,结束循环 SHL AX,1 ;AX 左移一位 JNC LOPA INC CL ;产生进位,(CL)+1CL JMP LOPA EXIT: MOV COUNT,CL MOV AH,4CH INT 21H CODE ENDS END START,返回本节,二、多重循环程序设计,【例4.10】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。 我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。,数 10 8 16 90 32 第一遍 10 16 90 32 8 第二遍 16 90 32 10 8 第三遍 90 32 16 10 8 程序流程图如图4.9所示。,程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20 N=(-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,START: MOV AX,DATA MOV DS,AX MOV CX,N DEC CX LOOP1: MOV DX,CX MOV BX,0 LOOP2: MOV AX,BUFBX CMP AX,BUFBX+2 JGE L XCHG AX,BUFBX+2 MOV BUFBX,AX,L: ADD BX,2 DEC CX JNE LOOP2 MOV CX,DX LOOP LOOP1 MOV AH,4CH INT 21H CODE ENDS END START,程序运行后,BUF区中的内容如下: 20,9,7,6,3,2,0,-4,-8,-9,-10 若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。,返回本节,6.7 子程序设计,1 子程序的概念 2 子程序的定义 3 子程序设计方法 4 子程序应用举例 5 子程序的嵌套与递归调用,返回本章首页,1 子程序的概念,在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。,返回本节,2 子程序的定义,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下: 过程名 PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。 一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,返回本节,3 子程序设计方法,(1) 信息的保护与恢复 (2) 主程序与子程序参数传递方式,(1) 信息的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。 PROG PROC PUSH AX PUSH BX PUSH CX ;保护现场 PUSH DX , POP DX POP CX POP BX ;恢复现场 POP AX RET ;返回断点处 PROC ENDP,(2) 主程序与子程序参数传递方式,(1)寄存器法 (2)约定内存单元单元法 (3)堆栈法,返回本节,4 子程序应用举例,【例4.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。,入口参数:DX存放待转换的二进制数 CX存放待转换数的位数(8位或16位) DI存放ASCII码首地址 出口参数:转换后的字符串存放在以DI作指针的字节存贮区中 程序如下: DATA SEGMENT NUM8 DB 93H NUM16 DW 0ABCDH ASCBUF DB 20 DUP(0) DATA ENDS,CODE SEGMENT ASSUME DS:DATA,CS:CODE, SS:STACK START: MOV AX,DATA MOV DS,AX MOV DX,0 MOV DL,NUM8 ;转换二进制数送DX MOV CX,8 ;置位数8 LEA DI,ASCBUF ;字符串首址DI CALL BTASC ;调用子程序BTASC MOV DI,BYTE PTR 0DH MOV DI+1,BYTE PTR 0AH,MOV DI+2,BYTE PTR $ LEA DX,ASCBUF MOV AH,9 INT 21H MOV DX,NUM16 MOV CX,16 ;置位数16 LEA DI,ASCBUF CALL BTASC MOV DL,BYTE PTR 0DH MOV DL+1,BYTE PTR 0AH MOV DL+2,BYTE PTR ; 显示转换后的字符串 LEA DX, ASCBUF MOV AH,9 INT 21H,BTASC PROC PUSH AX ;保存AX MOV AL,0 CMP CX,8 ;比较8位数 JNE L1 ;直接转换16位数 MOV DH,DL ;8位数转换送DH L1: ROL DX,,1 ;DX最高位移入CF RCL AL,1 ;CF移入AL最低位 ADD AL,30H MOV DI,AL,INC DI LOOP L1 POP AX RET BTASC ENDP CODE ENDS END START,返回本节,5 子程序的嵌套与递归调用,1子程序的嵌套 子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。 2子程序的递归调用 子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。,【例4.15】,【例4.15】试编制计算N! (N0)的程序。N!=N*(N-1)*(N-2)*1 其递归定义如下: 0!=1 N!=N*(N-1)! (N1) 计算N!的子程序FACT的流程图如图4.10所示。,【例4.16】计算5!的程序示例, RESULT是保存阶乘的存储单元。 程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT N DW 5 RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK,DS:DATA,START: MOV AX,DATA MOV DS,AX MOV AX,N CALL FACT MOV AX,RESULT MOV AH,4CH INT 21H FACT PROC CMP AX,0 JNE L1,MOV RESULT,1 JMP EXIT L1: PUSH AX DEC AX CALL FACT POP AX MOV RESULT MOV RESNLT,AX EXIT: RET FACT ENDP CODE ENDS END START,返回本节,6.8 宏指令与条件汇编 宏指令是程序员自己设计的命令,是若干指令的集合,用以完成某种操作。 1 无参数宏指令的定义与调用 宏指令格式: 名称 MACRO 宏体 ENDM 2 LOCAL伪指令 如果宏体中有分支、循环,必然有标号,两次以上调用这样的宏指令必然出现标号重复定义的错误,可以用LOCAL解决这类错误。,3 有参数宏定义与调用 格式: 4宏指令与子程序的区别 6.8.2条件汇编 格式1: IF 条件 指令集合1 ELSE 指令集合2 ENDIF 格式2: IF 条件 指令集合 ENDIF,6.9 代码转换 代码转换是凶横许设计的常见课题,由于键盘输入、屏幕显示、打印机输出都使用字符ASCII码,而指令的运算对象及其结果都是一串0、1代码。输出显示的格式可能是二进制数、十进制数或十六进制数,因此许多场合都要进行代码转换。 例6.9.1 键盘输入的一位十进制数ASCII码转换为二进制数显示。(P113) 例6.9.2 二进制数转换为十六进制数显示。(P116) 例6.9.3 二进制数转换为十进制数显示。(P116) 例6.9.4 BCD码转换为二进制数显示。(P120),6.10 数值计算 在汇编语言中,可进行数值计算的仅有加、减、乘、除、移位等作为基本的指令。运用这些基本指令哪怕是完成稍微复杂一些的数值计算都是比较困难的。首先要探讨计算方法,要把某一些问题分解成能够用加、减、乘、除完成的基本操作,然后才能着手编程。 例 6.10.1 求正整数N的开平方近似值。(P121) 例6.10.2 多字节BCD码数相加。计算两个组合的四字节BCD码数之和。(P122),6.11 数据处理 数据处理涉及地面比较广,其中字符处理和表格处理都属于数据处理范畴。 6.12 字符串地动态显示技术 例6.12.1,6.13 模块化程序设计,1PUBLIC伪指令 格式:PUBLIC 符号 ,符号 功能:说明其后的符号是全局符号。全局符号能被其他模块引用。 2EXTRN伪指令 格式:EXTRN 符号:类型 ,符号:类型 功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。,返回本章首页,3INCLUDE 伪指令 格式:INCLUDE 盘符:路径文件名.扩展名 功能:通知汇编程序把指定的文件“拷贝”一份,插入到该语句的下方供汇编时使用 6.13.2 模块化程序设计考虑 (1)在模块化程序设计之前要有一个总体规划,合理地划分模块,使每一个模块有相对独立地功能,尽量减少模块之间的调用。 (2)在实模式下,链接之后的同类型逻辑段的体积不能超过64K。 (3)模块之间,同类型逻辑段的组合与否,是需要重点考虑的问题。,(4)模块之间的转移和调用 (5)模块之间出现符号名引用的时候必须用PUBLIC,EXTRN语句说明。 6.13.4 宏指令共享,【例4.17】,【例4.17】用模块化程序设计方法编制一个把十进制数N(16bit)转换成十六进制数的程序,要求待转换数N由键盘输入,转换结果在屏幕上显示出来。首先建立两个模块A:READ.ASM和模块B:SCREEN.ASM。其中模块A:完成转换功能,模块B完成显示功能。 模块A:READ.ASM PUBLIC crlf,m EXTRN disp:near data SEGMENT PUBLIC 'data' n DB 0ah,0dh,'input=$' m DB 'output=$' crlf DB 0ah,0 data ENDS,code SEGMENT PUBLIC 'code' ASSUME cs:code,ds:data start PROC far PUSH ds MOV ax,0 PUSH ax MOV ax,data MOV ds,ax REPEat: MOV bx,0 MOV ah,9 LEA dx,n INT 21h CALL DECibin CALL disp MOV ah,1 INT 21h CMP al,0dh JZ END1 JMP REPEat END1: RET start ENDP,DECibin PROC near newchar: MOV ah,1 INT 21h SUB al,30h JL exit CMP al,39h JG exit CBW XCHG ax,bx MOV cx,10 MUL cx XCHG ax,bx ADD bx,ax JMP newchar exit: RET DECibin ENDP code ENDS END start,模块B: PUBLIC disp EXTRN crlf:byte,m:byte code SEGMENT PUBLIC 'code' ASSUME cs:code disp PROC near MOV ah,09h LEA dx,m INT 21h MOV ch,4,rotate: MOV cl,4 ROL bx,cl MOV al,bl AND al,0fh ADD al,30h CMP al,3ah JL printit ADD al,07h printit: MOV dl,al MOV ah,2 INT 21h DEC ch JNZ rotate RET disp ENDP code ENDS END,

    注意事项

    本文(第6章汇编语言程序设计.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开