微型计算机汇编语言设计 第10章汇编语言程序设计实例_第1页
微型计算机汇编语言设计 第10章汇编语言程序设计实例_第2页
微型计算机汇编语言设计 第10章汇编语言程序设计实例_第3页
微型计算机汇编语言设计 第10章汇编语言程序设计实例_第4页
微型计算机汇编语言设计 第10章汇编语言程序设计实例_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一即第10章汇编语言程序设计实例

第10章汇编语言程序设计实例

10.1视频显示系统程序设计

10.2音频发声系统程序设计

10.3数据通信系统程序设计

习题10

«Back

一即第10章汇编语言程序设计实例

10.1视频显示系统程序设计

在微型计算机的图形显示方面,汇编语言具有极

大的优势,这是因为显示在屏幕上的图形是由成千上

万个像素组成的,对图形处理也需要复杂的算法和大

量的指令。与高级语言相比,虽然表面上汇编语言显

得复杂、凌乱和可读性差,但就速度而言,汇编语言

最快。

委卜第10章汇编语言程序设计实例________________

用汇编语言设计出来的图形显示有着直观、醒目和反

应快速的优点,并且一旦掌握汇编语言显示技术的思

路和基本显示模块,编程的工作仅是模块的运用和参

数的修正。因此,汇编程序编制图形程序是程序设计

中非常有意义和价值的工作之一。

委卜第10章汇编语言程序设计实例________________

10.1.1显示方式

显示方式与显示适配器及显示器密切相关,因此,必

须熟悉和掌握显示器和与显示适配器相关的性能与技术

指标。

1.显示适配器

IBM-PC系列微机中,先后提供了多种显示适配器

(显示卡),表10-1介绍了这些适配器的基本技术指标。

显示适配器的功能基本是向下兼容,即新型显示卡

功能包括前一档次显示卡的显示功能,而又有所增强。

止匕外,实用中各厂家不同型号的产品性能不尽相同。

一即第10章汇编语言程序设计实例

表10-1显示适配器的基本技术指标

分辨率

类型彩色度(灰度)

字符图形

单色字符显示适配器(MDA)9X14720X3502

320X200

彩色图形适配器(CGA)8X816选4

640X200

720X200

高分辨率单色适配器(HGC)16选4

640X350

一即第10章汇编语言程序设计实例

信号

显示模式

模式

其他

7TTL

0〜6TTL

7、FTTL

一即第10章汇编语言程序设计实例

增强型图形适配器(EGA)8X14640X35064选16

多色图形阵列(MCGA)8X14640X400256

视频图形阵列(VGA)9X16640X480256

高级视频图形阵列(TVGA)800X60064K

1024X768

超级视频图形适配器(SVGA)1280X102416M

1680X1280

1024X768

局部高性能总线显示卡(PCD1280X102416M

1680X1280

1024X768

图形加速阵列

1280X10244G

(AGP)

1680X1280

一即第10章汇编语言程序设计实例

0〜6、D〜F、10TTL

0〜6、D〜F、10模拟

0~6、D〜F、11~13模拟

0〜6、D〜F、11〜13模拟

0〜6、D〜F、

模拟

11〜13

图形

标准、非标准模拟

加速

图形

标准、非标准模拟

加速

委卜第10章汇编语言程序设计实例________________

2.显示器

目前,Intel公司80x86/Pentium的微型机主要使用两

种类型的显示器:数字(TTL)显示器和模拟显示器。

1)数字(TTL)显示器

该类型显示器的彩色分辨是用',1〃和''0〃来决定的。

若某彩色信号为、'1〃,则在屏幕上呈现出这一彩色,否

则屏幕上不显示这一彩色。TTL显示器上能显示的彩

色种类与彩色信号输入线的多少有关。

委卜第10章汇编语言程序设计实例________________

如CGA与彩色有关的信号线有红(R)、绿(G)、蓝

(B)和亮度(I),这四种信号可组合成2〜16种不同

的颜色,字符的显示可从其中选择做前景或背景色。

CGA和EGA适配器仅能支持TTL显示器。

第10章汇编语言程序设计实例

2)模拟显示器

模拟显示器有3种彩色信号输入线(红、绿、

蓝),加在每个输入线上的电平的高低级别决定了显

