微机原理与接口技术课件chap.ppt
2023/10/13,1,复 习,1、汇编语言源程序的结构2、汇编语言语句格式(1)数据项包括常量、变量、标号及表达式。(2)表达式是常数、寄存器、标号、变量与运算符的组合。表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。3、伪指令,2023/10/13,2,主要内容,1、伪指令 过程定义伪指令 宏定义伪指令 结束伪指令2、系统功能调用:DOS功能调用;BIOS功能调用。3、汇编语言程序设计基础 源程序的基本结构:顺序、分支、循环、过程,2023/10/13,3,4.2.5 过程定义伪指令PROC、ENDP,过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。过程定义伪指令的格式为 PROC 类型 RET ENDP 注意:PROC和ENDP必须成对出现。,2023/10/13,4,NEAR(默认类型)表示段内调用 FAR表示段间调用 调用一个过程的格式为:CALL,过程的类型有两种:,2023/10/13,5,4.2.6 宏定义伪指令,如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。,指令的格式为:MACRO 形参表 ENDM,2023/10/13,6,例:两个数之和的宏定义和宏调用。宏定义为:DADD MACRO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AX ENDM,X、Y、Z是形式参数。调用宏DADD时可写为:DADD DATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。,2023/10/13,7,宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。汇编结果:宏命令伪指令汇编后被展开。执行速度:宏命令执行速度较快(因无调用转移)占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。,2023/10/13,8,宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:Display MACRO string LEA DX,string MOV AH,9 INT 21H ENDM 程序中宏调用:DISPLAY ERROR_MESSAGE DISPLAY EXIT_MESSAGE 汇编后的结果:(带有+号的指令为宏展开后的结果)+LEA DX,ERROR_MESSAGE+MOV AH,9+INT 21H+LEA DX,EXIT_MESSAGE+MOVAH,9+INT 21H,2023/10/13,9,4.2.7 汇编结束伪指令END,汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END 表达式END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。,2023/10/13,10,4.3 DOS系统功能调用介绍,系统功能调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INT n来实现。在DOS系统中,功能调用都是用软中断指令INT 21H来实现的。,2023/10/13,11,设备管理、目录管理、文件管理和其它。,D0S系统功能调用的使用方法如下:AH功能号;设置该功能所要求的其他入口参数;执行INT 21H指令;分析出口参数。,INT 2lH功能大致可以分为四个方面:,2023/10/13,12,关于数据输入和输出我们这里只讨论键盘输入和显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。,1.DOS键盘功能调用,(1)从键盘输入一个字符(功能号=1)MOV AH,1 INT 21H,以下介绍INT 21H的几个最常用的功能:,2023/10/13,13,例:程序中有时需要用户对提示做出应答。GET_KEY:MOV AH,1;等待键入字符 INT 21H;结果在AL中 CMP AL,Y;是Y?JZ YES;是,转YES CMP AL,N;是N?JZ NO;是,转NO JMP GET_KEY;否则继续等待输入 YES:NO:,2023/10/13,14,(2)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。MOV AH,0AH LEA DX,INT 21H,(预留的N1个字节的存储单元),0DH,N2,N1,N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符),用户定义的输入字符串的缓冲区格式,2023/10/13,15,若用户键入的字符数(包括回车)定义的N1,本功能调用将不再接收新的键入,且光标不再向右移动。例:设在数据段定义键盘缓冲区如下:STR1 DB 10,?,10 DUP(?)调用DOS功能的0AH号功能的程序段为:LEA DX,STR1 MOV AH,0AH INT 21H 此程序段最多从键盘接收10个按键(包括回车)。,2023/10/13,16,2.DOS显示功能调用,(1)在显示器上显示一个字符(功能号=2)MOV AH,2 MOV DL,INT 21H 例:在显示器上显示一个字符A MOV AH,2 MOV DL,A;或MOV DL,41H INT 21H,2023/10/13,17,MOV AH,9 LEA DX,INT 21H注意:被显示的字符串必须以$结束。,(2)显示字符串(功能号=9),2023/10/13,18,例:在屏幕上显示:HELLO,WORLD!;在数据段定义字符串:DATA SEGMENT STR1 DB HELLO,WORLD!$DATA ENDS;在代码段中进行显示输出 MOV AH,9 LEA DX,STR1 INT 21H,2023/10/13,19,附:BIOS功能调用(附录E),BIOS:基本输入输出系统,是固化在EPROM中的一组实现基本输入输出功能的子程序。BIOS调用通过多个软中断提供,调用方法为:MOV AH,INT BIOS中的几个主要中断类型如下:INT 10H屏幕显示INT 13H磁盘操作INT 14H串行口操作INT 16H键盘操作INT 17H打印机操作每类中断由包含许多子功能,调用时通过功能号指定。BIOS功能调用说明见p361附录E。,2023/10/13,20,4.4 汇编语言程序设计基础,4.4.1 概述1.程序质量 2.汇编语言程序设计的步骤:1-根据实际问题抽象出数学模型,确定算法 2-画出程序框图(流程图)3-分配内存工作单元和寄存器 4-根据框图编写源程序,存成.ASM文件 5-对源程序汇编,生成.OBJ目标文件 6-把.OBJ文件连接成.EXE执行文件 7-运行、调试3.源程序的基本结构:顺序、分支、循环、过程,2023/10/13,21,(1)用方框表示工作框,框中用简明语言标明要完成的功能,(2)用菱形框表示判断框,框中标明比较、判断和条件,如何绘制程序框图(流程图)?,N,Y,?,2023/10/13,22,(4)各框之间用直线连起来表示程序走向。,框中标明子程序名字(入口参数等),(3)用 框表示调用子程序或过程。,2023/10/13,23,汇编语言上机过程,2023/10/13,24,一、实验环境,1.硬件环境微型计算机(Intel x86系列CPU)一台2.软件环境 Windows98/2000/XP操作系统任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等)汇编程序(MASM.EXE或TASM.EXE)连接程序(LINK.EXE或TLINK.EXE)调试程序(DEBUG),文本编辑器建议使用EDIT或NOTEPAD,汇编程序建议使用MASM.EXE,连接程序建议使用LINK.EXE,调试程序建议使用DEBUG,2023/10/13,25,1确定源程序的存放目录,建议源程序存放的目录名为ASM(或MASM),并放在D盘或E盘的根目录下。如果没有创建过此目录,请用如下方法创建:通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”“文件夹”,并把新建的文件夹命名为ASM。请把MASM.EXE、LINK.EXE、DENUG.EXE和都拷贝到此目录中。,2023/10/13,26,建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。在Windows中点击桌面左下角的“开始”按钮选择“运行”在弹出的窗口中输入“EDIT.COM C:ASMHELLO.ASM”,屏幕上出现EDIT的编辑窗口。,2建立ASM源程序,2023/10/13,27,源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。具体操作如下:方法:在DOS命令提示符窗口中操作选择“开始”“程序”“附件”“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令:C:CD ASMC:ASMMASM HELLO.ASM,3用MASM.EXE汇编源程序产生OBJ目标文件,2023/10/13,28,警告错误(Warning Errors)。警告错误不影响程序的运行,但可能会得出错误的结果。此例中无警告错误。严重错误(Severe Errors)。对于严重错误,MASM将无法生成OBJ文件。此例中有两个严重错误。,源程序的错误类型有两类:,2023/10/13,29,在上一步骤中,汇编程序产生的是二进制目标文件(OBJ文件),并不是可执行文件,要想使我们编制的程序能够运行,还必须用连接程序(LINK.EXE)把OBJ文件转换为可执行的EXE文件。具体操作如下:方法:在DOS命令提示符窗口中操作选择“开始”“程序”“附件”“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入LINK命令:C:CD ASMC:ASMLINK HELLO.OBJ,4用LINK.EXE产生EXE可执行文件,2023/10/13,30,5执行程序,建立了HELLO.EXE文件后,就可以直接在DOS下运行此程序,如下所示:C:HELLO回车C:程序运行结束后,返回DOS。如果运行结果正确,那么程序运行结束时结果会直接显示在屏幕上。,如果程序不显示结果,我们如何知道程序是否正确呢?例如,这里的HELLO.EXE程序并未显示出结果,所以我们不知道程序执行的结果是否正确。这时,我们就要使用调试工具来查看运行结果。此外,大部分程序必须经过调试阶段才能纠正程序执行中的错误,调试程序时也要使用。,2023/10/13,31,汇编语言上机过程,Y,Y,Y,N,N,N,有错?,有错?,有错?,结束,汇 编,输入(修改)源程序,连 接,运 行,查 错,开始,用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件,用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM;,用LINK连接程序进行连接。连接后生成.EXE可执行文件。命令格式:LINK;,用TD、DEBUG等调试程序进行调试。命令格式:TD,2023/10/13,32,标号:,条件满足?,处理,4.4.2 顺序程序(p172-173,自学)4.4.3 分支程序,N,Y,IFTHEN结构,程序结构:测试/比较指令(TEST/CMP)条件转移指令(Jx 标号)处理体 标号:其他指令,2023/10/13,33,程序结构:TEST/CMP指令 Jx 标号1 处理体P1 JMP 标号2标号1:处理体P2标号2:其他指令,条件满足?,处理P1,处理P2,标号1:,标号2:,条件1,条件2,IFTHENELSE结构,2023/10/13,34,标号1:,条件1成立?,P1,N,Y,CASE结构,程序结构:TEST/CMP指令(测试条件1)Jx 标号1;不满足转标号1 处理体P1 JMP 标号n+1标号1:TEST/CMP指令(测试条件2)Jx 标号2;不满足转标号2 处理体P2 JMP 标号n+1标号2:TEST/CMP指令(测试条件3)Jx 标号3;不满足转标号3 处理体P3 JMP 标号n+1标号3:TEST/CMP指令(测试条件4)标号n+1:(公共出口),条件2成立?,条件n成立?,Pn+1,标号2:,标号n:,标号n+1:,P2,Pn,N,N,Y,Y,2023/10/13,35,4.4.4 循环程序,1DOUNTIL 结构 先执行,再判断条件。工作部分至少执行一次。,初始化,循环体,循环控制,继续循环?,Y,N,2023/10/13,36,2.DO WHILE 结构 先判断条件,再执行。工作部分有可能一次都不执行。,初始化,循环体,循环控制,继续循环?,Y,N,注意:循环可以嵌套(多重循环),但多个循 环体之间不能交叉,控制条件不能混淆。,2023/10/13,37,掌握以下几点:调用子程序用CALL指令,返回调用程序用RET指令。子程序允许嵌套调用。进入子程序后首先要保护主程序的运行状态(标志位)和使用的寄存器内容(称为保护现场),退出子程序前要恢复现场。调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。,4.4.5 子程序设计举例,2023/10/13,38,例1:二进制数(0-F)转换成ASCII(0-F)的子程序。BIN2ASC PROC;要转换的数在AL的低四位;转换结果仍在AL中 CMP AL,9 JA A2F ADD AL,30H JMP DONE A2F:ADD AL,37H DONE:RETBIN2ASC ENDP调用方法:(在主程序中)MOV AL,0CH CALL BIN2ASC(AL中有0CH的ASCII码43H,C),2023/10/13,39,例2.字符串处理程序设计 此例取自p179例4-2。对字符串进行操作时,往往需要确定它的长度。通常字符串结束标志以CR或$作标志。所以可以用扫描CR或$的方法计算出串长。在计算串长时,应注意串长一般应小于255个字节。以下是流程图和源程序。,2023/10/13,40,简化的流程图:,开始,求串长,串长256?,显示串长高位,显示串长低位,结束,Y,警告:太长,求串长子程序,当前字符是?,搜索CR字符同时指针增量,返回,N,串长加1,存串长,N,找到?,N,Y,Y,初始化指针/计数器,2023/10/13,41,程序如下:DATA SEGMENTSTRING DB This is a string,0DH,$LENGTH1 DW?;串长度存放在这里CR DB 0DHMESSAGE DB The string is too long!,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARBEGIN:MOV AX,DATA MOV ES,AX MOV DS,AX,2023/10/13,42,CALLSTRLEN;调用子程序计算串长MOVDX,LENGTH1;结果在DX寄存器中 CMPDX,100HJBNEXT1;若(DX)100H,转LEADX,MESSAGE;若(DX)100H,MOVAH,9INT21H;显示信息JMPNEXT2NEXT1:MOVDH,DL;串长暂存在DH中MOVCL,4SHRDL,CL;取串长高4位CMPDL,9,2023/10/13,43,JBELP;9,转ADDDL,7;9,加7LP:ADDDL,30H;高4位转换为ASCII码MOVAH,2INT21H;显示这个ASCII码MOVDL,DH;取暂存串长ANDDL,0FH;取串长低4位CMPDL,9JBELP1;9,转ADDDL,7;9,加7LP1:ADDDL,30H;低4位转换为ASCII码MOVAH,2INT21H;显示该ASCII码,2023/10/13,44,MOVDL,HMOVAH,2INT21H;显示HNEXT2:MOVAH,4CHINT21H;返回DOS MAINENDP;-主程序结束-;-计算串长的子程序-STRLENPROCLEADI,STRINGMOVCX,0FFFFH;(CX)=-1MOVAL,CR;(AL)=0DHMOVAH,$;(AH)=24HCLD;DF=0,2023/10/13,45,AGAIN:INCCX;串长加1,初始值(CX)=0 CMPCX,100HJAEDONE;串长255,则结束CMPDI,AH;本字符是$?JEDONE;是,则结束SCASB;本字符是CR?JNEAGAIN;未找到,返回继续DONE:MOVLENGTH1,CX;找到,LENGTH1串长RET;返回主程序STRLENENDP;-子程序结束-CODEENDSENDBEGIN,2023/10/13,46,本例主要介绍了:含有子程序的汇编语言程序结构字符串的处理如何计算字符串长度如何把二进制数转换成ASCII显示在屏幕上,2023/10/13,47,小结,1、伪指令 过程定义伪指令 结束伪指令 宏定义伪指令2、系统功能调用:DOS功能调用;BIOS功能调用。3、汇编语言程序设计基础 源程序的基本结构:顺序、分支、循环、过程,2023/10/13,48,作 业,P189-190 4.4、4.5、4.8,