計算機進行數據的處理和運算,那麼有兩個基本的問題包含在其中:
(1)處理的數據在什麼地方
(2)要處理的數據有多長
1.關於bx , si,di,bp
(1)在8086CPU中,只有這四個寄存器可以用在[...]中來進行內存單元的尋址。
(2)在[....]中,這4個寄存器可以單個出現,或只能以4種組合出現:bx和si,bx和di,bp和si,bp和di。
(3)只要在[....]中使用bp,而指令中沒有顯性地給出段地址,段地址就默認在ss中。
2.機器指令處理的數據在什麼地方
絕大多數機器指令都是進行數據處理的指令,處理大致可以分爲3類:讀取,寫入,運算。在機器指令這一層來講,並不關心數據的值是多少,而關心指令執行前一刻,它將要處理數據的位置。
3.彙編語言中數據位置的表達
彙編語言用3個概念來表達數據的位置。
(1)立即數(idata)
例如:
mov ax , 1
add bx , 2000h
or bx , 00010000b
mov al , 'a'
(2)寄存器
指令要處理的數據在寄存器中,在彙編指令中給出相應的寄存器名
例如:
mov ax , bx
mov ds , ax
push bx
mov ds:[0] , bx
(3)段地址(SA)和偏移地址(EA)
指令要處理的數據在內存中
存放地址的寄存器可以使默認的,比如:
mov ax,[0]
mov ax,[di]
mov ax,[bx+8]
mov ax,[bx+si]
mov ax,[bx+si+8]
等指令,段地址默認在ds中
mov ax,[bp]
mov ax,[bp+8]
mov ax,[bp+si]
mov ax,[bp+si+8]
等指令,段地址默認在ss中
存放段地址的寄存器也可以是顯性給出的,比如以下的指令
mov ax,ds:[bp]
mov ax,es:[bx]
mov ax,ss:[bx+si]
mov ax,cs:[bx+si+8]
4.尋址方式
8086CPU有多種尋址方式:
尋址方式 含義 名稱
[idata] EA=idata,SA=(ds) 直接尋址
[bx] EA=(bx),SA=(ds) 寄存器間接尋址
[si] EA=(si),SA=(ds) 寄存器間接尋址
[di] EA=(di),SA=(ds) 寄存器間接尋址
[bp] EA=(BP),SA=(ss) 寄存器間接尋址
-------------------------------------------------------------------------------------------------
[bx+idata] EA=(bx)+idata;SA=(ds) 寄存器相對尋址
[si+idata] EA=(si)+idata,SA=(ds) 寄存器相對尋址
[di+idata] EA=(di)+idata,SA=(ds) 寄存器相對尋址
[bp+idata] EA=(bp)+idata,SA=(ss) 寄存器相對尋址
-------------------------------------------------------------------------------------------------
[bx+si] EA=(bx)+(si),SA=(ds) 基址變址尋址
[bx+di] EA=(bx)+(di),SA=(ds) 基址變址尋址
[bp+si] EA=(bp)+(si),SA=(ss) 基址變址尋址
[bp+di] EA=(bp)+(di),SA=(ss) 基址變址尋址
-------------------------------------------------------------------------------------------------
[bx+si+idata] EA=(bx)+(si)+idata,SA=(ds) 基址變址尋址
[bx+di+idata] EA=(bx)+(di)+idata,SA=(ds) 基址變址尋址
[bp+si+idata] EA=(bp)+(si)+idata,SA=(ss) 基址變址尋址
[bp+di+idata] EA=(bp)+(di)+idata,SA=(ss) 基址變址尋址
------------------------------------------------------------------------------------------------
5.指令要處理的數據有多長
8086CPU的指令,可以處理兩種尺寸的數據,byte和word。所以在機器指令中要指明,指令進行的是字操作還是字節操作。對於這個問題,彙編語言用以下方法處理。
(1)通過寄存器名指明要處理的數據尺寸
例如,下面的指令,寄存器指明瞭指令進行的是字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面指令中,寄存器指明瞭指令進行的是字節操作
mov al,1
mov al,bl
mov ds:[0],al
mov al,ds:[0]
inc al
add al,100
(2)在沒有寄存器名存在的情況下,用操作符X ptr指明內存單元的長度,X在彙編指令中可以爲word和byte
例如,下面的指令,用word ptr指明瞭指令訪問的內存單元是一個字單元
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
下面指令中,用byte ptr指明瞭指令訪問的內存單元是一個字節單元
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
除此之外,PUSH指令只進行字操作
6.div指令
div是除法指令,使用div做除法的時候應該注意以下問題。
(1)除數:有8位和16位兩種,在一個reg或內存單元中
(2)被除數:默認放在AX或DX和AX中,如果除數爲8位,被除數則爲16位,默認在AX中存放;如果除數爲16位,被除數則爲32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
(3)結果:如果除數爲8位,則AL儲存除法操作的商,AH存儲除法操作的餘數;如果除數爲16位,則AX儲存除法操作的商,DX儲存餘數。
db 3 dup (0)
db 3 dup (0,1,2)
定義9個字節,他們是0,1,2,0,1,2,0,1,2