微機原理課程設(shè)計指導(dǎo)書_第1頁
微機原理課程設(shè)計指導(dǎo)書_第2頁
微機原理課程設(shè)計指導(dǎo)書_第3頁
微機原理課程設(shè)計指導(dǎo)書_第4頁
微機原理課程設(shè)計指導(dǎo)書_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1題目一:動畫程序設(shè)計本題目重點考查 bios 中斷調(diào)用中顯示器控制的子程序調(diào)用。主要包括:顯示器顯示方式設(shè)置,背景顏色和前景顏色設(shè)置及寫像素點等。設(shè)計要求:1)以滾動方式輸出小車動態(tài)行駛圖形。2)小車在公路上動態(tài)行駛,從屏幕左側(cè)駛向屏幕右側(cè)。在到達屏幕右側(cè)后,公路下降一段距離并改變顏色,然后小車繼續(xù)由左向右行駛。3)當(dāng)下降到屏幕底部時,再返回到屏幕頂部重復(fù)上述過程。4)直到有鍵按下,程序運行結(jié)束。題目二:音樂程序設(shè)計通過該題目的設(shè)計過程掌握 pc 及內(nèi)部接口電路 8255、8253 的應(yīng)用方法、bios 中斷調(diào)用。以及 8253。8255 芯片的初始化編程和音樂程序的設(shè)計方法。設(shè)計要求:1)

2、利用系統(tǒng)內(nèi)部的發(fā)聲電路,產(chǎn)生音頻聲音。2)選擇一首歌曲,對其進行編程。3)運行程序后能夠反復(fù)演奏這首歌曲。題目三:電子時鐘程序設(shè)計通過該題目的設(shè)計過程,熟悉和掌握主機內(nèi)的 82538254-2 的計數(shù)器的應(yīng)用,掌握匯編語言編程,時、分、秒在屏幕上顯示的方法。熟悉和掌握主機內(nèi)中斷控制器 8259a的使用方法。熟悉借用原有電路,重新設(shè)置定時器、編寫中斷服務(wù)程序的方法。設(shè)計要求:1)利用 pc 系列微機現(xiàn)有的硬件和軟件資源編寫時鐘程序,在 crt 屏幕上顯示xx(時):xx(分):xx(秒),并且每秒鐘更新一次顯示。2)程序從按下任意鍵開始顯示數(shù)據(jù)區(qū)中存放的時間值。3)運行中按下空格鍵則停止運行返回

3、 dos。題目四:畫圖程序設(shè)計通過該題目的設(shè)計過程,熟悉和掌握通過 bios int 10h 調(diào)用,將屏幕的工作方式設(shè)置為圖形方式。確定好坐標,用寫像素子程序畫出線段,實現(xiàn)繪圖。2設(shè)計要求:1)利用匯編語言在圖形形式下的編程方法設(shè)計一個圖形。2)通過 crt 顯示一個圖形,圖形不能過于簡單。題目五:簡單計算器程序設(shè)計 通過該題目的設(shè)計過程,熟悉和掌握 bios 調(diào)用,利中 int 16h 調(diào)用完成清屏、設(shè)置顯示方式、設(shè)置窗口等操作。掌握 int 21h dos 系統(tǒng)功能調(diào)用,從鍵盤輸入接收十進制操作數(shù)和運算符,由程序完成字符到二進制數(shù)的轉(zhuǎn)換,并存儲。掌握根據(jù)運算符完成運算,由程序在屏幕上顯示運

4、算結(jié)果等方法。設(shè)計要求 1) 設(shè)計一個簡單的計算器程序。2)在屏幕上顯示一個小窗口,將光標定位在窗口內(nèi)。3)通過運行程序,在窗口內(nèi)輸入一個表達式(單項運算)。4)根據(jù)表達式計算運算結(jié)果,并在表達式的后面顯示一個“=”和運算結(jié)果。題目六:歌手大獎賽計分程序設(shè)計通過該題目的設(shè)計過程,熟練掌握匯編語言程序設(shè)計與調(diào)試方法。熟練掌握 ascii碼轉(zhuǎn)換成 bcd 碼及碼制轉(zhuǎn)換程序設(shè)計方法。熟練掌握數(shù)值運算的程序時間和調(diào)試方法。熟練掌握 dos 功能調(diào)用設(shè)計要求:1)根據(jù)歌手大獎賽的要求,設(shè)計一個計算平均分的程序。2)每位歌手的分數(shù)通過鍵盤輸入。3)評委人數(shù)共 10 人,去掉最高分和最低分后,求平均值。4)

5、屏幕顯示每位評委的打分和最后得分。題目七:字符串動畫顯示程序設(shè)計通過該題目的設(shè)計過程,學(xué)習(xí)字符串的動畫顯示,左移位、右移位顯示的編程方法。熟練掌握宏指令的使用方法,熟練掌握匯編語言程序設(shè)計與調(diào)試方法。設(shè)計要求:1)動態(tài)的顯示一個字符串應(yīng)用程序的標題欄。2)采用左、右移位的顯示方法,動態(tài)的顯示一個字符串。3動畫程序設(shè)計動畫程序設(shè)計一、設(shè)計要求:一、設(shè)計要求:1. 以滾動方式輸出小車動態(tài)行駛圖形。2. 小車在公路上動態(tài)行駛,從屏幕左側(cè)駛向屏幕右側(cè)。在到達屏幕右側(cè)后,公路下降一段距離并改變顏色,然后小車繼續(xù)由左向右行駛。3. 當(dāng)下降到屏幕底部時,再返回到屏幕頂部重復(fù)上述過程。4. 直到有鍵按下,程序

