組合語言 直接定址表

2022-08-17 01:45:18 字數 1939 閱讀 9817

**功能:

將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 如果想在 段中,直接用資料標...