1、前面我們一直在**段使用標號來標記指令、資料、段的起始位置。比如,
a:db 1,2,3,4,5,6,7,8
b:dw 0
程式中,a,b只是標號,它僅僅表示了記憶體單元的位址
但是,我們還可以使用一種標號,這種標號不但標識記憶體單元的位址,還表示了記憶體單元的長度,即表示在此標號的單元,是乙個位元組單元,還是字單元,還是雙字單元
a db 1,2,3,4,5,6,7,8
b dw 0
在a b後面沒有「:」,他們是同時描述記憶體位址和單位長度的標號。標號a,描述了位址code:0,和從這個位址開始,以後的記憶體單元都是位元組單元;而標號b描述了位址code:8,和從這個位址開始,以後的記憶體單元都是字單元
在這裡 標號b代表了乙個記憶體單元,位址為***x:8,長度為兩個位元組
下面的指令會引起編譯錯誤
mov al,b
因為b代表的記憶體單元是字單元,而al是8位暫存器
可見,使用這種包含單元長度的標號,可以使我們以簡潔的形式訪問記憶體中的資料。以後,我們將這種標號稱為資料標號,他標記了儲存資料的單元的位址和長度。它不同於僅僅表示位址的位址標號
2、在其他段中使用資料標號
一般來說,我們不在**段中定義資料,而實將資料定義在其他段中。在其他段中,我們也可以使用資料標號來描述儲存資料的單元的位址和長度。
注意,如果想在**段中直接使用資料標號來訪問資料,則需要用偽指令assume將標號所在的段和乙個段暫存器聯絡起來。否則編譯器在編譯的時候,無法確定標號的段位址在哪乙個暫存器中。當然,這種聯絡是編譯器需要的,但絕不是說,我們因為編譯器的工作需要,用assume指令將段暫存器和某個段聯絡起來,段暫存器中就會真的存放該段的位址,我們在程式中還要使用指令對段暫存器進行設定
3、直接定址表
通過樣例討論查表的方法編寫相關程式的技巧
編寫子程式,以16進製制的形式在螢幕中間顯示給定的位元組型資料
分析;乙個位元組需要用兩個十六進製制數碼來表示,所以子程式需要在螢幕上顯示兩個ascii字元,我們當然用0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f這十六個字元來顯示十六進製制數碼
我們可以將乙個位元組的高四位和低四位分開,分別用他們的值得到對應的數碼字元。比如2bh,可以的達奧高四位的值為2,低四位的值為11,那麼如何用這兩個數值得到對應的數碼字元2和b呢
最簡單的方法就是乙個乙個比較,但是這樣做,程式中要使用多條比較,轉移指令。程式將比較長,混亂
顯然,我們希望能夠在數值0~15和字元0~f之間找到一種對映關係。這樣用0~15間的任何數值,都可以通過這種對映關係直接得到0~f中對應的字元
我們考慮一下ascii與其之間的對映:
0~9之間的對映關係很明顯 相差30h
a~f之間的對映關係也很明顯 相差37h
可見,我們可以利用數值和字元之間的這種原本存在的對映關係,通過高四位和低四位值得到對應的字元碼,但是由於對映關係的不同,我們在程式中必須做一些比較,對於大於9的數值,我們要用不同的計算方法
這樣做,雖然程式得到了簡化。但是,如果我們希望用更簡潔的演算法,就要考慮用同一種對映關係從數值得到字元碼。所以,我們就不能利用他們與ascii之間的對應關係了
因為數值0~15和字元0~f之間沒有一直的對映關係存在,所以,我們應該在他們之間建立新的對映關係
具體的做法是,建立一張表,表中一次儲存字元0~f,我們可以通過數值0~15直接查詢到對應的字元
利用表,在兩個資料集合中間建立一種對映關係,使我們可以用查表的方法根據給出的資料得到其在另一集合中的對應資料。這樣做的目的一般來說有以下3個
(1)為了演算法的清晰和簡潔
(2)為了加快運算速度;
(3)為了是程式易於擴充
直接定址表
1 描述了單元長度的標號 後面沒有冒號的標號可以同時描述記憶體位址和單位長度。因為這種標號包含了對單元長度的描述,所以,在指令中,它可以代表乙個段中的記憶體單元。稱為資料標號。2 一般來說,我們不會在 段中定義資料,而是將資料定義到其他段中。注意 1.在後面加有 的位址標號,只能在 段中使用,不能在...
直接定址表
這篇文章中,我們將討論如何有效合理的組織資料,以及相關的程式設計技術.一 描述了單元長度的標號 首先,我們來看乙個簡單的例子 assume cs code code segment a db 1,2,3,4,5,6,7,8,9 b dw 0 start mov si,offset a mov di,...
直接定址表
1.資料標號 關於標號 在彙編 中,可以用標號表示該段 的記憶體位址 標號格式為,標號名加冒號 start 例如 下面的 中 start 就是標號 start mov ax,0 mov bx,ax 關於資料標號 普通的標號只能表示記憶體位址 資料標號即可表示記憶體位址,也可表示記憶體單元的長度 使用...