標籤:asm 彙編 暑假
瘋狂的暑假學習之 彙編入門學習筆記 (十四)—— 直接定址表
參考: 《組合語言》 王爽 第16章
1. 描述單元長度的標號
普通的標號:a,b
assume cs:codecode segmenta:db 1,2,3,4,5,6,7,8b:dw 0start:mov si,offset amov di,offset bmov ah,0mov cx,8s:mov al,cs:[si]add cs:[di],axinc siloop smov ax,4c00hint 21hmov ax,4c00hint 21hcode endsend start
仔細看一下,下面代碼的標號的不同。下面的標號a、b後面沒有冒號。它們是可以描述單元長度的標號。又叫資料標號
assume cs:codecode segmenta db 1,2,3,4,5,6,7,8b dw 0start:mov si,offset amov ah,0mov cx,8s:mov al,a[si]add b,axinc siloop smov ax,4c00hint 21hmov ax,4c00hint 21hcode endsend start
我們可以:
mov ax,bx 相當於 mov ax,cs:[8]
mov b,2 相當於 mov word ptr cs:[8],2
inc b 相當於inc word ptr cs:[8]
mov al,a[si] 相當於 mov al,cs:0[si]
mov al,a[3] 相當於mov al,cs:0[3]
但是下面的是錯的
mov al,b 因為b是dw,字型的
add b,al
2. 在其他段中使用資料標號
普通的後面帶有“:”的標號,是只能定義在程式碼片段的。資料標號可以用在其他段中。
例子:注意如果想把ds:b 直接寫成 b,就必須在assume 後加上 cs:data
assume cs:code,ds:datadata segmenta db 1,2,3,4,5,6,7,8b dw 0data endscode segmentstart:mov ax,datamov ds,axmov si,offset amov ah,0mov cx,8s:mov al,a[si]add b,axinc siloop smov ax,4c00hint 21hmov ax,4c00hint 21hcode endsend start
3. 直接定址表
我們可以建一個表,用查表的方式來大大加快處理速度。
例子:在螢幕顯示對應16進位數位字元。這裡字元就用來一個表。
assume cs:codecode segmentstart:mov al,0ehcall showbytemov ax,4c00hint 21hshowbyte:jmp short showtable db '0123456789ABCDE' ;字元表show:push bxpush esmov ah,alshr ah,1 ;右移4位,ah中儲存 高4位,al中儲存第4位shr ah,1shr ah,1shr ah,1and al,00001111bmov bl,ahmov bh,0mov ah,table[bx]mov bx,0b800hmov es,bxmov es:[160*12+40*2],ahmov bl,almov bh,0mov al,table[bx]mov es:[160*12+40*2+2],alpop espop bxretcode endsend start
我們還可以在直接定址表中儲存子程式的地址,從而方便的實現不同子程式的調用。
彙編入門學習筆記 (十四)—— 直接定址表