微型計算機匯編語言設計 第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

提交評論