6、運行結(jié)束。二、設(shè)計思路:二、設(shè)計思路:本題目重點考查 bios 中斷調(diào)用中顯示器控制的子程序調(diào)用。主要包括: 1. 顯示器顯示方式設(shè)置。 2. 背景顏色和前景顏色設(shè)置。 3. 寫像素點等。三、參考程序三、參考程序 data segment line dw 10 ;定義行變量 color db 0 ;定義公路顏色 colorl db 0 ;定義 小車顏色 corlun dw 2 ;定義列變量 countl dw 0 count2 dw 0 count3 dw 0 car-8 db 00000011b,11100000b ; 車體模型 db 00000010b,01010000b db 00000

7、110b,01011000b db 01111111b,11111110b db 11111111b,11111111b db 11111011b,11101lllb db 00001010b,00101000b db 00000100b,00010000bdata endscode segment assume cs:code,ds:data4start:mov ax,data mov ds,ax mov dx,80 mov ah,0fh int 01hll:mov al,color ; 設(shè)置公路顏色 inc al cmp al,3 jbe tt sub al,3tt:mov color,a

8、l ; 設(shè)置小車顏色 cmp al,l jz tt3 inc al cmp al,3 jz tt2tt3:inc altt2:mov colorl,al mov ax,line ;計算機行坐標 add ax,10 cmp ax,180 jbe ttl sub ax,180 ttl:mov line,ak ; 設(shè)置顯示方式(320x200) mov ax,0004h int 10h mov ah,0bh mov bh,1 ;選擇 1 號調(diào)色板 mov bl,0 int 10h mov ah,0ch ; 寫像素 mov dx,line add dx,8 ;計算公路坐標 mov cx,0 mov a

9、l,color ;設(shè)置公路顏色repet:mov bx,3 push ax int 10h ; 畫公路5 pop ax inc cx cmp cx,319 jnz repet ;未到屏幕最右轉(zhuǎn) mov ah,0ch add dx,line ;設(shè)置行坐標 mov cx,corlum ; 設(shè)置列坐標 mov si,offset car-8 ;取車模首地址 mov countl,8 ; 8 行retry1:mov count2,2 ;每行 2 字節(jié)retry2:mov count3,8 ; 每字節(jié) 8 位retry3:rol byte ptrsi,1 mov al,0 ;此位為 0,置背景顏色 jn

10、c next mov al,color1 ;此位為 1,置背景顏色next:push ax push cx int 10h ;畫個點 pop cx pop ax inc cx ; 列加 1 dec count3 jnz rktry3 ;未畫完 8 個點轉(zhuǎn) inc si ;取下一個字節(jié)的車模信息 dec count2 ; jnz retry2 ;車模信息未完轉(zhuǎn) inc dx mov cx,corlum dec countl jnz retry1 ;未畫完 8 行轉(zhuǎn) mov count1,320+10 ;設(shè)置移動總次數(shù) mov cx,corlum add cx,15 ;取小車最右點的列坐標送 cx

11、repetl:push cx mov count2,16 土 1 ;小車橫向有 16 個點,外加 1 個空白點repet2:mov dx,line mov count3,8 ;車模向右移動 1 個像素位repet3:mov ah,0dh 6int 10h ;讀當(dāng)前點 mov ah,0ch push cx inc cx int 10h ;寫當(dāng)前右邊的點 pop cx inc dx ;行坐標加 1 dec count3 jnz repet3 ;車模向右移動 1 個像素位未完轉(zhuǎn) dec cx ;修改列坐標 dec count2 jnz repet2 ;小車移動 1 個車體位未完轉(zhuǎn) pop cx in

12、c cx ;修改列坐標 mov ah,1 int 16h jnz exit ;有鍵按下,轉(zhuǎn)退出 dec countl jnz repetl jmp ll ;無鍵按下,繼續(xù)執(zhí)行exit: mov ah,0 ;恢復(fù)文本顯示方式 mov al,2 int 10h mov ah,4ch int 21h code ends end start 四、課題設(shè)計要求:1.讀懂題目的設(shè)計思路,編程方法。2.畫出設(shè)計題目的程序框圖。3.根據(jù)課題的要求重新編寫程序并調(diào)試通過4. 寫出設(shè)計報告,打印程序清單,并加以注釋釋。7音樂程序設(shè)計音樂程序設(shè)計一、設(shè)計要求:一、設(shè)計要求:1. 利用系統(tǒng)內(nèi)部的發(fā)聲電路,產(chǎn)生聲音。2

13、. 選擇一首歌曲,對其進行編程。3. 運行程序后能夠反復(fù)演奏這首歌曲。二、二、pc 機發(fā)聲系統(tǒng)機發(fā)聲系統(tǒng)1.發(fā)聲系統(tǒng):pc 機發(fā)聲系統(tǒng)電路結(jié)構(gòu)如圖 3-1 所示。8253/8254 2 號計數(shù)器,口地址=42hf=1.193182mhz8255 b 口 口地址=61h圖 3-1 pc 機發(fā)聲系統(tǒng)電路框圖上圖給出了 pc 機的發(fā)聲系統(tǒng),其核心部件為系統(tǒng)定時器的 2 號計數(shù)器。系統(tǒng)初始化時,2 號計數(shù)器的工作方式為”方波發(fā)聲器” ,計數(shù)初值(533h)為二進制數(shù),初值的寫入順序為先低 8 位,后高 8 位。用戶在使用系統(tǒng)資源時,沒有必要對 2 號計數(shù)器重新設(shè)定工作方式,只需要改變計數(shù)初值,就可以得

