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...