匯編入門學(xué)習(xí)筆記 (十四)—— 直接定址表
參考: 《匯編語言》 王爽 第16章
1. 描述單元長度的標(biāo)號(hào)
普通的標(biāo)號(hào):a,b
- assumecs:code
- codesegment
- a:db1,2,3,4,5,6,7,8
- b:dw0
- start:
- movsi,offseta
- movdi,offsetb
- movah,0
- movcx,8
- s:
- moval,cs:[si]
- addcs:[di],ax
- incsi
- loops
- movax,4c00h
- int21h
- movax,4c00h
- int21h
- codeends
- endstart
仔細(xì)看一下,下面代碼的標(biāo)號(hào)的不同。下面的標(biāo)號(hào)a、b后面沒有冒號(hào)。它們是可以描述單元長度的標(biāo)號(hào)。又叫數(shù)據(jù)標(biāo)號(hào)
- assumecs:code
- codesegment
- adb1,2,3,4,5,6,7,8
- bdw0
- start:
- movsi,offseta
- movah,0
- movcx,8
- s:
- moval,a[si]
- addb,ax
- incsi
- loops
- movax,4c00h
- int21h
- movax,4c00h
- int21h
- codeends
- endstart
我們可以:
mov ax,bx 相當(dāng)于 mov ax,cs:[8]
mov b,2 相當(dāng)于 mov word ptr cs:[8],2
inc b 相當(dāng)于inc word ptr cs:[8]
mov al,a[si]相當(dāng)于 mov al,cs:0[si]
mov al,a[3] 相當(dāng)于mov al,cs:0[3]
但是下面的是錯(cuò)的
mov al,b 因?yàn)閎是dw,字型的
add b,al
2. 在其他段中使用數(shù)據(jù)標(biāo)號(hào)
普通的后面帶有“:”的標(biāo)號(hào),是只能定義在代碼段的。數(shù)據(jù)標(biāo)號(hào)可以用在其他段中。
例子:注意如果想把ds:b 直接寫成 b,就必須在assume 后加上 cs:data
- assumecs:code,ds:data
- datasegment
- adb1,2,3,4,5,6,7,8
- bdw0
- dataends
- codesegment
- start:
- movax,data
- movds,ax
- movsi,offseta
- movah,0
- movcx,8
- s:
- moval,a[si]
- addb,ax
- incsi
- loops
- movax,4c00h
- int21h
- movax,4c00h
- int21h
- codeends
- endstart
3. 直接定址表
我們可以建一個(gè)表,用查表的方式來大大加快處理速度。
例子:在屏幕顯示對(duì)應(yīng)16進(jìn)制數(shù)字的字符。這里字符就用來一個(gè)表。
- assumecs:code
- codesegment
- start:
- moval,0eh
- callshowbyte
- movax,4c00h
- int21h
- showbyte:
- jmpshortshow
- tabledb0123456789ABCDE;字符表
- show:
- pushbx
- pushes
- movah,al
- shrah,1;右移4位,ah中保存高4位,al中保存第4位
- shrah,1
- shrah,1
- shrah,1
- andal,00001111b
- movbl,ah
- movbh,0
- movah,table[bx]
- movbx,0b800h
- moves,bx
- moves:[160*12+40*2],ah
- movbl,al
- movbh,0
- moval,table[bx]
- moves:[160*12+40*2+2],al
- popes
- popbx
- ret
- codeends
- endstart
我們還可以在直接定址表中存儲(chǔ)子程序的地址,從而方便的實(shí)現(xiàn)不同子程序的調(diào)用。
評(píng)論