14、到不同頻率的方波輸出。clk2 的輸入頻率為 1.193182 兆赫,門控信號 gate2,以及揚聲器輸入受系統(tǒng) 8255 芯片的 pb0、pb1 端控制。顯然,執(zhí)行一下的 open 子程序可以接通揚聲器,執(zhí)行 close 子程序可以關(guān)閉揚聲器。openproc;接通揚聲器子程序pushaxinal,61horal,00000011b;pb0、pb1=11bout61h,alpopaxretpb0pb1clk2gate2out2濾波、驅(qū)動8openendpcloseproc;關(guān)閉揚聲器子程序pushaxinal,61handal,11111100b;pb0、pb1=00bout61h,alpo

15、paxretcloseendp2. 演奏單音符每一種曲調(diào)中,各個音符均有不同的頻率。對 2 號計數(shù)器,只有設(shè)置不同的計數(shù)初值,即可輸出不同的頻率,從而發(fā)出不同的音調(diào)。計數(shù)初值的計算公式如下:計數(shù)初值=1.193182 兆赫/輸出頻率1.193182 兆赫轉(zhuǎn)換成 16 進制數(shù)應(yīng)為 1234deh。因此在接通揚聲器的前提下,執(zhí)行下列程序段即可發(fā)出與輸出頻率對應(yīng)的音調(diào)。movdx,0012hmovax,34dehmovcx,頻率值divcxout42h,almoval,ahout42h,al如何控制每一個音調(diào)的演奏時間呢?在 at 機上最簡便的方法是調(diào)用 int 15h 的86h 號子程序:mova

16、h,86hmovcx,timehmovdx,timelint15h其中,timeh、timel 為延時時間的高、低 16 位二進制數(shù),單位微秒。三、音樂程序設(shè)計思路:三、音樂程序設(shè)計思路:1. 首先在數(shù)據(jù)段設(shè)計頻率表和時間表。將音符對應(yīng)的頻率值依次寫入頻率表中。各音符的演唱時間依次寫入時間表。頻率和時間表的表項要一一對應(yīng),不能錯位。頻率表最后一項為 0 值,做為重復(fù)演唱的標志。2. 時間表的內(nèi)容有兩種設(shè)置方法。9 時間表中設(shè)置每一音符演唱的絕對時間。這種方法程序直觀,但是開發(fā)速度慢,程序調(diào)試比較困難,特別是一首不熟悉的歌曲,對那些缺少音樂細胞的人來說,很難把握演唱的節(jié)奏,初期很難確定每個音符的

17、演唱時間,因此調(diào)試十分困難。 時間表中設(shè)置每個音符演唱的”單位時間” 單位時間n=演唱時間 友友 誼誼 地地 久久 天天 長長 1=f 2/4 蘇格蘭民歌5 11 1 3 21 2 3 11 3 5 6 66 1. 怎 能 忘 記 舊 日 朋 友,心 中 能 不 懷 想, 舊 2. 我 們 曾 經(jīng) 終 日 游 蕩,在 故鄉(xiāng)的 青 山 上, 我 5 3 3 1 21 2 3 16 6 5 1 6 53 3 1 日 朋 友 豈 能 相 忘,友 誼 地 久 天 長; 友 誼 萬門 也 曾 歷 盡 苦 辛,到 處 奔 波 流 浪; 21 2 6 53 3 5 6 1 53 3 1 21 2 3歲, 友

18、 誼 萬 歲!舉 杯 痛 飲,同 聲 歌 頌 友16 6 5 1 : 誼地 久 天 長。四、音符頻率表四、音符頻率表(單位:赫茲)音符音調(diào)1234567abcdefg221248131147165175196248278147165185196221278312165185208221248249330175196221234262330371196221248262294371416221248278294330416467248278312330371音符音調(diào)1234567abcdefg4414952622943303503934955562943303713934415566243303

19、71416441495589661350393441467525661742393441495525589742833441495556589661833935495556624661742音符音調(diào)1234567abc8829905259901112589111212486611178132270013221484786148416658821665186999010defg5896617007866617427868827428338829907868829351049882990104911789901112117813221112124813221484其中,n 為調(diào)試參數(shù),用 equ

20、偽指令定義,初值先行估算,調(diào)試時再修改。如何確定音符演唱的單位時間呢?我們知道,音符的演唱時間分為:一拍,半拍,四分之一拍,八分之一拍等。假定一拍的單位時間為 8,那么半拍的單位時間即為 4,四分之一時間的單位時間為 2。 如果時間表中設(shè)置單位時間,只需對程序稍加修改,就可以使每一遍演唱的速度不同,極有趣味性。此外,對于連續(xù)演唱的相同音符,其頻率值可做適當(dāng)修改,以達到最佳效果。本程序的時間表,設(shè)置音符演唱的單位時間。五、程序清單:五、程序清單: ;filename:musicasmdata segmenttabf dw -,262,350,352,350,441,393,350,393,441

21、 dw 350,352,441,525,589,588,594,525,441 dw440,350,393,350,393,441,350,294,293,262 dw 350,589,525,441,440,350,393,350,393,589dw525,441,440,525,589,700,525,441,440,350dw393,350,393,441,350,294,292,262,350,0tablt db4,4,6,2,4,4,6,2,4,4db6,2,4,4,12,1,3,6,2 db4,4,6,2,4,4,6,2,4,4db12,4,6,2,4,4,6,2,4,4db6,2

