王爽彙編語言__處理數據的兩個基本問題

計算機進行數據的處理和運算,那麼有兩個基本的問題包含在其中:

(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儲存餘數。

 
7.僞指令dd
 
前面我們用db和dw定義字節型數據和字型數據。dd是用來dword(double word,雙字)型數據的。
 
8.dup
 
dup是一個操作符,在彙編語言中同db,dw,dd等一樣,它和db,dw,dd等數據定義僞指令使用,用來進行數據的重複,比如:
db 3 dup (0)
定義了3個字節,他們的值都是0,相當於db 0,0,0
db 3 dup (0,1,2)
定義9個字節,他們是0,1,2,0,1,2,0,1,2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章