示在屏幕上的那种彩色的数量。从理论上讲,它能显

示的彩色数量是无限的,但实际应用中却是有限的,

这主要取决于显示适配器的能力。

由于彩色数量的无限性,模拟显示器被认为是一

种优秀的显示技术。VGA及以上显示方式必须配置模

拟显示器。目前386及其以上的机型基本上选用VGA适

配器和模拟显示器。

委卜第10章汇编语言程序设计实例________________

3)显示器分辨率

分辨率是显示器的重要指标,它关系到显示器的

性能和图像质量。图像质量由两个主要因素决定:其

一是屏幕上扫描图像的速度;其二是屏幕上的像素

数,像素数又称分辨率,以屏幕行像素数(x)X列像素

数(y)的形式表示。

例如,表10-1中VGA的分辨率是640X480,就是

说,这种方式下,每行可以分辨640个像素点,每列可

以分辨480个像素点。

一即第10章汇编语言程序设计实例

显示器分辨率也有着向下兼容的问题,高分辨率

显示器可以由低分辨率的适配器驱动。例如,SVGA显

示器上显示VGA信号。而低分辨率显示器则不可以由

高分辨率的适配器驱动,如果这样做了,轻则显示器

行不同步,看不见图像,重则将造成显示器烧毁。

一即第10章汇编语言程序设计实例

3.显示方式

由于设置或改变PC机的显示方式对时间的要求不

严格,而要编写设置或改变显示方式的程序很困难,

因此一般由DOS或BIOS调用来完成。

BIOS显示例程提供了设置显示方式的功能,程序

只要给出调用参数,使用BIOS的

INT10H即可建立某种显示方式。表10-2列出了几

种常用的显示方式。

委卜第10章汇编语言程序设计实例________________

表10-2INT1OH设置显示方式功能表(AH=OO)

显示方式

调用参数

(AL)

分辨率色度或灰度

0040X25文本16级灰度

0140X25文本16色或8色

0280X25文本16级灰度

0380X25文本16色或8色

04320X200图形4色

05320X200图形4色

06640X200图形黑白显示

一即第10章汇编语言程序设计实例

0780X25文本黑白显示

OD320X200图形16色

OE640X200图形16色

OF640X350图形黑白显示

10640X350图形4色或16色

11640X480图形黑白显示

12640X480图形16色

13320X200图形256色

一即第10章汇编语言程序设计实例

适用显示适配器

CGAMCGAEGAVGA

CGAMCGAEGAVGA

CGAMCGAEGAVGA

CGAMCGAEGAVGA

CGAMCGAEGAVGA

CGAMCGAEGAVGA

CGAMCGAEGAVGA

MDAEGAVGA

一即第10章汇编语言程序设计实例

EGAVGA

EGAVGA

EGAVGA

EGAVGA

MCGAVGA

VGA

MCGAVGA

第10章汇编语言程序设计实例

10.1.2DOS功能调用显示技术

操作系统的核心是由许多关于I/O驱动、磁盘读写

和文件管理等程序段构成的。这些程序段都编了号,

可由汇编语言的源程序调用。在调用时,把程序段的

号(或称系统功能调用号)送至AH,把程序段规定的

入口参数,送至指定的寄存器,然后由中断指令INT

21H来实现调用。在这里通过几个程序举例来介绍有关

I/O的功能调用,便于读者在编程中应用。

一即第10章汇编语言程序设计实例

【例10-1】在微型计算机系统上常常可以显示实时

时钟,这就要求能输出数码00〜59。要输出多于一个

字符时,要利用DOS功能调用9,它是向CRT输出字符

串的子程序,要求在调用前使DX指向字符串的首地

址,字符串必须以字符'、$〃结束,则功能调用9能把字

符''$〃之前的全部字符向CRT输出。系统调用形式如

下:

委卜第10章汇编语言程序设计实例________________

MOVDX,OFFSETOUTSTRING

;首地址装入DX寄存器

MOVAH,9;系统功能调用号送入AH

INT21H;启动DOS功能调用

程序流程图如图10.1所示。程序的清单如下:

TITLE例10-1.ASM

