不加冒號的資料標號
直接定址表顧名思義就是可以通過給定的資料直接找到所需的位址,主要通過資料標號來實現。
到現在為止我們學習的資料標號的寫法都是形如
a: db 1,2,3其實還有一種寫法是這樣
a db 1,2,3看上去只是少了個冒號,但是表示的含義可是大不相同。第一種寫法a表示記憶體單元的位址,而第二種寫法a不僅表示記憶體單元的位址,還表示了記憶體單元的長度。
1;將a中的資料相加,結果儲存在b中
可以看到,結果已經儲存在b中,採用不加冒號的資料標號寫法可以使程式更加簡潔。
1因為不加冒號的資料標號還代表了記憶體單元的長度,所以"mov al,a[si]"就相當於"mov al,cs:[0]si","add b,ax"就相當於"add cs:[3]".;將a中的資料相加,結果儲存在b中
2 assume cs:
code34
code segment
56 a db 1,2,3
7 b dw 089
start:
mov si,0
10mov cx,3
11s:
12mov
al,a[si]
13mov ah,0
14add
b,ax
15inc
si16
loop s
1718
movax,4c00h
19int
21h20
code ends
21 end start
任何事物都有其兩面性,世上沒有完全完美的東西,不加冒號的寫法有一點是需要注意的:當把資料寫在資料段時,必須用assume偽指令將資料段與某乙個段暫存器聯絡起來,否則編譯的時候會報錯。還是剛才例子如果我們這麼寫
1;將a中的資料相加,結果儲存在b中
沒錯,can't address with segment register,錯誤資訊已經很明顯,定位不到段位址,這是為什麼呢?上文已經說過,形如
mov al,a[si]的指令在編譯時是編譯成怎樣子的指令mov al,cs:0[si]我們把資料寫在**段中用的段位址是cs,而現在資料是寫在資料段中,編譯器在編譯時就不知道資料段所對應的段寄存是多少了,所以需要用assume指令進行關聯。1直接定址表;將a中的資料相加,結果儲存在b中
2 assume cs:code,es:
data34
data segment
5 a db 1,2,3
6 b dw 0
7data ends89
code segment
1011
start:
movax,data
12mov
es,ax
13mov si,0
14mov cx,3
15s:
16mov
al,a[si]
17mov ah,0
18add
b,ax
19inc
si20
loop s
2122
movax,4c00h
23int
21h24
code ends
25 end start
我們通過乙個例子來學習
1在這個例子中,我們使用位元組型資料的高4位和低4位來查詢作為十六進製制資料的偏移值,從而可以快速的找到對應的十六進製制,這種直接的對映方法就叫做直接定址表。;以十六進製制的形式在螢幕上顯示給定的位元組型資料
23 assume cs:
code45
code segment67
start:
8mov al,'
100'
9call
show
1011
movax,4c00h
12int
21h13
14show:
15jmp
short show1
16 table db '
0123456789abcdef'17
18show1:
19push
es20
push
bx21
movah,al
22shr ah,1
23shr ah,1
24shr ah,1
25shr ah,1
;右移4位得到高位位址
26and al,00001111b
2728
movbl,ah
29mov bh,0
30mov ah,table[bx];
高4位的值作為偏移位址得到十六進製制的值
3132
movbx,0b800h
33mov
es,bx
34mov
es:[160*12+40*2
],ah
3536
movbl,al
37mov bh,0
38mov
al,table[bx]
39mov
es:[160*12+40*2
],al
4041
popbx
42pop
es43
ret44
45code ends
46 end start
組合語言學習筆記(十六)直接定址表
code segment a db 1,2,3,4 b dw 0 標號a,描述了位址code 0,和從這個位址開始,以後的記憶體單元都是位元組單元 標號b,描述了位址code 8,和從這個位址開始,以後的記憶體單元都是字單元 mov ax,b相當於mov ax,cs 8 如果想在 段中,直接用資料標...
組合語言 直接定址表
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...