22、,4,4,12,4,6,2,4,4db6,2,4,4,6,2,4,4,16n1equ1000n2equ150dataendscodesegmentassume cs:code,ds:databeg: movas,datamov ds,axopen: inal,61horal,00000011bout61h,al ;接通揚聲器aga:movsi,offset tabfmovdi,offset tabt11last: cmpword ptr si,0 ;唱完一遍?jeaga ;是movdx,12hmovax,34dehdivword ptr si ;頻率轉(zhuǎn)換成計數(shù)初值out 42h,al ;低 8

23、 位送 2 號計數(shù)器moval,ahout 42h,al ;高 8 位送 2 號計數(shù)器addsi,2calldelay ;延時mov ah,1int16h ;有否鍵入jzlast ;否close:inal,61h and al,11111100b out61h,al ;關(guān)閉揚聲器movah,4chint21h;delay proc ;延時程序 movax,n1 movdh,0movdl,dimuldx ;ax=單位時間n1movdx,n2muldx ;dx、ax=演唱時間(微秒)movcx,dxmovah,86hint15hadddi,1retdelay endpcodeendsendbeg

24、12電子時鐘時鐘程序設(shè)計 一、設(shè)計要求:一、設(shè)計要求:1.利用 pc 系列微機現(xiàn)有的硬件和軟件資源編寫時鐘程序,在 crt 屏幕上顯示xx(時):xx(分):xx(秒),并且每秒鐘更新一次顯示。2.程序從按下任意鍵開始顯示數(shù)據(jù)區(qū)中存放的時間值。3.運行中按下空格鍵則停止運行返回 dos。 二、設(shè)計思路:二、設(shè)計思路:利用主機內(nèi)的 82538254-2 的計數(shù)器 0 產(chǎn)生 10ms 對稱方波輸出,該輸出送至 irq0使 8259a 每 10ms 產(chǎn)生一次中斷,100 次中斷后秒量+1,然后調(diào)整時、分、秒并顯示在屏幕上。1ibmpcxt 系統(tǒng)板上使用了一片 8253-5,其地址 4043h,其中

25、0 通道工作于方式 3,每 55ms 向中斷控制器 8259a 的 irq。端發(fā)一次中斷請求。此定時中斷的用途之一系統(tǒng)報時。現(xiàn)在借用原有電路,重新設(shè)置定時器、編寫中斷服務(wù)程序來做硬件時鐘實驗,為此程序開始應(yīng)首先保護原系統(tǒng)的 08h 中斷的中斷矢量(中斷服務(wù)程序入口地址),以便程序退出時恢復(fù)原系統(tǒng)的設(shè)置。保護原系統(tǒng) 08h 中斷矢量可用 dos 35h 功能調(diào)用讀出加以適當(dāng)保存,也可以用以下指令,將中斷矢量壓入堆棧保存。 cli ;關(guān)中斷 cld ;df0 mov ax,0000h mov ds,ax ; ds:si 指向 08h 中斷矢量在中斷矢量表中的位置 mov si,0020h lods

26、w mov bx,ax ;bx原中斷服務(wù)程序入口偏移地址 lodsw ;ax原中斷服務(wù)程序入口的段地址 push ax ;壓棧保護 push bx 2將現(xiàn)中斷服務(wù)程序入口地址填入中斷矢量表中除了可用 dos 25h 功能調(diào)用外也可使用以下指令。 mov ax,0000h mov es,ax movdi,0020h ;es:di 指向 08h 中斷矢量在中斷矢量表中的存放位置。13 movax,offset timer stosw ;寫入中斷服務(wù)程序的偏移地址 mov ax,seg timer stosw ;寫入中斷服務(wù)程序的段地址 3. 借用系統(tǒng)用的 08h 中斷還應(yīng)注意保護原 8259a 的

27、中斷屏蔽寄存器內(nèi)容。讀或?qū)?259a 的奇地址可以得到和改寫 imr 寄存器的內(nèi)容。執(zhí)行 inal,21h push ax兩條指令可以得到 imr 的值并壓入堆棧保護。執(zhí)行 mov al,0fch out 21h,al 兩條指令又可以重寫 1mr,使之只開放時鐘和鍵盤的中斷。 在程序退出前又應(yīng)恢復(fù)原 imr 值。用 pop ax out 21h,al 指令可以將原壓入堆棧保護的 imr 值重新寫入中斷屏蔽寄存器。 4中斷服務(wù)程序的編寫 中斷服務(wù)程序主要完成秒、分、時的調(diào)整并重寫入數(shù)據(jù)區(qū)中。中斷服務(wù)程序中所用寄存器如與主程序有沖突,應(yīng)該在中斷服務(wù)程序一開始用壓棧指令保護主程序中寄存器內(nèi)容,中斷返