STACKSEGMENTPARASTACK'STACK'

第10章汇编语言程序设计实例

DB100DUP(?)

STACKENDS

DATASEGMENT

BUFFERDB3DUP(?)

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA,

SS:STACK

STARTPROCFAR

一即第10章汇编语言程序设计实例

图10.1例10-1流程图

第10章汇编语言程序设计实例

BEGIN:PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVCX,1000

MOVBL,0

LEASLBUFFER

PUSHBX

.,

第10章汇编语言程序设计实例

GOON:MOVDL,ODH

MOVAH,2

INT21H

MOVDL,OAH

MOVAH,2

INT21H

POPBX

第10章汇编语言程序设计实例

MOVAL,BL

INCAL

DAA

CMPAL,60H

JCNEXT

MOVAL,0

第10章汇编语言程序设计实例

NEXT:MOVBL,AL

PUSHBX

MOVDL,AL

PUSHCX

MOVCL,4

SHRAL,CL

ORAL,30H

MOV[SI],AL

第10章汇编语言程序设计实例

INCSI

MOVAL,DL

ANDAL,OFH

ORAL,30H

MOV[SI],AL

INCSI

MOVAL,$

MOV[SI],AL

MOVDX,OFFSETBUFFER

MOVAH,9

委卜第10章汇编语言程序设计实例________________

INT21H

MOVCX,OFFFFH

AGAIN:DECCX

JNEAGAIN

POPCX

DECCX

JEDONE

MOVSLOFFSETBUFFER

JMPGOON

KB*

第10章汇编语言程序设计实例

DONE:RET

STARTENDP

CODEENDS

ENDBEGIN

委卜第10章汇编语言程序设计实例________________

10.1.3BIOS功能调用显示技术

1.PC机彩色图形模式

PC机彩色图形适配器有两大类模式:一种是文本

(字符)模式(AN);另一种是图形模式(APA)。

而每种模式又可包括不同的显示方式,可以通过

BIOS的INT10H功能调用号0来设置或改变显示模式和

显示方式。采用BIOS设置显示方式见8.4节。

委卜第10章汇编语言程序设计实例________________

【例10-2】选择显示方式。程序流程图如图10.2所示。程

序的清单如下:

TITLE例10-2.ASM

STACKSEGMENTSTACKSTACK'

DB100DUP(O)

STACKENDS

DATASEGMENT

一即第10章汇编语言程序设计实例

ERRORDB...INPUTERROR!TRYAGAIN1,OAH,ODH,$

MSGODB***MENU***OAH,ODH,$

MSG1DB1,40*25B&WTEXT,OAH,ODH,$

MSG2DB2,40*25COLORTEXT*,OAH,ODH,$

MSG3DB3,80*25B&WTEXT,OAH,ODH,$

MSG4DB4,80*25CLOORTEXT,OAH,ODH,$

MSGSDB5,320*200COLORGRAPHICS1,0AH,0DH,$

MSG6DB6,320*200B&WGRAPHICS1,0AH,0DH,$

一即第10章汇编语言程序设计实例

COUNTEQU$-MSG6

MSG7DB♦PLEASECHOOSE'$

OKDBOAH,ODH,'SETDISPLAY

MODELOK!','$'

DATAENDS

CODESEGMENT

一即第10章汇编语言程序设计实例

图10.2例10-2流程图

委卜第10章汇编语言程序设计实例________________

ASSUMECS:CODE,DS:DATA,SS:STACK

SETMODEPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

委卜第10章汇编语言程序设计实例________________

TRV:MOVDX,OFFSETMSGO

MOVDLCOUNT

MOVCX,8

DMENU:CALLDISP

ADDDX,DI

LOOPDMENU

MOVAH,1

INT21H

CMPAL,31H

JLERR

KB*

一即第10章汇编语言程序设计实例

CMPAL,36H

JGERR

SUBAL,3OH

MOVAH,0

INT10H

JMPSETOK

ERR:MOVDX,OFFSETERROR

CALLDISP

一即第10章汇编语言程序设计实例

MOVAH,6

MOVAL,0

MOVBH,7

MOVCX,0

MOVDX,184FH

INT10H

JMPTRV

SETOK:MOVDX,OFFSETOK

