彙編語言實例問題

  在早先的一些著名高校裏(不知道現在還有沒有),老師是通過讓學生設計出一套計算機電路系統來讓學生了解計算機的工作原理,而現在絕大部分高校都開設了微型計算機原理與接口技術這樣一門課,學生通過學習編寫彙編代碼這樣一個過程來了解計算機的內部工作方式。彙編畢竟是一種低級計算機語言,所以我覺得我們沒有必要說一定要寫出多牛逼的彙編代碼,而是瞭解到計算機是如何傳送數據,處理數據,在外部給出一個複雜動作時計算機內部進行了一個怎樣的處理過程我覺得這門課的意義就達到了,那麼以後在對使用高級計算機語言編寫的代碼進行調試的時候,我們就多了一個思考維度,從計算機底層工作方式去分析並解決問題。

    然而現在關鍵的問題是微機這門課學起來真的是讓人頭禿,尤其是遇到一個只會念PPT並且在講彙編指令之前直接跳過計算機內部結構的微機老師。這就導致在他講了兩節課的指令之後我還以爲在CPU裏面有好多個AX寄存器,還不知道內存其實是一個整體,只是爲了方便理解才被人爲"劃分"成了一段一段。。。但是怎麼說呢,學習本身就是一個從小白到入門,從入門到繼續入門,從繼續入門到放棄的過程嘛,在慢慢熟悉一個完全陌生的事物之前的熱身和準備階段總歸是痛苦難熬且讓人頭禿的。想把這門課學好終歸還是要通過自己大量的查閱、學習和整理,最終在大腦裏形成一個計算機內部工作方式的體系框架。

    以上是對微機的一些小感慨,最後因爲這篇文章並不是對微機知識的一個具體介紹和總結,所以就以我的同學問我的PPT上的一道題結尾吧:


    個人認爲這道題對理解計算機的一些尋址方式(尤其是間接尋址)還是大有裨益,也當做是對自己做的一個知識強化,在此將這道題的過程梳理下來:

    本題的問題是連續執行下面一串指令之後,寄存器AL中的數值爲多少?內存X單元中的數據變爲多少?本質上就是寄存器與內存的數值傳送問題。

    首先前兩行,先把數據1000H這樣一個16位數送到寄存器AX中,再把AX中的值送到數據段DS中。寄存器DS中的值就變成了1000H,這樣的一個操作其目的就是保存了一個段基址1000H。

    第三行將數據2345H送到寄存器BX中沒什麼好說的,第四行將BX用中括號括起來,尋址方式就成了寄存器間接尋址[BX],尋址方式我們說其目的就是爲了得到一個操作數,[BX]這樣一寫我們實際上就得到了這個操作數,這個操作數在哪兒呢?在內存裏面。有人又會問了,我沒看到啊,[BX]能說明什麼嗎?且看我變一變樣,[BX]  =  DS:[BX],這兩者是等價的,[BX]是偏移地址,DS是數據段,DS:[BX]這樣就構成了一個邏輯地址,根據邏輯地址我們可以得到物理地址,一個物理地址對應內存中的一個值,那麼我們只要計算得到這個物理地址即可。物理地址 = 段基址*16+偏移地址,那麼我們這邊的物理地址就等於DS中的1000H *16 +2345H = 12345H,題目中告訴我們12345H中保存的數據是55H,最終通過MOV AL,[BX],我們就將內存單元中的55H送到了寄存器AL當中。

    最後兩行我先說一下它是幹了一件什麼樣的事情。五六兩行執行完之後,我麼修改了內存單元X中的值。首先第五行,MOV SI,X單元的有效地址。 X單元的有效地址就是X單元的偏移地址。將該偏移地址保存到寄存器SI當中。第六行,MOV [SI],BL。[SI]是一種變址尋址,同樣做一個等價[SI] = DS:[SI],這樣我們就找到了X內存單元所在的地址,其原來裏面存放的數是66H,這個時候我們將BL裏面的數據45H送進去,X內存單元的值就變成了45H,我們就成功修改了該內存單元中的值。

    真的頭禿!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章