《微型计算机基本原理与应用》课件第6章 汇编语言程序设计及应用.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《微型计算机基本原理与应用》课件第6章 汇编语言程序设计及应用.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微型计算机基本原理与应用 微型计算机基本原理与应用课件第6章 汇编语言程序设计及应用 微型计算机 基本原理 应用 课件 汇编语言 程序设计
- 资源描述:
-
1、 第第6章章汇编语言程序设计及应用汇编语言程序设计及应用本章主要内容本章主要内容(1)汇编语言程序设计的基本方法及典型应用)汇编语言程序设计的基本方法及典型应用(2)Windows环境下的汇编语言程序设计环境下的汇编语言程序设计(3)汇编语言与高级语言混合编程技术简介)汇编语言与高级语言混合编程技术简介6.1 汇编语言程序设计的基本方法汇编语言程序设计的基本方法6.1.1 程序设计的基本步骤程序设计的基本步骤n1.分析问题分析问题n分析问题就是要弄清问题的性质、目的、已知数据以及运算精度要求、运算速度要求等内容,抽象出一个实际问题的数学模型。n2.确定算法确定算法n把问题转化为计算机求解的步骤
2、和方法,并且尽量选择逻辑简单、速度快、精度高的算法。n 3.画流程图画流程图n流程图一般是利用一些带方向的线段、框图等把解决问题的先后次序等直观地描述出来。如下图所示。对于复杂问题,可以画多级流程图,即先画粗框图,再逐步求精。n4.编写程序编写程序n按汇编语言程序的格式将算法和流程图描述出来。编程中应注意内存工作单元和寄存器的合理分配。n5.静态检查静态检查n静态检查就是在程序非运行状态下检查程序。良好的静态检查可以节省很多上机调试的时间,并常常能检查出一些较隐蔽的问题。n6.上机调试上机调试n这是程序设计的最后一步,目的在于发现程序的错误并设法更正。应注意在上机调试中积累经验,以提高调试的效
3、率。6.1.2 程序的基本结构形式程序的基本结构形式n1.顺序结构顺序结构n该结构指从程序起始地址开始顺序执行各条指令直至程序结束,无分支,无循环,无转移。这种结构在逻辑上是很简单的,所以又叫简单结构。n2.分支结构分支结构n实际程序中经常会要求计算机作出判断,并根据判断结果做不同的处理。这种根据不同情况分别做处理的程序结构就是分支结构。通常有两种分支结构,即IF-THEN-ELSE结构和CASE结构,如图6.2所示。n3.循环结构循环结构n有两种基本的循环结构,即WHILE-DO 结构和REPEAT-UNTIL结构,如图6.3所示。n例例6.1 分析下列程序段的结构特点,并指出其功能。分析下
4、列程序段的结构特点,并指出其功能。nMOV CX,0n MOV AX,DS:2000HnCONT:TEST AX,0FFFFHn JE EXITn JNS SKIPn INC CXnSKIP:SHL AX,1n JMP CONTnEXIT:n这是一个属于“先判断,后执行”的WHILE-DO结构的循环程序段。该程序段的功能是:检测内存2000H字单元中“1”的个数,并将检测结果存放于CX寄存器中。n例例6.2 编程实现将偏移地址编程实现将偏移地址1000H开始的开始的100个字节单元个字节单元数据传送到偏移地址数据传送到偏移地址2000H开始的单元中。开始的单元中。n程序段如下:程序段如下:nM
5、OV SI,1000H ;n MOV DI,2000H;初始化n MOV CX,100 ;n LOP:MOV AL,SI ;n MOV DI,AL ;n INC SI ;循环体n INC DI ;n DEC CX ;n JNE LOP ;循环控制n HLT n容易看出,该程序段属于“先执行,后判断”的REPEAT-UNTIL循环结构。6.1.3 子程序设计子程序设计n子程序又称过程子程序又称过程(Procedure),CALL指令和指令和RET指令分指令分别实现子程序的调用和返回。调用和返回分为段内操作和别实现子程序的调用和返回。调用和返回分为段内操作和段间操作,可通过段间操作,可通过NEAR
6、和和FAR属性参数来定义,两种操属性参数来定义,两种操作在堆栈处理时有所不同。作在堆栈处理时有所不同。n一般来说,有两种类型的程序段适合编成子程序。一种是一般来说,有两种类型的程序段适合编成子程序。一种是多次重复使用的,编成子程序可以节省存储空间。一种是多次重复使用的,编成子程序可以节省存储空间。一种是具有通用性、便于共享的,例如键盘管理程序、字符串处具有通用性、便于共享的,例如键盘管理程序、字符串处理程序等。理程序等。n子程序设计中需要注意的几个问题子程序设计中需要注意的几个问题:1.现场的保护与恢复现场的保护与恢复n如果在子程序中要用到某些寄存器或存储单元,为了不破如果在子程序中要用到某些
7、寄存器或存储单元,为了不破坏原有信息,要将它们的内容压入堆栈加以保护,这就叫坏原有信息,要将它们的内容压入堆栈加以保护,这就叫保护工作现场。保护可以在主程序中实现,也可以在子程保护工作现场。保护可以在主程序中实现,也可以在子程序中实现。现场恢复是指子程序完成特定功能后弹出压在序中实现。现场恢复是指子程序完成特定功能后弹出压在堆栈中的信息,以恢复到主程序调用子程序时的现场。堆栈中的信息,以恢复到主程序调用子程序时的现场。2.参数的传递参数的传递n参数传递的方法一般有三种:用寄存器传送,用参数表传参数传递的方法一般有三种:用寄存器传送,用参数表传送和用堆栈传送。送和用堆栈传送。(1)用寄存器传递参
8、数用寄存器传递参数n用寄存器传递参数适用于参数个数较少的场合。主程序将子程序执行用寄存器传递参数适用于参数个数较少的场合。主程序将子程序执行时所需要的参数放在指定的寄存器中,子程序的执行结果也放在规定时所需要的参数放在指定的寄存器中,子程序的执行结果也放在规定的寄存器中。的寄存器中。(2)用参数表传递参数用参数表传递参数n这种方法适用于参数较多的情况。它是在存储器中专门规定某些单元这种方法适用于参数较多的情况。它是在存储器中专门规定某些单元放入口参数和出口参数,即在内存中建立一个参数表,这种方法有时放入口参数和出口参数,即在内存中建立一个参数表,这种方法有时也称约定单元法。也称约定单元法。(3
9、)用堆栈传递参数用堆栈传递参数n该方法适用于参数多并且子程序有多重嵌套或有多次递归调用的情况该方法适用于参数多并且子程序有多重嵌套或有多次递归调用的情况。主程序将参数压入堆栈,子程序通过堆栈的参数地址取得参数,并。主程序将参数压入堆栈,子程序通过堆栈的参数地址取得参数,并在返回时使用在返回时使用“RET n”指令调整指令调整SP指针,以删除栈中已用过的参指针,以删除栈中已用过的参数,保证堆栈的正确状态及程序的正确返回。数,保证堆栈的正确状态及程序的正确返回。3.嵌套与递归嵌套与递归n子程序中调用别的子程序称为子程序嵌套。如图子程序中调用别的子程序称为子程序嵌套。如图6.4所示。设计嵌套所示。设
10、计嵌套子程序时要注意正确使用子程序时要注意正确使用CALL和和RET指令,并注意寄存器的保护和指令,并注意寄存器的保护和恢复。只要堆栈空间允许,嵌套层次不限。恢复。只要堆栈空间允许,嵌套层次不限。n子程序调用它本身称为递归调用。在图子程序调用它本身称为递归调用。在图6.4中,当子程序中,当子程序1与子程序与子程序2是同一个程序时,就是递归调用。设计递归子程序的关键是防止出现是同一个程序时,就是递归调用。设计递归子程序的关键是防止出现死循环,注意脱离递归的出口条件。死循环,注意脱离递归的出口条件。n下面给出一个包括了子程序嵌套和递归调用的例子。该程下面给出一个包括了子程序嵌套和递归调用的例子。该
11、程序求一个数的阶乘序求一个数的阶乘n!。n!定义如下:定义如下:1!(1)!nn n;0,1;1nnn求求n!本身可以设计成一个子程序,由于本身可以设计成一个子程序,由于n!是是n和和(n1)!的的乘积,而求乘积,而求(n1)!必须递归调用求必须递归调用求n!子程序,但每次调子程序,但每次调用所用参数都不相同。用所用参数都不相同。n因为递归调用过程中,必须保证不破坏以前调用时所用的因为递归调用过程中,必须保证不破坏以前调用时所用的参数和中间结果,所以通常都把每次调用的参数、中间结参数和中间结果,所以通常都把每次调用的参数、中间结果以及子程序中使用的寄存器内容放在堆栈中。果以及子程序中使用的寄存
12、器内容放在堆栈中。n此外,递归子程序中还必须含基数的设置,当调用的参数此外,递归子程序中还必须含基数的设置,当调用的参数等于基数时则实现递归退出,保证参数依次出栈并返回主等于基数时则实现递归退出,保证参数依次出栈并返回主程序。程序。n求求 n!的具体程序如下:的具体程序如下:n DATA SEGMENT ;数据段数据段n n DW 4 ;定义定义n值值n RESULT DW?;结果存于结果存于RESULT中中nDATA ENDSnSTACK SEGMENT STACK ;堆栈段堆栈段n DB 100 DUP(?)nSTACK ENDSnCODE SEGMENT ;代码段代码段nASSUME C
13、S:CODE,DS:DATA,SS:STACKnMAIN PROC FAR ;主程序主程序n START:n MOV AX,DATAn MOV DS,AXn MOV AX,n n CALL FACT ;调用调用n!递归子程序递归子程序n MOV RESULT,CXn MOV AH,4CH ;返回返回DOS系统系统nINT 21Hn MAIN ENDPn FACT PROC NEAR ;定义定义n!递归子程序递归子程序n CMP AX,0n JNZ MULTn MOV CX,1 ;0!1nRETnMULT:PUSH AXn DEC AXn CALL FACTn POP AXn MUL CXn M
14、OV CX,AXn RETnFACT ENDPnCODE ENDSnEND START6.2 汇编语言的编程应用汇编语言的编程应用6.2.1 I/O与通信与通信n计算机与外设之间是通过称为计算机与外设之间是通过称为I/O接口的专门部件来进行联系接口的专门部件来进行联系和通信的,它们之间的信息交换是通过读写和通信的,它们之间的信息交换是通过读写I/O接口中的专门接口中的专门寄存器来实现的,这些寄存器也称寄存器来实现的,这些寄存器也称I/O端口(端口(I/O PORT)。nCPU与外设之间交换的信息包括数据、状态和控制信息。状与外设之间交换的信息包括数据、状态和控制信息。状态信息是指表示外部设备工
15、作状态的信息,如是否准备好或态信息是指表示外部设备工作状态的信息,如是否准备好或是否忙的信息。控制信息则用来控制外部设备的动作。是否忙的信息。控制信息则用来控制外部设备的动作。n一般每个一般每个I/O接口都有自己的数据寄存器、状态寄存器和控制接口都有自己的数据寄存器、状态寄存器和控制寄存器来存放相应的三种信息,读寄存器来存放相应的三种信息,读/写写I/O端口实际上就是读端口实际上就是读/写这三种写这三种寄存器寄存器。n下面举一个例子,是用并行打印机打印寄存器下面举一个例子,是用并行打印机打印寄存器AL中字符的过程:中字符的过程:nPRINT PROC NEARnPUSH AX ;保护所用到的寄
16、存器保护所用到的寄存器nPUSH DX nMOV DX,378H ;数据端口地址数据端口地址378HnOUT DX,AL ;输出要打印的字符输出要打印的字符nMOV DX,379H ;状态端口地址状态端口地址379HnWAIT:IN AL,DX ;读打印机状态读打印机状态nTEST AL,80H ;检查打印机是否忙检查打印机是否忙nJE WAITnMOV DX,37AH ;控制端口控制端口37AHnMOV AL,0DH ;选通打印机选通打印机nOUT DX,ALnMOV AL,0CH ;关打印机选通关打印机选通nOUT DX,ALnPOP DX ;恢复寄存器恢复寄存器nPOP AXnRETnP
17、RINT ENDP6.2.2 声音与时钟声音与时钟n8255 端口端口B的端口号为的端口号为61H,其数据寄存器的最低两位就其数据寄存器的最低两位就是用来实现这种控制功能的。因此,通过交替地设置这两是用来实现这种控制功能的。因此,通过交替地设置这两位的值就可以实现打开扬声器和关闭扬声器,就可以控制位的值就可以实现打开扬声器和关闭扬声器,就可以控制发声的时间,即控制音长。发声的时间,即控制音长。n8253内部有内部有3个计数器,其中计数器个计数器,其中计数器0用于系统时钟;计数用于系统时钟;计数器器1用作用作DMA的定时控制,计数器的定时控制,计数器2是一个方波发生器,是一个方波发生器,其输出经
18、一个与门连接到扬声器,扬声器发声的频率就是其输出经一个与门连接到扬声器,扬声器发声的频率就是该方波的频率。该方波的频率。n通过改变计数器通过改变计数器2(端口地址为端口地址为42H)产生的方波的频率,产生的方波的频率,就可以控制扬声器发声的频率,即控制音调。就可以控制扬声器发声的频率,即控制音调。n上面介绍了发声的原理,下面仿照上面介绍了发声的原理,下面仿照BEEP给出一个实例,它可以产生频率范给出一个实例,它可以产生频率范围为围为19Hz65535Hz的声音,持续时间是的声音,持续时间是10ms的倍数,在的倍数,在0.01s655.35s之间。之间。n;入口参数:;入口参数:DI中为要发声音
19、的频率值中为要发声音的频率值n;BX中为发声时间中为发声时间(10ms的倍数的倍数)nSOUND PROC NEARnPUSH AX ;保护寄存器的值保护寄存器的值nPUSH BXnPUSH CXnPUSH DXnPUSH DInMOV AL,0B6H ;该初始化值使计数器该初始化值使计数器2产生方波信号产生方波信号nOUT 43H,AL ;43H是是8253控制寄存器端口号控制寄存器端口号nMOV DX,12H ;DX,AX中的值设为中的值设为1234DCHnMOV AX,34DCHnDIV DI ;计算计数器计算计数器2的计数值,存放于的计数值,存放于AX中中nOUT 42H,AL ;设置
20、计数值设置计数值nMOV AL,AHnOUT 42H,ALnIN AL,61H ;读入读入8255端口端口61H的原值并保存在的原值并保存在AH中中nMOV AH,ALnOR AL,3 ;开扬声器开扬声器(将将8255端口端口61H的低两位置的低两位置1)nOUT 61H,ALnDELAY:MOV CX,2801 nDL10ms:LOOP DL10ms ;延时延时10msnDEC BX nJNZ DELAY ;延时延时BX值值10msnMOV AL,AH ;恢复恢复8255端口端口61H的原值的原值nOUT 61H,AL ;关闭扬声器关闭扬声器nPOP DInPOP DXnPOP CXnPOP
21、 BXnPOP AXnRETnSOUND ENDP6.2.3 乐曲程序乐曲程序n通过调用上面的发声程序(通过调用上面的发声程序(SOUND 过程),即可编写演过程),即可编写演奏乐曲的程序。由于在一首乐曲中,每个音符的音调和音奏乐曲的程序。由于在一首乐曲中,每个音符的音调和音长分别与频率和持续时间(节拍)有关,所以只要事先把长分别与频率和持续时间(节拍)有关,所以只要事先把控制频率的参数送入控制频率的参数送入DI寄存器,把控制持续时间(节拍)寄存器,把控制持续时间(节拍)的参数送入的参数送入BX寄存器,然后调用发声过程寄存器,然后调用发声过程SOUND,就可就可演奏出特定音调和音长的音符来。演
22、奏出特定音调和音长的音符来。n确定了音符与频率和持续时间的关系后,就可以根据特定确定了音符与频率和持续时间的关系后,就可以根据特定的乐谱将每个音符所对应的频率和持续时间定义成两个数的乐谱将每个音符所对应的频率和持续时间定义成两个数据表,然后编写程序依次取出数据表中的频率值和时间值,据表,然后编写程序依次取出数据表中的频率值和时间值,并通过调用发声程序(并通过调用发声程序(SOUND 过程),即可按乐谱演奏过程),即可按乐谱演奏出动听的乐曲了。出动听的乐曲了。n下面以图下面以图6.7中给出的奥运主题曲曲谱为例,说明编写乐中给出的奥运主题曲曲谱为例,说明编写乐曲程序的一般方法和过程。曲程序的一般方
23、法和过程。n编写乐曲程序的主要步骤如下:编写乐曲程序的主要步骤如下:n 定义演奏乐曲的频率表和节拍时间表(设表名分别为MUS_FREQ和MUS_TIME)。n 分别将频率表和节拍时间表的偏移地址送入SI和BP寄存器。nLEA SI,MUS_FREQnLEA BP,DS:MUS_TIMEn 取出表中的频率值送入DI,节拍时间值(10 ms的倍数)送入BX。nMOV DI,SInMOV BX,DS:BPn频率表中的最后一个数据1作为乐曲的结束符,也可采用其他的特定值。n 调用SOUND过程产生特定音调和节拍的乐音。6.2.4 键盘键盘I/On键盘通常有编码键盘和非编码键盘两种类型。编码键盘中键盘通
24、常有编码键盘和非编码键盘两种类型。编码键盘中的某一个键按下后,能够直接提供与该键相对应的字符编的某一个键按下后,能够直接提供与该键相对应的字符编码信息(如码信息(如ASCII码),其缺点是所需硬件会随着键数的码),其缺点是所需硬件会随着键数的增加而增加。增加而增加。n用户可以通过系统提供的用户可以通过系统提供的BIOS键盘中断(键盘中断(INT 16H)从从键盘缓冲区中得到字符的键盘缓冲区中得到字符的ASC码及其相应的扫描码,以码及其相应的扫描码,以供程序使用。供程序使用。n键盘状态字节所表示的就是这些键的对应状态信息。通过键盘状态字节所表示的就是这些键的对应状态信息。通过INT 16H的的0
25、2H号功能调用可以把键盘状态字节回送到号功能调用可以把键盘状态字节回送到AL寄存器。寄存器。AL中键盘状态字节各位(中键盘状态字节各位(D7D0)含义如下含义如下:nD71,Insert状态改变 D31,按下Alt键 nD61,Caps Lock状态改变 D21,按下Ctrl键 nD51,Num Lock状态改变 D11,按下左Shift键nD41,Scroll Lock状态改变 D01,按下右Shift键例例6.4 从键盘接收从键盘接收10个字符,将其存放于个字符,将其存放于W开始的缓冲区中开始的缓冲区中,然后把缓冲区的内容送显示器输出。,然后把缓冲区的内容送显示器输出。nDATA SEGM
展开阅读全文