第10章汇编语言程序设计实例

CALLDISP

RET

SETMODEENDP

DISPPROCNEAR

MOVAH,9

INT21H

RET

DISPENDP

CODEENDS

ENDSETMODE

委卜第10章汇编语言程序设计实例________________

2.在文本方式下显示字母、数字和一些字符图形

对屏幕上的每一个字符,首先应给出它的ASCII码

值,同时还要给出一个8bit(位)的属性字节。这个属性

字节对单色和彩色显示均有效,在单色文本下,只提

供闪烁、反显和亮度方面的属性。

【例10-3】在屏幕的第10行10列以绿底红字闪烁

显示''HOWDOYOUDO.〃,程序流程图如图10.3所示。

程序的清单如下:

第10章汇编语言程序设计实例

TITLE例10-3.ASM

STACKSEGMENTSTACKSTACK

DB100DUP(O)

STACKENDS

DATASEGMENT

MSGDB'HOWDOYOUDO/

COUNTEQUS-MSG

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACK

一即第10章汇编语言程序设计实例

图10.3例10-3流程图

一^¥第10章汇编语言程序设计实例

DISPLAYPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVAH,0

MOVAL,3

INT1OH

MOVBH,0

MOVDH,OAH

MOVDL,OAH

一即第10章汇编语言程序设计实例

MOVAH,2

INT10H

MOVSLOFFSETMSG

MOVDI,COUNT

DISP:MOVAL,[SI]

MOVAH,9

MOVCX,1

MOVBH,0

MOVBL,0A4H

INT10H

INCSI

INCDL

MOVBH,0

一即第10章汇编语言程序设计实例

MOVDH,0AH

MOVAH,2

INT10H

DECDI

JNZDISP

RET

DISPLAYENDP

CODEENDS

ENDDISPLAY

委卜第10章汇编语言程序设计实例________________

10.1.4彩色图形显示

彩色图形是在图形方式下,由一组像素点在屏幕

上形成的。图形方式相对于文本方式所要处理的数据

量大,而且不同的显示适配器所支持的分辨率不同,

因此同一彩色图形在不同分辨率的情况下,处理的数

据量差别很大。

一即第10章汇编语言程序设计实例

1.彩色绘图

在屏幕上绘制彩色图形,可用BIOS中INT10H的0

号、n号、12号和13号功能调用。利用INT10H的这些

功能调用,就可使屏幕上的绘图变得比较简单。通常

情况下,有以下几步:

第10章汇编语言程序设计实例

(1)用INT1OH的0号功能将显示方式设置成

320X200彩色图形方式。

MOVAH,0;设置显示方式

MOVAL,4

;置CGA为320X200彩色图形方式

INT10H;BIOS中断调用

第10章汇编语言程序设计实例

(2)用INT1OH的11号功能设置彩色图形方式下的调色板

或背景颜色。

MOVBH,0;设置背景色

MOVBL,C;C=颜色值(0〜16)

MOVAH,11;功能号送入AH

INT10H;BIOS中断调用

MOVBH,1;设置调色板

MOVBL,N;N+周色板号(0,1)

MOVAH,11

INT1OH

第10章汇编语言程序设计实例

(3)在上述工作的基础上,利用INT1OH的12号功

能调用或13号功能调用在屏幕上写彩色像素点或读彩

色像素点。

MOVAH,12;12号功能调用,写像素点

MOVAL,C;C=像素点颜色(0〜3)

MOVDX,ROW;ROW=行号(0-199)

MOVCX,COL;COLSJ号(0-319)

—即第10章汇编语言程序设计实例

INT1OH;BIOS中断调用

MOVAH,13;13号功能调用,读像素点

MOVDX,ROW;ROW=行号(0-199)

MOVCX,COL;COL例号(0-319)

INT10H;BIOS中断调用

委卜第10章汇编语言程序设计实例________________

2.彩色绘图举例

【例10-4】编写一个8086/8088汇编语言程序,使程

序运行后屏幕显示器成为一台电子钟。首先屏幕上显示

提示符,要求从键盘上输入当前时间,然后每隔一秒使

显示的秒值加1,达到60秒时使分值加1,秒值清零;达

