當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]通過引入變量定義,規(guī)范子函數、中斷函數編寫的結構化匯編語言編程思路,能夠較好地解決匯編程序開發(fā)中存在的代碼晦澀和易發(fā)生寄存器內存沖突的問題。通過俄羅斯方塊游戲的匯編程序設計,從變量定義、子函數設計、中斷函數設計等方面探討了匯編語言的結構化設計思想和具體方法。詳細介紹了俄羅斯方塊軟件實現的具體方法以及程序測試結果。文中采用的匯編語言編程的結

引言

匯編語言是一種用助記符表示的面向機器的程序設計語言。助記符使得原來的機器語言變得相對較為直觀、易懂、易用,并且匯編語言與機器語言具有一一對應的關系,因此它繼承了機器語言直接、快速、高效的特點,是一種底層語言。但是匯編語言的劣勢也十分明顯,如對于編寫較大的程序需要考慮諸多硬件存儲器的分配以及中斷程序的處理等非常細節(jié)的問題,否則容易出現寄存器沖突,從而導致程序崩潰。為了簡化匯編語言的編寫過程,本文提出了一種結構化的匯編編程思路,并以基于AT89C51芯片(以下對匯編語言的討論針對51單片機系統(tǒng))的俄羅斯方塊游戲為例,來展現在51單片機中匯編語言結構化編寫的優(yōu)勢。

1 匯編語言的結構化設計思想

1.1 變量定義

匯編語言中無需變量的聲明,因為匯編語言是直接對具體的內存單元操作,而每個單元有16進制的地址碼,因此所有變量都可人為地由該地址碼表示。但是匯編語言提供了EQU偽指令,可以將特定的內存空間標記為特定的名稱,這就為變量定義提供了可能。而使用EQU偽指令的好處就是將抽象的物理內存分化為具體的變量名,避免了內存沖突,同時又增加了程序可讀性。

1.2 子函數設計

子函數對程序結構化的作用是其可簡化主函數的編寫,使得程序主干的編寫思路清晰化,而一些復雜的算法與功能則放在一層層的子函數中實現。但是,匯編語言在調用子函數的過程中如果處理不當,極其容易造成堆棧錯誤、內存沖突等問題。本文提出了一種優(yōu)化的子函數設計方案。

圖1 工作寄存器區(qū)臨時變量存放層次結構

首先,把51單片機內存的4組工作寄存器區(qū)(00H~1FH),用作子函數的臨時變量存放區(qū),如圖1所示;另一部分是用戶區(qū)(20H~7FH),用作主函數變量與堆棧區(qū)域。其次,4組工作寄存器區(qū)的每一組用作同一層次的子函數的臨時變量,低層次的子函數只能被高層次的子函數調用,同一層次的子函數不允許相互嵌套調用。所有的子函數在編寫時需要聲明其使用的工作寄存器組編號,以防止沖突。在函數嵌套時,用RS1、RS0兩個標志位的切換來實現工作寄存器組的切換,如此就可以方便可靠地實現子函數的調用和嵌套。

1.3 中斷函數設計

與順序設計的程序不同,51系列單片機還需考慮中斷函數的設計。51單片機的中斷有外部中斷、定時器中斷、串口中斷等。中斷程序在中斷源觸發(fā)后即起作用,換句話說,中斷程序可能隨時中止主程序的運行。如果在這個時候,中斷函數與主程序中的主函數或子函數享用相同的臨時變量,那么在中斷發(fā)生時,這些臨時變量就會被改寫,從而導致內存沖突。因此,中斷函數的臨時變量體系應與主程序有別,以下是三種可選方案:

第一種方案是將工作寄存器區(qū)分為兩類,一類用作主程序函數的臨時變量,另一類用作中斷函數的臨時變量。這種方案中,單片機工作寄存器的組數對函數設計起限制作用。

第二種方案允許中斷函數與主程序的子函數共用工作寄存器區(qū),但是代價是在調用中斷時必須保護和恢復現場,即在中斷函數的開始、結尾必須將中斷函數及其子函數使用的工作寄存器的數據壓入、彈出堆棧,從而保證中斷前后主程序函數臨時變量的一致。