28、回前用出棧指令恢復(fù)其內(nèi)容。注意,先壓入的寄存器應(yīng)該后彈出。最后在中斷返回前還應(yīng)向 8259a 發(fā)中斷結(jié)束命令,使 8259a 內(nèi)的在服務(wù)寄存器中的相應(yīng)位(bit)復(fù)位; mov al,20h out 20h,al 5有關(guān)字符輸入的 dos 功能調(diào)用。 (1) 等待鍵盤輸入并顯示(dos 1 號功能調(diào)用)調(diào)用格式:mov ah,01h int 21h功能:計算機等待鍵盤輸入一個字符,若有字符輸入,則送屏幕顯示。在等待期間,檢查”ctrl+break 或 ctrl 十 c 鍵。若是,皿終止鍵盤等待,退出本調(diào)用。入口:無出口:al 是鍵盤輸入的字符的 ascii 碼。 (2) 等待鍵盤輸入但不顯示(

29、dos 7 號功能調(diào)用)14調(diào)用格式:mov ah,07h int 21h功能:等待標準輸入設(shè)備輸入一個字符,但不送屏幕顯示。本調(diào)用不檢查 ctrl+break和 ctrl+c 鍵。 入口;無 出口:al 是輸入字符的 ascii 碼。 (3) dos 8 號功能調(diào)用 本調(diào)用與 07h 調(diào)用類同,只是檢查 ctrl+break 和 ctrl 十 c 鍵。 (4) 直接控制臺輸入輸出(dos 6 號功能調(diào)用) 調(diào)用格式:mov dl,x mov ah,06h int 21h 功能;從控制臺(或鍵盤)輸入或向屏幕輸出字符。本調(diào)用可輸入輸出定向。 輸入方式(xffh(255) 當(dāng) x 取 ffh 時

30、,讀鍵盤,但不等待鍵盤操作。調(diào)用后若零標志 zf=0,則 al 是鍵入的字符的 asch 碼。若 zf=1,則無鍵盤輸入,且 al 被置 0。 輸出方式(xffh) 當(dāng) x 取非 ffh 時,輸出字符,其中 dl 是要輸出字符的 asc碼。 注釋:本調(diào)用不理睬 ctrl+break 或 ctrl+c 鍵。 在程序運行過程中,檢測是否按下空格鍵,按下空格鍵則停止運行返回 dos,不按空格鍵則繼續(xù)顯示時間,可以采用 6 號調(diào)用的輸入方式來實現(xiàn): mov dl,0ffh mov ah,06h int 21h jzdisp ;無鍵按下轉(zhuǎn)顯示 disp cmp al,20h ;有鍵按下,是空格鍵嗎? j

31、z exit ;是空格鍵,退出 disp:mov dx,offsettenh ;不是,顯示時間 mov ah,09h int 21h三、參考程序三、參考程序: ;pcclkasm 8253 10ms interrupt page 60,7815 stack segment para stack “stack” db 256dup(0) stack ends data segment para public “data” count db 100 tenh db “2” hour db”3” tenm db”5” minute db”9” db “:” tens db”5” second db”

32、0” ,0dh, ”$” data ends code segment para public”code” start proc far assume cs:code push ds mov ax,0 push ax mov ah,01h ;等待鍵按下,al=字符的 asch 碼 int 21h cli cld mov ax,0000h mov ds,ax mov si,0020h ;ds:si 指向 08h 中斷向量 lodsw ;取 08 中斷入口的偏移地址 mov bx,ax lodsw ;取 08 中斷入口段地址 push ax ;壓棧保護 push bx mov ax,data ;建

33、立數(shù)據(jù)段的可尋址性 mov ds,ax assume ds:data mov ax,0000h mov es,ax mov di,0020h ;es:ds 指向 08 中斷向量存放地址 mov ax,offset timer16 stosw ;寫入偏移地址 mov ax,cs stosw ;寫入段地址 mov al,00110110b;8253 初始化,0 通道,3 方式,hex out 43h,al mov ax,11932 ;初值:11932 out 40h,al mov al,ah out 40h,al in al,2lh ;讀 8259 的中段屏蔽寄存器 imr push ax ;壓棧

34、保護 mov al,0fch out 21h,al ;寫 imr,只允許定時器和鍵盤中斷 stiforever: mov dl,0ffh ;有鍵按下嗎? mov ah,06h int 21h jz disp ;無鍵按下則轉(zhuǎn)顯示 disp cmp al,20h ;是空格鍵嗎? jz exit ;是則退出disp: mov dx,offsettenh ;不是則顯示時間 mov ah,09h int 21h mov al,second ;取秒單元值waitcha:cmp al,second ;改變否? jz waitcha ;沒變則等待, jmp forever ;變則轉(zhuǎn) foreverexit:

35、cli ;有空格鍵按下退出 cld pop ax out 21h,al ;恢復(fù) imr mov al,36h ;8253 初始化,55ms out 43h,al mov al,0 out 40h,al out 40h,al mov ax,0 ;恢復(fù) 08h 中斷中斷向量 mov es,ax17 mov di,48 pop ax stosw pop ax stosw sti rettimer proc far push ax dec count jnz l2 ;不到 1 秒 l2 mov count,100 ;到 1 秒,重置 count,并修改時間 inc second cmp second,

36、 ”9” jle timext mov second, ”0” inc tens cmp tens, ”6” jl timext mov tens, ”0” inc minute cmp minute, ”9” jle timext mov minute”0” inc tenm cmp tenm, ”6” jl timext mov tenm, ”0” jmp l3l2: jmp timextl3: mov al,hour and al,0fh mov ah,tenh and ah,0fh mov cl,4 rol ah,cl or al,ah add al,118 daa cmp al,24

37、 jl l1 mov tenh, ,0, mov hour, ,0, jmp timextl1:mov ah,al and al,0fh or al,30h mov hour,al mov cl,4 ror ah,cl and ah,0fh or ah,30h mov tenh,ah timext:mov al,20h out 20h,al ;發(fā)中斷結(jié)束命令 pop ax iret timer endp start endp code ends end start四、題目設(shè)計要求同前(略) 19 畫圖程序設(shè)計畫圖程序設(shè)計一、設(shè)計要求:一、設(shè)計要求:利用匯編語言在圖形形式下的編程方法顯示一個等腰

38、三角形。二、編程思路二、編程思路1. 對于圖形程序設(shè)計,首先應(yīng)通過 bios int 10h 調(diào)用,將屏幕的工作方式設(shè)置為圖形方式。2 . 然后選擇還是的 int 10h 功能調(diào)用實現(xiàn)繪圖。3. 本題繪制三角形,只要用寫像素子程序畫出三條直線,就可畫出三角形。關(guān)鍵是要確定好三條線的坐標。三、三、 參考程序參考程序 data segment mess db “triangle” ,0dh,0ah cn equ $mess messl db “(0,0)” ,0ah,0dh, ”$” mess2 db “(0,100)” ,0ah,0dh, ”$” mess3 db “(100,0)” ,0ah,

39、0dh, ”$” f al db ?data endscode segment assume cs:code,ds:datastart:mov ax,data mov ds,ax ;程序初始化 mov ah,0fh int 10h ;取當(dāng)前顯示方式 mov byte ptr f al,al ; 保存當(dāng)前顯示方式 mov ah,0 mov al,4 int 10h ;設(shè)置新的顯示方式(模式 4) mov dx,60 mov cx,100donel:mov ah,0ch mov al,02h int 10h ;畫三角形的一條邊20 inc cx inc dx cmp dx,140 jnz done

40、l mov dx,140 mov cx,180done2:mov ah,0ch mov al,2 int 10h ;畫三角形的另一條邊 dec cx cmp cx,99 jnz done2 mov dx,60 mov cx,100done3:mov ah,0ch mov al,02h int 10h ;畫三角形的第三條邊 inc dx cmp dx,140 jnz done3 mov ah,02h mov dh,19 mov dl,13 int 10h mov di,offset mess mov cx,cnlop:mov ah,0eh mov al,di inc di mov bl,3 in

41、t 10h loop lop ; 顯示”triangle” mov dh,17 mov dl,7 mov bk,offset mess1 call disp mov dh,7 mov dl,521 mov bx,offset mess2 call disp mov dh,17 mov dl,23 mov bx,offset mess3 call displopl:mov ah,06h mov dl,0ffh int 21h ;是否有鍵按下? jnz over jmp loplover:mov ah,0 mov al,f al int 10h ;恢復(fù)原顯示模式 mov ah,4ch int 2l

42、h ; 返回 dos disp proc near mov ah,02h int 10h mov ah,09h mov dx,bk int 21h ;顯示坐標值 ret code endsend start四、課題設(shè)計要求同前(略)22 簡單計算器程序設(shè)計簡單計算器程序設(shè)計 一、設(shè)計要求一、設(shè)計要求 1. 設(shè)計一個簡單的計算器程序。 2. 具體要求:在屏幕上顯示一個小窗口,將光標定位在窗口內(nèi)。在窗口內(nèi)輸入一個表達式(單項運算)。程序根據(jù)表達式計算運算結(jié)果,并在表達式的后面顯示一個”=“和運算結(jié)果。 二、題目分析二、題目分析 1. 本題目的重點和難點包括以下幾個方面;利用 bios 調(diào)用中 in

43、t 16h 調(diào)用中的子程序完成清屏、設(shè)置顯示方式、設(shè)置窗口等操作。 利用 int21hdos 系統(tǒng)功能調(diào)用中的鍵盤輸入接收十進制操作數(shù)和運算符,由程序完成由字符轉(zhuǎn)換為二進制數(shù),并存儲起來。根據(jù)運算符完成運算,由程序在屏幕上顯示運算結(jié)果。 2. 十進制數(shù)轉(zhuǎn)換為二進制數(shù)過程如下;1)將 bx 清 0。2)從鍵盤接收一個按鍵的 ascii 送 al 中,并判斷是否為 0 到 9 之間的字符,若不是轉(zhuǎn)退出。 3)否則將 al 中內(nèi)容減 30h,轉(zhuǎn)換為相應(yīng)數(shù)字的二進制數(shù),并擴展到 ax 中,然后將 bx 中內(nèi)容乘以 10 后,再加上 ax 中的內(nèi)容。4)轉(zhuǎn) 2)繼續(xù)執(zhí)行。 因此程序退出后,bx 中的內(nèi)容

