微机原理与应用主讲教师:姜涛教学内容:第一章微型计算机基础第二章微型计算机指令系统第三章汇编语言程序设计第四章半导体存储器第五章数字量输入输出第六章模拟量输入输出微机原理与应用第1章、微型计算机基础1.3微型计算机系统的组成、分类和配置1.3.1微型计算机系统的组成4第3章汇编语言程序设计movax,12hcalldisplayJmp1234h5主要内容:3.1汇编语言源程序概述3.2汇编语言语句格式3.3伪操作指令3.4DOS\BIOS功能调用3.5汇编语言程序设计举例63.3.4过程定义伪指令PROC、ENDP过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。过程定义伪指令的格式为过程名PROC[类型]……RET过程名ENDP注意:PROC和ENDP必须成对出现。7过程的类型有两种:NEAR——(默认类型)表示段内调用FAR——表示段间调用调用一个过程的格式为:CALL过程名83.3.5宏定义伪指令如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。指令的格式为:宏指令名MACRO[形参表]宏定义体ENDM9例:两个数之和的宏定义和宏调用。宏定义为:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDMX、Y、Z是形式参数。调用宏DADD时可写为:DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。10宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:①执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。②汇编结果:宏命令伪指令汇编后被展开。③执行速度:宏命令执行速度较快(因无调用转移)④占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。11宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM程序中宏调用:……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……汇编后的结果:(带有+号的指令为宏展开后的结果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOVAH,9+INT21H……123.3.6汇编结束伪指令END汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END[表达式]END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。133.4DOS与BIOS调用系统功能调用——由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。P176---T3.4用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INTn来实现P177---B3.4。DOS功能调用---------INT20----3FHBIOS功能调用---------INT5----1FH143.4DOS与BIOS调用DOS:DiskOperationSystem系统所有资源,设备管理、磁盘管理、文件管理和其它。P176---T3.4BIOS:BasicInputandoutputSystem系统测试,初始化引导,中断矢量装入,外部设备服务P176---T3.5153.4DOS与BIOS调用图3.5控制PC机硬件的几种方式163.4DOS与BIOS调用DOS:DiskOperationSystem系统所有资源,设备管理、磁盘管理、文件管理和其它。图3.3MS-DOS版本发展图173.4DOS与BIOS调用DOS:DiskOperationSystem图3.4用户与DOS之间的关系183.4.1DOS系统功能调用在DOS系统中,功能调用90个子程序都是用软中断指令INT21H来实现的。实现功能见P178.D0S系统功能调用的使用方法如下:①AH←功能号;②设置该功能所要求的其他入口参数;③执行INT21H指令;④分析出口参数。以下介绍INT21H的几个最常用的功能。193.4.1DOS系统功能调用20关于数据输入和输出我们这里只讨论键盘(P178)输入和显示输出,调用系统功能需要提供入口参数及所调用的功能号,调用结束返回结果。1.DOS键盘功能调用(1)从键盘输入一个字符(功能号=1)MOVAH,1INT21HAL中有键入的字符21例:程序中有时需要用户对提示做出应答。GET_KEY:MOVAH,1;等待键入字符INT21H;结果在AL中CMPAL,’Y’;是’Y’?JZYES;是,转YESCMPAL,’N’;是’N’?JZNO;是,转NOJMPGET_KEY;否则继续等待输入YES:……NO:…22(2)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。MOVAH,0AHLEADX,字符串缓冲区首地址INT21H(预留的N1个字节的存储单元)0DHN2N1N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符)用户定义的输入字符串的缓冲区格式23若用户键入的字符数(包括回车)≥定义的N1,本功能调用将不再接收新的键入,且光标不再向右移动。例:设在数据段定义键盘缓冲区如下:STR1DB10,?,10DUP(?)调用DOS功能的0AH号功能的程序段为:LEADX,STR1MOVAH,0AHINT21H此程序段最多从键盘接收10个按键(包括回车)。242.DOS显示功能调用(1)在显示器上显示一个字符(功能号=2)MOVAH,2MOVDL,要显示的字符INT21H例:在显示器上显示一个字符‘A’MOVAH,2MOVDL,’A’;或MOVDL,41HINT21H25MOVAH,9LEADX,字符串INT21H注意:被显示的字符串必须以’$’结束。(2)显示字符串(功能号=9)26例:在屏幕上显示:’HELLO,WORLD!’;在数据段定义字符串:DATASEGMENTSTR1DB‘HELLO,WORLD!$’DATAENDS;在代码段中进行显示输出MOVAH,9LEADX,STR1INT21H完整的程序:HELLO.ASM273.4.3BIOS功能调用BIOS:基本输入输出系统,是固化在EPROM中的一组实现基本输入输出功能的子程序。BIOS调用通过多个软中断提供,调用方法为:MOVAH,功能号设置入口参数,一般将参数放在寄存器中INT中断类型BIOS中的几个主要中断类型如下:INT10H——屏幕显示INT13H——磁盘操作INT14H——串行口操作INT16H——键盘操作INT17H——打印机操作每类中断由包含许多子功能,调用时通过功能号指定。BIOS功能调用说明见附录。28(1)INT16H——键盘操作从键盘输入一个字符(功能号=0,1,2)MOVAH,0INT21HAL中有键入的字符29例:按F1和F2分别执行不同处理。GET_KEY:MOVAH,0;等待键入字符INT21H;结果在AL中CMPAH,3BH;是’F1’?JNETF1;是,转TF1CMPAH,3CH;是’F2’?JZTF2;是,转TF2JMPGET_KEY;否则继续等待输入TF1:……TF2:…30(2)INT10H——屏幕显示设置显示方式、光标位置大小,调色板号、字符、图形等。例:P192313.5汇编语言程序设计基础3.5.1概述1.程序质量2.汇编语言程序设计的步骤:1-根据实际问题抽象出数学模型,确定算法2-画出程序框图(流程图)3-分配内存工作单元和寄存器4-根据框图编写源程序,存成.ASM文件5-对源程序汇编,生成.OBJ目标文件6-把.OBJ文件连接成.EXE执行文件7-运行、调试3.源程序的基本结构:顺序、分支、循环、过程32(1)用方框表示工作框,框中用简明语言标明要完成的功能(2)用菱形框表示判断框框中标明比较、判断和条件如何绘制程序框图(流程图)?NY?33(4)各框之间用直线连起来表示程序走向。框中标明子程序名字(入口参数等)(3)用框表示调用子程序或过程。流程图的例子FlowChart.doc34汇编语言上机过程YYYNNN有错?有错?有错?结束汇编输入(修改)源程序连接运行查错开始用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM源文件名.ASM;用LINK连接程序进行连接。连接后生成.EXE可执行文件。命令格式:LINK目标文件名.OBJ;用TD、DEBUG等调试程序进行调试。命令格式:TD可执行文件名.EXE35标号:条件满足?处理3.5.2顺序程序(自学)3.5.3分支程序NYIF…THEN结构程序结构:…测试/比较指令(TEST/CMP)条件转移指令(Jx标号)处理体标号:其他指令…36程序结构:TEST/CMP指令Jx标号1处理体P1JMP标号2标号1:处理体P2标号2:其他指令…条件满足?处理P1处理P2标号1:标号2:条件1条件2IF…THEN…ELSE结构37标号1:条件1成立?P1NYCASE结构程序结构:…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:P2PnNNYY例:[例],统计成绩。流程图中虚线框内383.5.4循环程序1.DO…UNTIL条件结构先执行,再判断条件。工作部分至少执行一次。初始化循环体循环控制继续循环?YN392.DOWHILE条件结构先判断条件,再执行。工作部分有可能一次都不执行。初始化循环体循环控制继续循环?YN40掌握以下几点:调用子程序用CALL指令,返回调用程序用RET指令。子程序允许嵌套调用。进入子程序后首先要保护主程序的运行状态(标志位)和使用的寄存器内容(称为保护现场),退出子程序前要恢复现场。调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存储单元或堆栈(要用BP寻址)。3.5.5子程序设计举例41例1:二进制数(0-F)转换成ASCII(‘0’-‘F’)的子程序。BIN2ASCPROC;要转换的数在AL的低四位;转换结果仍在AL中CMPAL,9JAA2FADDAL,30HJMPDONEA2F:ADDAL,37HDONE:RETBIN2ASCENDP调用方法:(在主程序中)…MOVAL,0CHCALLBIN2ASC(AL中有0CH的ASCII码43H,’C’)42例2.字符串处理程序设计对字符串进行操作时,往往需要确定它的长度。通常字符串结束标志以CR或$作标志。所以可以用扫描CR或$的方法计算出串长。在计算串长时,应注意串长一般应小于255个字节。以下是流程图和源程序。43简化的流程图:开始求串长串长256?显示串长高位显示串长低位结束Y警告:太长求串长当前字符是‘$’?搜索CR字符同时指针增量返回N串长加1存串长N找到?NYY初始化指针/计数器44程序如下:DATASEGMENTSTRINGDB‘Thisisastring…’,0DH,’$’LENGTH1DW?;串长度存放在这里CRDB0DHMESSAGEDB’Thestringis