第三種方法是通過設置標志變量,避免在中斷函數中插入子函數。在中斷程序中,根據狀態(tài)修改標志變量后即返回主函數。在主函數中,判斷相應的中斷標志執(zhí)行相應的子程序。這種編程方法的優(yōu)點是中斷程序十分簡單,能在很短的時間內完成,減少了中斷出錯的可能性;其缺點是中斷執(zhí)行的反應速度會有所降低,因為主函數對中斷標志位一定是滯后于中斷發(fā)生的,且如果主函數的結構是大循環(huán)型的,那么一次循環(huán)中只能處理若干次中斷(大多數情況往往只為一次),這種編程方法對需要高頻中斷的功能是不合適的。

2 俄羅斯方塊的軟件實現方法

俄羅斯方塊是一款風靡全世界的十分經典的休閑游戲。本文在基于MCS51單片機和具有矩陣式按鍵、雙色LED點陣和數碼管等功能模塊的實驗系統(tǒng)上,采用以上所述的匯編語言結構化的編程思想,編寫能夠運用按鍵操作游戲、將游戲圖像顯示于16×8的LED雙色點陣上,將玩家分數顯示在靜態(tài)數碼管上、并伴隨游戲產生音樂效果的俄羅斯方塊游戲。

2.1 功能分析

俄羅斯方塊游戲的規(guī)則很簡單,屏幕上方隨機產生不同形狀的方塊并以一定速度落下,玩家可以控制方塊的左右位置以及旋轉方塊,巧妙地布置安排使方塊落下后充分利用屏幕空間。每當屏幕的一整行被方塊排滿時,該行方塊從屏幕上消失,其上的方塊依次下降一行,玩家獲得一定的分數。當方塊堆積達到屏幕頂端的時候,游戲結束。本游戲的主要功能包括:

① 開機進入開機歡迎界面。按任意鍵進入游戲難度選擇界面,難度選擇后,按確定鍵進入游戲界面。

② 每4個格點(雙色LED)組成一個圖形,游戲中共有7種方塊圖形。屏幕上端隨機產生一種方塊圖形,并按著一定的時間周期向下移動。當前一個方塊無法再次移動時,產生下一個方塊。

③ 當方塊向下移動時,玩家可以通過上、下、左、右4個按鍵分別調整方塊的角度、加速方塊的下移速度、向左移動方塊1格、向右移動方塊1格。

④ 游戲中,玩家可以按停止鍵,選擇停止游戲并返回到開始界面;或者是按暫停鍵,暫停游戲;再次按暫停鍵時,游戲繼續(xù)進行。

⑤ 當一個方塊無法繼續(xù)向下移動時,判斷此時能否將屏幕的一行或多行完全填滿。若能則將這些行的方塊閃爍后消除,玩家獲得相應的分數(每消去一行,玩家得到10分),并顯示玩家總的分數;而未被消除的方塊則會一直積累。隨著玩家分數的增加,游戲的難度會增加,方塊下落的速度會加快。

⑥ 如果未被消除的方塊堆放的高度很高,達到屏幕頂端以至無法產生新方塊,則游戲結束,返回到開始歡迎界面。

⑦ 游戲開始、結束、按鍵以及消行時會產生一定的音樂效果。

2.2 變量定義與子函數模塊

根據結構化的編程思想,程序中需要對變量進行空間分配,并根據其功能進行命名,以增加程序的可讀性,使得后期的調試工作更加方便。變量定義的具體內容包括單片機及功能模塊所需的引腳命名、功能模塊所需的常量命名、單片機用戶儲存空間的預分配和命名。

首先列出需要用到的所有引腳和變量,并將總程序空間分塊并合理分配每一塊的大小。本程序將RAM空間劃分為即時調用區(qū)、固定區(qū)和堆棧區(qū)。即時調用區(qū)為通用寄存器組,地址00H~1FH;固定區(qū)為用戶存儲區(qū)的20H~5FH;堆棧區(qū)為60H開始的剩余空間。

對于函數的調用方法、數據的應用輸出、寄存器工作組的使用等關系到程序儲存空間的細節(jié)問題,前文已經作出論述。子函數與主函數的數據接口采用C51的4個工作寄存器組存放,在子函數調用時將臨時數據存入相應的工作寄存器進行處理,執(zhí)行完畢后將數據返回上一級函數。

2.3 中斷的設計

中斷的使用和中斷程序的設計是單片機應用的難點之一。