44、即為所輸入十進制數(shù)的二進制值。 例如;首先將 bx 清 0 后,先輸入數(shù)字”5” ,則(從)=35h,屬于 0 到 9 之間的數(shù)字,減30h 后,(al)=05h,擴展后,(ax)=0005h,bx 乘以 10 后,加上 ax 中的內(nèi)容,(bx)=0005h。 然后再輸入數(shù)字”3” ,則(al)=33h,屬于 0 到 9 之間的數(shù)字,減 30h 后,(al)=03h,擴展后,(ax)=0003h,(bx)乘以 10 后,加上 ax 中的內(nèi)容,(bx)=0035h,為十進制數(shù)”53”的二進制值。 十進制數(shù)的顯示過程如下(被顯示的數(shù)據(jù)9999): (1)將被顯示的內(nèi)容送入 bx 中。 (2)bx

45、除以 1000,余數(shù)送 bx 中,商在 al 中,范圍為 09。 (3)顯示從中的內(nèi)容。23 (4)(bx)除以 100,余數(shù)送 bx 中,商在 al 中,范圍為 090 (5)顯示從中的內(nèi)容。 以此類推,直到分離出個位數(shù)字為止。 在這里有一個特殊問題需要討論:例如”53”這個十進制數(shù),除以 1000 和除以 100的 商都為 0,不應(yīng)顯示。為了能夠?qū)崿F(xiàn)高位的”0”不顯示,程序中設(shè)置一個標志 m,初始值 設(shè)置為 1。若 m=1 且商為 0,則這個 0 不顯示:若 m=l 且商不為 0,則說明這是第一個非 0 數(shù)字,開始顯示,并將 m 設(shè)置為 0;若 m=0,則商值都顯示。如果結(jié)果本身就是 0,

