**功能:
將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:[si]
add cs:[di],ax
inc si
loop s
mov ax,4c00h
int 21h
mov ax,4c00h
int 21h
code ends
end start
仔細看一下,下面**的標號的不同。下面的標號a、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 ah,0
mov cx,8
s:mov al,a[si]
add b,ax
inc si
loop s
mov ax,4c00h
int 21h
mov ax,4c00h
int 21h
code ends
end start
資料標號不但表示記憶體單元的位址,還表示了記憶體單元的長度,即表示在此標號處的單元,是乙個位元組單元,還是字單元,還是雙位元組單元。
我們可以:
mov ax,b 相當於 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
普通的後面帶有「:」的標號,是只能定義在**段的。資料標號可以用在其他段中。
下面**是上面**的改進版:
assume cs:code,ds:data
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,offset a
mov ah,0
mov cx,8
s:mov al,a[si]
add b,ax
inc si
loop s
mov ax,4c00h
int 21h
mov ax,4c00h
int 21h
code ends
end start
如果想把ds:b 直接寫成 b,就必須在assume 後加上 cs:data
如果把ds和b寄存聯絡起來,那麼在**中,必須設定mov ax,data mov ds,ax
組合語言 直接定址表
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...
組合語言學習筆記(十六)直接定址表
code segment a db 1,2,3,4 b dw 0 標號a,描述了位址code 0,和從這個位址開始,以後的記憶體單元都是位元組單元 標號b,描述了位址code 8,和從這個位址開始,以後的記憶體單元都是字單元 mov ax,b相當於mov ax,cs 8 如果想在 段中,直接用資料標...