首先,要根據程序功能設計中斷的邏輯流程。80C51單片機中有兩個定時器/計數器T0、T1。程序要求同時實現定時掃描顯示以及播放音樂的功能(音樂功能通過一條口線和蜂鳴器實現),所以要同時使用T0和T1的中斷:T0控制顯示模塊,中斷間隔時間較長,優(yōu)先級較低;T1控制音樂模塊,中斷間隔較短,中斷中執(zhí)行的代碼也較短,優(yōu)先級較高。

然后,根據中斷的特點,合理設計中斷的使用規(guī)則。本程序中設計使用雙中斷,這使得程序的主體邏輯流程變得簡單,但同時也使得中斷函數本身的設計,尤其是即時數據的空間分配和斷點的保護等,變得十分重要。為了使函數簡單可靠,程序中允許中斷函數與主程序的其他函數共用工作寄存器區(qū),但是在每次調用中斷函數時都需要全面保護和恢復現場。音樂中斷因為不涉及工作寄存器,所以只需要保護、恢復基本的數據就可以。

2.4 主函數流程和偽代碼描述

根據俄羅斯方塊游戲的功能以及結構化的匯編設計方法,主函數流程如圖2所示。

圖2 主函數流程

偽代碼如下:
歡迎界面;
難度選擇;
數據初始化;
主循環(huán) {
難度設置;
產生新方塊;
判斷新方塊是否已經無法移動,如果無法移動則游戲結束;
檢測按鍵,如果有按鍵則判斷方塊是否可執(zhí)行相應的動作 {
如果可以執(zhí)行,則執(zhí)行;
如果不可以執(zhí)行,則保持不動;
}
判斷方塊是否已經無法繼續(xù)向下移動 {
如果可以移動則循環(huán)繼續(xù)檢測按鍵;
如果不可以移動則判斷能否消行,如果能則消行、得分;
判斷分數是否需要加快游戲速度;
}
}
中斷1:定時方塊下落一格;
中斷2:產生相應的音樂效果;

2.5 實驗測試與結果

開機測試與結果:開機全速運行程序,LED雙色顯示器上顯示的“Hello”歡迎界面如圖3所示。按任意鍵可進入難度選擇界面。

難度選擇界面測試:進入難度選擇界面,雙色LED上顯示紅色的“123”字樣,并在‘3’下有一綠色小圓點,如圖4所示。按數字鍵1、2、3鍵,用于選擇相應的等級,同時綠色小圓點會移到相應等級的下方;按“enter”鍵結束難度選擇,進入游戲界面。

圖3 開機界面 圖4 難度選擇界面

游戲流程測試:進入游戲主界面。LED上方產生方塊,不操作時方塊可以自由下落,此時方塊為紅色。按動‘7’鍵,方塊改變其角度,再次按動,角度可以繼續(xù)改變;按動‘6’鍵,方塊下移一格,并且不影響其自由下落,表現為方塊下移速度加快;按動‘2’鍵,方塊向左移動一位,當移動到左邊邊界時,無法再移動;按動‘A’鍵,方塊向右移動一位,當移動到右邊邊界時,無法再移動。方塊移動到無法再向下時,顏色變?yōu)榫G色,并且在LED上方產生新的方塊,如圖5所示。滿足消行條件時,該行閃爍后即消失,同時在數碼管上顯示分數增加10分;多行消除時,為每行依次消除,增加相應分數,如圖6所示。隨著分數的增加,方塊的自由下落速度加快。按動‘8’鍵,游戲暫停,此時按動除‘8’鍵的其他鍵均無效。當再次按動‘8’,游戲繼續(xù)進行。游戲進入、按鍵、消行時,均有音樂產生,并且兩者同步。

游戲結束測試:按‘C’鍵或者游戲結束時,屏幕所有LED燈從底端到上端逐行點亮,再從上端到底端逐行熄滅,此時伴隨著音樂產生,然后進入歡迎界面。

圖5 游戲流程

圖6 加分顯示

結語

本文以俄羅斯方塊游戲的程序編寫為例子,提出、分析并具體說明了在功能復雜的匯編程序設計過程中,采用的結構化編程思路。并從變量定義、子函數設計、中斷函數設計等方面探討了匯編語言結構化設計的具體方法,從而有效解決了匯編程序編寫中易發(fā)生的寄存器內存沖突等問題。這種匯編語言編程的結構化思維,對于運用編寫匯編大程序具有重要的指導和借鑒作用。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