46、則個位的 0 顯示。 三、參考程序三、參考程序 下面給出一個參考程序,能完成以上功能。 具體功能界面如下: * * * * * * * * * * * * 由”*”組成一個窗口,光標在窗口內(nèi)閃爍,等待用戶輸入表達式。data segment x dw ? y dw ? m db ? mess db “,0ah,0dh, ”$”data endscode segment assume cs:code,ds:datastart:mov ax,data mov ds,ax ;程序初始化 call cur ;調(diào)程序完成屏幕初始化并顯示邊框 pos curse: mov ah,02h mov dh,9

47、mov dl,44 mov bh,0 int 10h ;光標定位在 9 行 44 列24 mov dx,offset mess mov ah,09h int 21h ;顯示字符串 mov ah,02h mov dh,8 mov dl,30 mov bh,0 int 10h ;光標定位在 8 行 30 列 mov ah,06h mov al,1 mov ch,5 mov cl,30 mov dh,8 mov dl,50 mov bh,7 int 10h ;屏幕上卷 mov al,1 mov m,al call add-to ;調(diào) add-to 子程序,完成表達式輸入 cmp al,5lh ;輸入

48、”q” ,結(jié)束程序 jz exit1 jmp pos curseexi1:mov ah,4ch int 21h ;子程序名:add to ;功能:完成鍵盤輸入并轉(zhuǎn)換 ;入口參數(shù):無 ;出口參數(shù):(al)=輸入非數(shù)字字符的 ascii 碼 add to proc near call char ;調(diào)子程序 char,完成第一個運算數(shù)轉(zhuǎn)換 mov x,bx ;第一個數(shù)送 x 單元中 cmp al,2dh jz minu ;運算符=“-” ,轉(zhuǎn) minu,執(zhí)行減法 cmp al,2ah jz mul ;運算符=“*” ,轉(zhuǎn) mul,執(zhí)行乘法 cmp al,2fh jz div ;運算符=“” ,轉(zhuǎn) d

49、iv 執(zhí)行除法25 cmp al,51h jz exits ; (al)=“q” ,轉(zhuǎn) exit8 call char ;否則調(diào)子程序 char,輸入第二個數(shù) call cr ;調(diào)子程序 cr,顯示”=“ mov y,bx add bx,k ;執(zhí)行加法運算,結(jié)果送 bx 中 jmp t0 ;轉(zhuǎn) t0minu:call char ;調(diào)子程序 char,輸入第二個數(shù) call cr ;調(diào)子程序 cr,顯示”=“ mov y,bx: ;第二個數(shù)送 y 單元 mov bx,k cmp bx,y ;被減數(shù)減數(shù),轉(zhuǎn) t jl t- sub bx,y ;否則完成 x 減 y,結(jié)果送 bx 中 jmp t0

50、;轉(zhuǎn) t0,顯示運算結(jié)果mul-:call char ;調(diào)子程序 char,輸入第二個數(shù) call cr ;調(diào)子程序 cr,顯示”=“ mov y,bx ;第二個數(shù)送 y 單元 mov ax,x mul y ;完成 x*y mov bx,ax ;結(jié)果送 bx 中 jmp t0 ;轉(zhuǎn) t0,顯示運算結(jié)果div-:call char ;調(diào)子程序 char,輸入第二個數(shù) call cr ;調(diào)子程序 cr,顯示”=“ mov y,bx ;第二個數(shù)送 y 單元 mov dx,0 mov ax,x div y ;完成 xy mov bx,ax ;結(jié)果送 bx 中 jmp t0 ;轉(zhuǎn) t0,顯示運算結(jié)果t-

51、:mov dl,2dh mov ah,02h int 21h ;顯示”-” mov bx,y sub bx,x ;完成 y-x,結(jié)果送 bx 中t0:call bin ;調(diào) bin,顯示運算結(jié)果exit8:ret 26;子程序名:cr- :功能:顯示一個”=“ ;入口參數(shù): (al)中為輸入按鍵的 ascii ;出口參數(shù)無 cr- proc near cmp al,0dh jnz esc- ; (al)=0dh,轉(zhuǎn) esc mov ah,02h mov dh,8 mov dl,46 mov bh,0 int 10h ;光標定位在 8 行 46 列,顯示一個”=“ mov dl,3dh mov

52、ah,02hint 21hesc-:ret cr- endp ;子程序名,char ;子程序功能:接收鍵盤輸入的十進制數(shù),轉(zhuǎn)換為二進制 ;入口參數(shù):無 ;出口參數(shù):(bx)中存放轉(zhuǎn)換的二進制結(jié)果,(al)存放輸入的非十進制數(shù)碼的 ascii碼 char proc near mov bx,0 。newchar:mov ah,01h int 21h ;通過鍵盤,輸入一個十進制數(shù)碼 cmp al,30h jl exit cmp al,39h jg exit ;輸入字符不在”o9”之間,轉(zhuǎn)結(jié)束 sub al,30h ;否則減 30h,將 ascii 轉(zhuǎn)換為二進制數(shù) cbw ;擴展至 ax 中 xchg

