組合語言程式設計大賽賽後總結
轉自我們組隊長,我是組內SA(系統分析師)
為期將近一月(11-05公佈題目,12-02晚截止提交)的校彙編比賽總算告一段落了,接下來潛心學習嵌入式Linux準備來年找工作。因為本人比較喜歡彙編(目前只學過8086),在上微機原理課的同時,在自學王爽老師的《組合語言》(第三版),不得不說,這是國人寫的很優秀的一本計算機科學系圖書,但略有遺憾,我並沒有完全學完學懂學會(太貪容易,太浮淺粗疏,太不能深入,太不能耐苦)。在此特將本次比賽做以總結,另外如果能夠幫助到想學習的您,那將是我的榮幸(It's my pleasure)。
一、雙視窗要求
將顯示器的螢幕劃分成大小相等的左右兩個顯示視窗,並畫出每個顯示視窗的邊框,視窗大小適中。 在左邊顯示視窗,能夠執行簡單的貪吃蛇遊戲,即採用鍵盤按鍵控制貪吃蛇前進方向,如“W、S、A、D”鍵分別為上下左右方向控制按鍵,以貪吃蛇碰觸視窗邊框為遊戲終止條件,以“R”鍵為遊戲重新開始。若遊戲進行當中無鍵按下,則貪吃蛇保持當前方向不變直至撞牆。 在右邊顯示視窗,能夠畫出等邊三角形,要求:三角形位置在該顯示區域的中部,引數邊長由鍵盤輸入確定。每次根據輸入的引數,在該視窗將三角形重新繪製出來。 初始工作視窗為左邊顯示視窗,以後每按一次Tab鍵切換至旁邊顯示視窗。當某個顯示視窗被選中時,則游標在該視窗底部閃爍,鍵盤輸入對當前視窗有效。整個系統按ESC鍵退出,返回DOS作業系統介面。
二、前期折騰
題目要求是2018-11-05在我們學院官網公佈出來的,當天隨機展開了在百度、谷歌(實驗室可直接用)、必應等各大搜索引擎上的查閱資料工作。當晚即實現了畫點+畫線+畫矩形+畫三角形。隨後將三角形部分交給組內成員,自己來完成貪吃蛇的編寫。說實話,我確實不是很放心交給別人(這與我的性格有關,不知道是好事還是壞事,不過這裡我要向那些曾經不被我信任的人說句抱歉,我自我感覺是比較獨裁的,多虧了他們的包容理解),事實證明,我的擔憂有些多餘。他們不負眾望,成功的完成了該任務。下面我主講我繪製貪吃蛇的辛酸史,三角形方面我看懂後也會聊聊。
- 我先是借鑑了CSDN上一篇簡單繪製貪吃蛇的部落格,因為我們的題目要求比較簡單,貪吃蛇僅僅能在視窗區域內移動即可,並不需要吃豆子,變長等騷操作。所以具體思路就是:清屏——(設定游標座標+顯示字元)*N。重複此過程(迴圈)。
- 現在選取一個方向,讓蛇頭向那邊移動,接著蛇身和蛇尾只要等於上一時刻它前面的那一塊就夠了,即實現兩相鄰物塊之間的賦值即可。現在的問題是,每次的小尾巴都會殘留,因為沒有什麼可以跟它作交換。怎麼辦呢?清屏。現在思路變為:畫蛇——延時——清屏——畫蛇。
- 現在能讓它朝一個方向執行起來了,接下來考慮上下左右方向。蛇怎麼知道自己改向哪前進呢?響應按鍵。先實現按一下它只向前走一步的操作,然後一直按住就可以朝著這個方向一直前進了。那麼如何使其執行過程中響應一次按鍵改變方向繼續前進呢?中斷!這是個核心操作。參考《組合語言》(第三版)外中斷那一章,將BIOS系統呼叫為我們所用。在中斷服務程式中通過修改各標誌位來實現蛇的走向。
- 接著是怎麼讓它檢測撞牆然後死掉。這裡比較簡單,只考慮蛇頭就可以啦,使蛇頭滿足橫縱座標在一個範圍裡,如果出去就宣告死亡。
- 此時貪吃蛇寫的差不多了,隊友的三角形也基本OK。然而合併時出現問題。在我的貪吃蛇下,加入三角形時,怎麼都無法顯示,三角形單獨卻可以顯示。
- 小組開會討論後,發現是顯示模式的設定出現了紕漏。DOS下顯示器有兩種顯示方式——字元顯示(游標)、圖形顯示(畫素點)。並且同時只能取其一。
- 因此不得不考慮在圖形模式重新下繪製貪吃蛇。。。。。
- 2018-11-16 21:55 開心:能在圖形模式下畫出綠色小方塊,並將小方塊寫成一個巨集來隨時方便呼叫。
- 然而將巨集寫的太長,不能多次呼叫。無奈只好嘗試將巨集改為子過程,然而不得不說巨集傳遞引數比子過程方便太多。
- 更改為子程式,通過棧來傳遞各項引數,修改成功。接下來該考慮怎麼讓它動起來,初步設想是記錄下每個小方塊的左上角座標和右下角座標,然後模仿著字元模式下畫法,進行替換操作。
- 然而,事有轉機。我們的SA來了(哈哈,平常我一個小coder老是欺負SA,不過SA關鍵時刻還是蠻靠譜的),SA和我一起重新思考了顯示模式的問題,我們測試,在字元模式下圖形確實是顯示不出來,卻忽略了一個重要問題——圖形模式下能不能顯示字元?答案是能。圖形模式下可以顯示字元! 這意味著我前面的貪吃蛇又起死回生了,那我還畫個鬼啊,直接在程式一開始將顯示方式設定為圖形顯示 ,那字元(游標)和圖形(畫素點)就都可以顯示了。至此,圖形模式下的貪吃蛇成功夭折!
三、程式設計流程圖
- 總體設計流程圖
- 鍵盤中斷流程圖
- 巨集功能描述
- 子程式流程
- 三角形部分
四、 寫在最後
-
此外,我們還加入了聲音或者叫音樂播放。具體請參考前兩篇轉載的博文:
-
執行效果已上傳嗶哩嗶哩,歡迎您隨時騷擾:
-
原始碼+執行視訊+流程圖VISIO均已上傳CSDN下載區:
-
男神的話——碰到問題千萬不要放棄
-
如果一點難度都沒有就拿獎證明你的水平已經高於這個比賽了,那麼你拿獎是理所應當,並沒有值得高興的
-
碰到問題,遇到困難,想辦法解決了,獲得最後成功才是最快樂的
-
過往不戀,當下不亂,未來不懼
-
天道酬勤,希望每一個真正努力過的人都能有所成就!
-
博神的話——耐得住寂寞,經得起誘惑,抗得住挫折,記得住教訓!
——An ordinary XUPTer.
2018.12.03
最後2018.12.08號為決賽日,我們榮幸拿了一等獎,這次彙編比賽圓滿結束
——SA