匯編語言——數據處理的兩個基本問題(處理的數據在什麽地方 要處理的數據有多長)
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字單元中
匯編語言——數據處理的兩個基本問題(處理的數據在什麽地方 要處理的數據有多長)