到60分时使小时值加1,分值清零;达到24小时则小时

值清零。上述过程一直进行下去,当键入Ctrl+C时退出

''电子钟〃状态,返回DOS。

根据上述要求,可画出程序的流程图如图10.4所示。

一即第10章汇编语言程序设计实例

图10.4例10-4流程图

委卜第10章汇编语言程序设计实例________________

其中,显示一个字符串,以及从键盘上接收一个

字符串可分别通过09号和OAH号DOS功能调用实现。

延时1秒可以编写一个延时子程序。程序中对时、分和

秒三个时间单位有许多类似的操作。例如,分别将它

们由ASCII码转换为BCD码,或由BCD码转换为ASCII

码,以及将时、分和秒值分别加1,并进行DAA调整后

判断是否达到60H或24H等。对于这样的程序段,可以

采用宏处理伪指令,以便缩短源程序的长度,使程序

更加清晰,有利于结构的模块化。

此外,还可以利用BIOS调用设计窗口,选择适当

的背景色和前景色等,使屏幕显示更加美观。程序清

单如下:

一即第10章汇编语言程序设计实例

TITLE例10-4.ASM

DATASEGMENT

BUF1DB*Currenttimeis:$'

BUF2DB10

DB10DUP(?)

DATAENDS

STACKSEGMENTSTACK

DB100DUP(?)

STACKENDS

CODESEGMENT

委卜第10章汇编语言程序设计实例

ASSUMECS:CODE,DS:DATA

ASSUMESS:STACK

CURSORMACROROW,CLM

MOVAH,2

MOVBH,0

MOVDH,ROW

MOVDL,CLM

INT10H

ENDM

第10章汇编语言程序设计实例

WINMACROROWL,CLML,ROWR,

CLMR,COLOR

MOVAH,6

MOVAL,0

MOVCH,ROWL

MOVCL,CLML

MOVDH,ROWR

MOVDL,CLMR

MOVBH,COLOR

INT10H

ENDM

第10章汇编语言程序设计实例

ASCBCDMACROREG

INCBX

INCBX

MOVREG,[BX]

MOVCL,4

SHLREG,CL

INCBX

MOVAL,[BX]

ANDAL,OFH

ORREG,AL

ENDM

一即第10章汇编语言程序设计实例

BCDASCMACROREG

INCBX

INCBX

MOVAL,REG

MOVCL,4

SHRAL,CL

ORAL,3OH

MOV[BX],AL

INCBX

MOVAL,REG

ANDAL,OFH

ORAL,3OH

MOV[BX],AL

ENDM

一即第10章汇编语言程序设计实例

INCBCDMACROREG,COUNT

MOVAL,REG

INCAL

DAA

MOVREG,AL

CMPAL,COUNT

JNZDISPY

MOVREG,0

ENDM

第10章汇编语言程序设计实例

STRDSPYMACROADRS

LEADX,ADRS

MOVAH,9

INT21H

ENDM

CLOCKPROCFAR

START:PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

—即第10章汇编语言程序设计实例

WIN0,0,24,79,7,

WIN9,28,15,52,01010111B

CURSOR11,32

STRDSPYBUF1

CURSOR13,36

LEADX,BUF2

MOVAH,OAH

INT21H

LEABX,BUF2

ASCBCDCH

ASCBCDDH

ASCBCDDL

一即第10章汇编语言程序设计实例

TIMER:CALLDELY

INCBCDDL,60H

INCBCDDH,60H

INCBCDCH,24H

DISPY:LEABX,BUF2

BCDASCCH

BCDASCDH

BCDASCDL

INCBX

MOVAL,$

第10章汇编语言程序设计实例

MOV[BX],AL

PUSHDX

CURSOR13,36

STRDSPYBUF2

POPDX

JMPTIMER

DELYPROC

PUSHCX

PUSHAX

MOVAX,3FFFH

第10章汇编语言程序设计实例

XI:MOVCX,OFFFFH

X2:DECCX

JNEX2

DECAX

JNEXI

POPAX

POPCX

RET

DELYENDP

CLOCKENDP

CODEENDS

ENDSTART

一即第10章汇编语言程序设计实例

用这个程序可在屏幕上画出一些复杂图形,如多

