1. 程式人生 > >匯編語言——數據處理的兩個基本問題(處理的數據在什麽地方 要處理的數據有多長)

匯編語言——數據處理的兩個基本問題(處理的數據在什麽地方 要處理的數據有多長)

inf ron 進行 end 尺寸 程序 訪問 com 尋址

bx、si、di、bp

1、在8086CPU 中,只有這4個寄存器(bx、bp、si、di)可以用在“[…]” 中來進行內存單元的尋址。

2、在“[…]” 中,這4個寄存器(bx、bp、si、di)可以單個出現,或只能以四種組合出現:
bx和si、bx和di、bp和si、bp和di

 1 正確的指令:
 2 mov ax,[bx]
 3 mov ax,[si]
 4 mov ax,[di]
 5 mov ax,[bp]
 6 mov ax,[bx+si]
 7 mov ax,[bx+di]
 8 mov ax,[bp+si]
 9 mov ax,[bp+di]
10 mov ax,[bx+si+idata]
11 mov ax,[bx+di+idata] 12 mov ax,[bp+si+idata] 13 mov ax,[bp+di+idata] 14 15 錯誤的指令: 16 mov ax,[bx+bp] 17 mov ax,[si+di]

3、只要在[…]中使用寄存器bp,而指令中沒有顯性的給出段地址,段地址就默認在ss中。

匯編語言中數據位置的表達

匯編語言中用三個概念來表達數據的位置。

1、立即數(idata)

2、寄存器

3、段地址(SA)和偏移地址(EA)

從而產生了一下的尋址方式

尋址方式***

技術分享圖片

指令要處理的數據有多長***

主要有一下幾種方式:

(1)通過寄存器名指明要處理的數據的尺寸。

下面的指令中,寄存器指明了指令進行的是字操作

1 mov ax,1
2 mov bx,ds:[0]
3 mov ds,ax
4 mov ds:[0],ax
5 inc ax
6 add ax,1000

下面的指令中,寄存器指明了指令進行的是字節操作

1 mov al,1
2 mov al,bl
3 mov al,ds:[0]
4 mov ds:[0],al
5 inc al
6 add al,100

(2)在沒有寄存器名存在的情況下,用操作符X ptr指明內存單元的長度,X在匯編指令中可以為word或byte。

下面的指令中,用word ptr指明了指令訪問的內存單元是一個字單元

1 mov word ptr ds:
[0],1 2 inc word ptr [bx] 3 inc word ptr ds:[0] 4 add word ptr [bx],2

下面的指令中,用byte ptr指明了指令訪問的內存單元是一個字節單元:

1 mov byte ptr ds:[0],1
2 inc byte ptr [bx]
3 inc byte ptr ds:[0]
4 add byte ptr [bx],2

(3)其他方式

有些指令默認了訪問的是字單元還是字節單元,
比如:push [1000H]就不用指明訪問的是字單元還是字節單元,
因為push指令只進行字操作。(每次操作sp=sp-2

div指令

div是除法指令,使用div作除法的時候:
除數:8位或16位,在寄存器或內存單元中
被除數:(默認)放在AX(16位) 或 DX和AX(32位)中
結果:運算 8位 16位
商 AL AX
   余數 AH DX

div指令格式:
div reg
div 內存單元

 1 div byte ptr ds:[0]    ; (AX)除以(DS)*16+0內存單元的字節型數據
 2 
 3 (al)=(ax)/((ds)*16+0)的商;
 4 (ah)=(ax)/((ds)*16+0)的余數
 5 
 6 
 7 div word ptr es:[0]    ; (AX)*10000H+(DX)的值除以(ES)*16+0內存單元的字型數據
 8 
 9 (ax)=[(dx)*10000H+(ax)]/((ds)*16+0)的商;
10 (dx)=[(dx)*10000H+(ax)]/((ds)*16+0)的余數
11 
12 
13 div byte ptr [bx+si+8]
14 
15 (al)= (ax)/((ds)*16+(bx)+(si)+8)的商;              
16 (ah)=(ax)/((ds)*16+(bx)+(si)+8)的余數
17 
18 
19 div word ptr [bx+si+8]
20 
21 (ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的商;
22 (dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的余數

偽指令dd

示例:data segment
    db 1
    dw 1
    dd 1
data ends
在data段中定義了三個數據:
第一個數據為01H,在data:0處,占1個字節;
第二個數據為0001H,在data:1處,占1個字;
第三個數據為00000001H,在data:3處,占2個字;

 1 問題:
 2 用div 計算data段中第一個數據除以第二個數據後的結果,商存放在第3個數據的存儲單元中。 
 3 data segment
 4     dd 100001    ; 2個字,4個內存單元,32位    0-3
 5     dw 100        ; 1個字,2個內存單元,16位    4-5
 6     dw 0        ; 1個字,2個內存單元,16位    6-7
 7 data ends
 8 
 9 分析:
10 data段中的第一個數據是被除數,為dword(雙字)型,32位,所以在做除法之前,用dx和ax存儲。應將data:0字單元中的低16位存儲在 ax中,data:2字單元中的高16位存儲在dx中。
11 
12 程序代碼:
13  mov ax,data
14  mov ds,ax
15  mov ax,ds:[0]       ;ds:0字單元中的低16位存儲在ax中
16  mov dx,ds:[2]       ;ds:2字單元中的高16位存儲在dx中
17  div word ptr ds:[4];用dx:ax中的32位數據除以ds:4字
18                     ;單元中的數據
19  mov ds:[6],ax       ;將商存儲在ds:6字單元中

技術分享圖片

技術分享圖片

匯編語言——數據處理的兩個基本問題(處理的數據在什麽地方 要處理的數據有多長)