《組合語言》第十六章 直接定址表

2021-10-10 01:50:22 字數 1984 閱讀 5643

code segment 

a: db 1,2,3,4,5,6,7,8

b: dw 0

上述程式段中,code,a,b都是標號,這些標號僅僅表示了記憶體單元的位址

還可以使用一種標號,這種標號不但表示了記憶體單元的位址,還表示了記憶體單元的長度,即表示在此標號處的單元,是乙個位元組單元,還是字單元,還是雙字單元

code segment

a db 1,2,3,4,5,6,7,8

b dw 0

上述的程式段在code段中使用了a,b後面卻沒有 :它們是同時描述記憶體位址和單元長度的標號,標號a,描述了位址 code:0,和從這個位址開始,以後的記憶體單元都是位元組單元,而標號b描述了位址code:8,和從這個位址開始,以後的記憶體單元都是字單元

因為這種標號包含了對單元長度的描述,所以在指令中,它可以表示乙個段中的記憶體單元,如對於程式中的 b dw 0

mov ax,b = mov ax,cs:[8]

mov b,2 = mov word ptr cs:[8],2

這些指令中,標號b代表了乙個記憶體單元,位址為code:8,長度為兩個位元組,使用這種包含單元長度的標號,可以簡潔地訪問記憶體中地資料,以後稱為資料標號,它標記了儲存資料的單元的位址和長度,不同於僅表示位址的位址標號

一般來說,不在**段中定義資料,將資料定義到其它段中,在其它段中,可以使用資料標號來描述儲存資料的單元的位址和長度

將data段中a標號處的8個資料累加,結果存到b標號的字中:

assume cs:code,ds:data

data segment

a db 1,2,3,4,5,6,7,8

d dw 0

data ends

code segment

start: mov ax,data

mov ds,ax

mov si,0

mov cx,8

s: mov al,a[si]

mov ah,0

add b,ax

inc si

loop s

mov ax,4c00h

int 21h

code ends

end start

如果想要在**段中直接使用資料標號訪問資料,則需要偽指令assume將標號所在的段和乙個段暫存器聯絡起來,且在**段中指明將資料段位址放入某個段暫存器中,設定ds指向data段,方可編譯

可以將標號當作資料來定義,此時編譯器將標號所表示的位址當作資料的值

data segment 

a db 1,2,3,4,5,6,7,8

b dw 0

c dw a,b

data ends

資料標號c儲存的兩個位元組型資料為標號a,b的偏移位址

考慮:編寫乙個子程式

計算 sin(x) ,x=,並在螢幕中間顯示結果,如sin(30)的結果顯示為0.5

我們可以利用麥克勞林公式計算sin(x),y=x/180*3.1415926

可以看出,計算sin(x)需要進行多次的乘法和除法,乘除是非常費時的,它們的執行時間是加法,比較指令的5倍

我們可以不用計算sin(x),可以占用一些記憶體空間來換取運算的速度,將所要計算的sin(x)的結果都儲存到一張表中,然後根據角度來查表,找到對應的sin(x)的值

通過給出的資料進行計算或比較而得到結果的問題,轉化為用給出的資料查表得依據,通過查表得到結果得問題,具體的查表方法,是用查表得依據資料,直接計算出所要查詢的元素在表中的位置,像這種可以通過依據資料,直接計算出要找的元素的位置的表稱為直接定址表

可以在直接定址表中儲存字子程式的位址,從而方便實現不同子程式的呼叫,根據功能號查詢位址表的方法,程式的結構清晰,便於擴充,如果需要增加乙個新功能,那麼只需要在位址表中加入它的入口位址即可

組合語言 直接定址表

assume cs code code segment a dw 1,2 3,4 5,6 7,8 a代表了code段的首位址code 00,由於dw,也代表了a開始的這一小段記憶體都是按照字單元儲存的。從code 0 code 15 也就是,a 0 a 15 a si 代表了從code 00開始的偏...

組合語言 直接定址表

assume cs code code segment 從code 0 code 15 也就是,a 0 a 15 a si 代表了從code 00開始的偏移量為si的記憶體單元。此記憶體單元是字單元,故si的偏移量是2個位元組。剩下的空間都是真正的cpu執行的 了。start mov si,0 mo...

組合語言 直接定址表

功能 將a位址中的1 8的數值相加,並儲存到b位址中。assume cs code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start mov si,offset a mov di,offset b mov ah,0 mov cx,8 s mov al,cs...