边形、山水花鸟和汽车等,也可在该程序的基础上增

加图形装入、存盘和打印功能,以提高程序的实用性。

<Back

一即第10章汇编语言程序设计实例

10.2音频发声系统程序设计

10.2.1PC机的发声原理

IBM-PC系列机的主机箱装有一个小扬声器,系统

板上的定时器8253(或8254)利用工作方式3产生一定

频率信号,通过可编程的并行外围接口芯片8255(或

8255A)控制其发音。扬声器的控制驱动电路如图10.5

所示。

一即第10章汇编语言程序设计实例

图10.5扬声器控制驱动电路

委卜第10章汇编语言程序设计实例________________

可编程的并行接口芯片8255有三个8位的并行端口:

A口、B口和C口。在IBM系列微机中,BIOS在开机自

检后已将8255初始化为A口和C口用于输入,B口用于

输出。B口的I/O端口地址为61H。

由图10.5可见,8255B口的低两位用来控制扬声器

驱动,当输出端口61H的D1位为或为''0〃时,将使

控制驱动器的与门电路接通或关闭,使8254所发出的

音频信号能到达驱动器或被阻断。这样通过控制D1位

的变化,可使扬声器接通和断开,控制扬声器是否能

发出声音。此外,通过控制D1位的通断时间,就能发

出不同的音长。

委卜第10章汇编语言程序设计实例________________

61H端口的DO位为''1〃时,控制8254定时器产生驱

动扬声器发声的音频信号,该位为''0〃则不发信号。

8254有三个定时器,分为0号、1号和2号定时器,驱动

扬声器的是2号定时器,该定时器工作在方式3,是一

个频率发生器,它负责向扬声器发送指定频率的脉冲

信号。

当8255输出端口61H的D1位为''1〃时,在61H的DO

位为'、1〃,8254发出指定频率的声音信号的前提下,声

音信号通过与门到达驱动器驱动扬声器发声。本节主

要介绍利用8254产生声音和乐曲。

一即第10章汇编语言程序设计实例

10.2.2发音程序

BIOS中有一个BEEP子程序,它可以产生896Hz的

声音,且声音持续时间只能是0.5s的整数倍。BEEP子

程序用于PC机加电自检发现硬件错误,或正常进入系

统等过程后,向用户发出声音提示。可以利用这一子

程序的思路,来编写通用的发音程序。

发音程序的编制需要进行以下四个方面工作。

第10章汇编语言程序设计实例

(1)确定发声频率。BEEP子程序将计数值533H送

8254的定时器2而产生896Hz的声音,那么要产生其他

频率的声音,则必须将对应频率的计数值送8254的定

时器2产生其他频率声音的计数值。该方法如下所示:

533Hx896♦给定频率=123280+给定频率

(也可用定时器的时钟1192576Hz直接计算计数值:

1192576+给定频率。)

假设给定频率在DI中,可用下面的指令序列在AX

中得到计数值。

委卜第10章汇编语言程序设计实例________________

MOVDX,12H

MOVAX,3280

DIVDI;计算某频率的计数值

为了不产生除法溢出,限制DI中的频率不低于19

Hz,一般情况下声音频率不会这样低。

一即第10章汇编语言程序设计实例

(2)确定音长。BEEP子程序只能产生持续时间(音

长)为0.5s的整数倍的音长,如果要求持续时间容易调

整,利用软件延时程序可选择较短的持续时间作为基

数,如10ms(毫秒)。10ms延时可由执行循环指令实

现:

MOVCX,2801

DELAY:LOOPDELAY

如果要产生与10ms成倍数的延时,可将倍数送到BX

寄存器中,由BX再控制10ms延时指令的执行次数。如

产生0.5s持续时间,则将50送入BX中,指令序列如下:

第10章汇编语言程序设计实例

MOVBX,50

DELAYO:MOVCX,2801

DELAY1:LOOPDELAY1

DECBX

JNZDELAYO

一即第10章汇编语言程序设计实例

(3)定时器调节。在对BEEP子程序作上述两方面修

改的基础上就可以编写一个任一频率(由DI指定)和

任一持续时间(由CX和BX指定)的通用发音程序。

