1. 程式人生 > 其它 >組合語言程式設計(十六)直接定址表

組合語言程式設計(十六)直接定址表

目錄

資料標號

  • 使用標號可以標記指令、資料和段的起始地址,比如下邊例子中的a和b,用offset a即可求出標號a所代表的偏移地址。
  • 上邊的code、a、b、start、s都是標號,但是隻是表示了記憶體單元的首地址,但是不知道這個記憶體單元有多大,還有一種標號可以既表示記憶體單元的地址,也表示記憶體單元的大小。如下圖中所示標號a和b,其實就是把兩個冒號給去掉了,這樣就能知道標號a出的記憶體單元大小是一個位元組,而標號b處的記憶體單元的大小是一個字。
  • 可以利用這種帶大小的標號來方便地處理資料,比如mov ax, b即是mov ax, cs:[8],因為標號b表示的地址就是cs:[8],而其代表的記憶體單元的大小是一個字,因此可以直接傳送到ax中去,ax大小也是一個字。如下邊例子,標號b代表了一個記憶體單元,地址為code:8,長度為兩個位元組。但是,mov al,b會引起編譯錯誤,因為b代表的記憶體單元是字單元,而al是8位的暫存器,只能存下一個位元組。
  • 此外,也可以將標號a和b當作段地址來使用,加上相應的偏移地址可以很方便得讀寫特定位置的一個位元組或一個字的資料。格式為 mov al a[偏移量]。使用這種包含單元長度的標號,可以使我們以簡潔的形式訪問記憶體中的資料,這種標號稱為資料標號。它標記了儲存資料的單元的地址和長度。

在其它段中使用資料標號

  • 以上內容中是在程式碼段中使用的資料標號,但是更一般的情況,我們應該在資料段中使用才對。
  • 後邊帶冒號":"的地址標號只能在程式碼段中使用,不能在其它段中使用,因為這個東西一般是用於指令跳轉的。

直接定址表

例子

  • 編寫子程式,以十六進位制的形式在螢幕中間顯示給定的byte型資料。

  • 因為一個位元組有8位,而一個十六進位制的字元用4位表示,因為可以用兩個十六進位制的字元來表示一個位元組。因此子程式要在螢幕上顯示兩個ascii字元。因此,把一個位元組型資料分為高4位和低4位,然後分別用一個十六進位制數對應的ascii符號來表示即可。

  • 顯然,我們希望能夠在數值015之間和字元“0F”之間建立一種對映關係。

  • 因為字元對應的asxii碼也是一種整數,可以和數值進行加減,比如數值加上30H就等於對應字元的ascii值。

  • 但是對於上邊這種對映關係,09和1015的數字與字元的對映關係是不同的,即有兩個不同的對映關係,而我們希望可以用同一種對映來得到字元。

  • 可以採用的一種方法是,建立一張表,表中一次儲存字元“0”“F”,將數值015當成這張表的偏移,那麼就可以用一個對映來找到字元了。這是一種資料庫的雛形概念,資料庫即由一張張按類別分開的表組成。

  • 利用表可以在兩個資料集合之間建立一種對映關係,使得可以用查表得方法根據給出得資料得到其在另一集合中的對應資料。

  • 上述解決問題的思路是:用一張表來實現兩個集合之間的對映關係,通過依據資料,直接計算出在另一個集合中的對應資料的位置(當然上邊例子中沒有計算,直接就是當成索引用了),這樣的表,我們稱為直接定址表

  • 可以在直接定址表中儲存子程式的地址,從而方便實現不同子程式的呼叫。