彙編學習筆記 13 直接定址表

2022-01-19 12:30:54 字數 3879 閱讀 3974

不加冒號的資料標號

直接定址表顧名思義就是可以通過給定的資料直接找到所需的位址,主要通過資料標號來實現。

到現在為止我們學習的資料標號的寫法都是形如

a: db 1,2,3

其實還有一種寫法是這樣

a db 1,2,3

看上去只是少了個冒號,但是表示的含義可是大不相同。第一種寫法a表示記憶體單元的位址,而第二種寫法a不僅表示記憶體單元的位址,還表示了記憶體單元的長度。

1

;將a中的資料相加,結果儲存在b中

可以看到,結果已經儲存在b中,採用不加冒號的資料標號寫法可以使程式更加簡潔。

1

;將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

因為不加冒號的資料標號還代表了記憶體單元的長度,所以"mov al,a[si]"就相當於"mov al,cs:[0]si","add b,ax"就相當於"add cs:[3]".

任何事物都有其兩面性,世上沒有完全完美的東西,不加冒號的寫法有一點是需要注意的:當把資料寫在資料段時,必須用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

;以十六進製制的形式在螢幕上顯示給定的位元組型資料

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

在這個例子中,我們使用位元組型資料的高4位和低4位來查詢作為十六進製制資料的偏移值,從而可以快速的找到對應的十六進製制,這種直接的對映方法就叫做直接定址表。

組合語言學習筆記(十六)直接定址表

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