53、 ak,bx mov cx,10d mul cx xchg ax,bx 27 add bx,ak ;完成(bx)x10+ax,結(jié)果送 bx 中 jmp newchar ;轉(zhuǎn) newcharexit:ret char endp ;子程序名:bin ;子程序功能:將 bx 中的數(shù)據(jù)以十進制顯示在屏幕上 ;入口參數(shù):(bx)=被顯示數(shù)據(jù) ;出口參數(shù):無 bin proc near mov cx, 10000 call dec div mov cx, 1000 call dec- div mov cx,100 call dec-div mov cx,10 call dec div mov cx,1 c

54、all dec- div1 ret bin endp ;子程序名:dec-div ;子程序功能:bx 中內(nèi)容除以 cx 中內(nèi)容,顯示 al 中的結(jié)果 ;入口參數(shù):(bx)=被除數(shù),(cx)=除數(shù) ;出口參數(shù), (bx)=余數(shù) dec-div proc near mov ax,bx ;被除數(shù)送 ax 中 mov dx,0 ;擴展至 dx、ax 中 div cx ;除以 cx 中的內(nèi)容 mov bx,dx ; 余數(shù)送 bx 中 cmp m,0 ; jz to1 ;標志變量 m=0,轉(zhuǎn) t01 cmp al,0 ; 否則 al=0, 轉(zhuǎn) to2 jz to2to1:mov dl,al add dl,

55、30h mov ah,02h28 int 21h ;顯示 al 中的內(nèi)容 mov al,0 mov m,al ;標志變量送 0to2:ret dec- div endp ;一一一一一一一一一一一一一一一一一一一一一一一一一一 dec-div1 proc near mov ax,bx mov dx,0 div cx mov bx,dk mov dl,al add dl,30h mov ah,02h int 21h ret dec-div1 endp bin endp add to endp ;一一一一一一一一一一一一一一一一一一一一 cur proc near mov ah,6 mov al,0

56、 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h ;屏幕初始化 mov ah,2 mov bh,0 mov dh,4 mov dl,25 int 10h ;光標定位在 4 行 25 列 mov ah,9 mov al, ”*” mov bh,0 mov bl,929 mov cx,30 int 10h ;顯示行”*” ;* mov ah,2 mov bh,0 mov dh,10 mov dl,25 int 10h ;光標定位在 10 行 25 列 mov ah,9 mov al, ”*” mov bh,0 mov bl,9 mov

57、cx,30 int 10h ;顯示 1 行”*” ;* mov dh,4 call a call a call a call a call a call a ;調(diào)子程序,顯示左邊框:”*” ;* mov dh,4 call b call b call b call b call b call b ;調(diào)子程序,顯示右邊框”*” ret cur endp ;* a proc near mov ah,2 mov bh,0 inc dh mov dl,2530 int 10h mov ah,9 mov al, ”*” mov bh,0 mov bl,9 mov cx,1 int 10h ret a e

58、ndp ;* b proc near mov ah,2 mov bh,0 inc dh mov dl,54 int 10h mov ah,9 mov al, ”*” mov bh,0 mov bl,9 mov cx,1 int 10h ret b endpcode ends end start四、課題設(shè)計要求同前(略)31歌手大獎賽計分程序設(shè)計歌手大獎賽計分程序設(shè)計一、設(shè)計要求:一、設(shè)計要求:根據(jù)歌手大獎賽的要求,設(shè)計一個計算平均分的程序。1.每位歌手的分數(shù)通過鍵盤輸入。2.評委人數(shù)共 10 人,去掉最高分和最低分后,求平均值。3.屏幕顯示每位評委的打分和最后得分。二、二、 設(shè)計思路及編程步驟

59、設(shè)計思路及編程步驟:1.顯示提示語句:”輸入分值,并用空格分隔” 。 (參考人機會話程序)2.接受鍵入的分數(shù),并存入顯示緩沖區(qū) disp:。 (參考人機會話程序)3.顯示鍵入的數(shù)據(jù)。 (參考人機會話程序)4.將鍵入的 ascii 碼轉(zhuǎn)換成 bcd 碼,并存入數(shù)據(jù)區(qū) bcsf:(參考教材 p90 程序)5.尋找最大值和最小值(去掉) 。 (參考尋找最大值最小值程序)6.求平均分,存入 bcdf 的最后一個字節(jié)。 (參考多字節(jié)求和程序)7.將平均分的 bdc 碼轉(zhuǎn)換成 ascii 碼,存在 disp 區(qū)的最后面字節(jié)。 (參考查表程序)8.顯示平均分(參考人機會話程序) 。9.結(jié)束。三、參考程序三、

60、參考程序 :data segmentmesg1 db 0dh,0ah, ” pleas input fenshu (90,80,78.) ?” ,0dh,0ah, ”$” mesg2 db 0dh,0ah, “pjf = “pjs db ?,? db “$”buf db 35 db 34 dup (0)bcd1 db 20 dup (0)bcd2 db 10 dup (0)max db ?32min db ?data endscode segment assume cs: code, ds: databeg: mov ax, data mov ds, ax mov es,axagain:mov

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論