由于该发音程序使用8254定时器2产生声音的频率,因

此需要对定时器2进行相应的设置。

①对输入/输出端口43H(该端口分配给8254的工

作方式寄存器)送一个特定的数0B6H,这个数用于对

定时器2的工作方式进行初始化,使定时器2准备接收

计数值。

一即第10章汇编语言程序设计实例

②对输入/输出端口42H(该端口分配给定时器2)

中送一个16位的计数值(即123280+给定频率),用

于设置将要产生的声音频率。

(4)操作扬声器开关。由于扬声器驱动由8255的输

出端口61H的低两位控制,故应把输出端口61H的Do和

D]位置、'1〃,以便使扬声器发出声音。

一即第10章汇编语言程序设计实例

10.2.3乐曲演奏程序

利用通用发音子程序CSOUND,可以编写演奏乐

曲程序。在乐曲中,每个音符的音高和音长与频率节

拍有关。下面给出音律表的一部分,见表10-3,该表

对应3个音阶。

委卜第10章汇编语言程序设计实例________________

表10-3音阶频率对照表

音名CDEFGABCD'E'F'G'A'B'

简谱....i"2345671234567

频率131147165175196220247262294330349392440494

C"D"E"F"G"A"B"

1234567

524588660698784880984

委卜第10章汇编语言程序设计实例________________

演奏乐曲的程序中需要有两组数据支持:一组是

频率数据;一组是节拍时间数据。音符的频率可以从

表10-3中查得。节拍时间就是音符的持续时间,取决

于乐曲的速度和每个音符的节拍数据。如4/4(四四拍)

中,每小节包括4拍,全音符持续4拍,二分音符持续2

拍,四分音符持续一拍,八分音符持续半拍等。

有了音调与频率和时间的关系后,就可以按照乐

曲的曲谱将每个音符的频率和持续的时间定义成两组

数据表,然后编程依次取出表中的频率值和时间值,

调用CSOUND子程序就可发出各种声音。例10-5的程

序中为全音符分配了1s时间。

一即第10章汇编语言程序设计实例

【例10-51图10.6是“两只老虎”的简谱。根据乐

谱在数据段中定义了频率数据表(Freq)和节拍时间

数据表(Time),程序以?1作为频率数据表的结束标

志。程序流程图如图10.7所示,演奏该乐曲程序如下:

1=C4/4

一即第10章汇编语言程序设计实例

1=C4/4

1231|1231|345-1345-|

565J31|565431|251-|251-

图10.6“两只老虎”简谱

一即第10章汇编语言程序设计实例

NAME例10-5.ASM

DATASEGMENT

FREQW262,294,330,262,262,294,330,262

W330,349,392,330,349,392,392,440

W392,349,330,262,392,440,392,349

DW330,262,294,196,262,294,196,262,-1

一即第10章汇编语言程序设计实例

TIMEDW25,25,25,25,25,25,25,25,25,25

DW50,25,25,50,12,12,12,12,25,25

DW12,12,12,12,25,25,25,25,50,25,

25,50

SNAMEDBTWOTIGER.

DATAENDS

STACKSEGMENTSTACKSTACK

DB100DUP(O)

STACKENDS

CODESEGMENT

ASSUMECS:CODE,SS:STACK,DS:DATA

一即第10章汇编语言程序设计实例

图10.7例10-5流程图

一即第10章汇编语言程序设计实例

PLAYPROCFAR

PUSHDS

MOVAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETSNAME

MOVAH,9

INT21H

MOVAL,0B6H

OUT43H,AL

MOVBP,OFFSETTIME

MOVSI,OFFSETFREQ

一即第10章汇编语言程序设计实例

SONG:MOVDL[SI]

CMPDL?1

JZEXIT

MOVBX,DS:[BP]

CALLCSOUND

INCSI

INCSI

INCBP

INCBP

JMPSONG

委卜第10章汇编语言程序设计实例

EXIT:RET

CSOUNDPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

MOVDX,12H

MOVAX,34DCH

DIVDI

OUT42H,AL

一即第10章汇编语言程序设计实例

MOVAL,AH

OUT42H,AL

INAL,61H

MOVAH,AL

ORAL,03H

OUT61H,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论