1樓:韓禎祺
定址方式,就是指指令中給出的尋找運算元(包括資料運算元和地址運算元)的方法。根據運算元的種類,8086/8088指令系統的定址方式分為兩大類:資料定址方式和地址定址方式。
指令定址方式將在以後的章節中結合控制轉移指令加以討論。
機器執行指令的目的就是對指定的運算元完成規定的操作,將操作結果存入規定的地方。因此,如何獲得運算元的存放地址及操作結果的存放地址就是一個很關鍵的問題。8088/8086 cpu有多種方法來獲取運算元的存放地址及操作結果的存放地址,這些方法統稱為資料定址方式。
要想掌握運算元的定址方式,就要首先明確運算元及操作結果通常存放的地點有三處:存放在指令的地址碼欄位中;存放在暫存器中;存放在儲存器的資料段、堆疊段或附加資料段中。與其對應的三種運算元是:
立即運算元、暫存器運算元和儲存器運算元。尋找這些運算元有三種基本定址方式,立即定址方式、暫存器定址方式和儲存器定址方式。其中,儲存器定址又包括多種定址方式。
下面分別介紹這些定址方式。
望採納!!!
2樓:普遐思首娟
65536個(暫存器間接定址就是用dx來定址,而dx是個16位的暫存器,當然就有2的16次方了)。
什麼是定址方式?8086/8088指令系統的定址方式有哪些?
3樓:**易過敏
8086或8088指令的定址方式
:計算機對儲存器,暫存器中資料的各種操作需要資料的存放地址,然後進行操作。
指令的定址方式就是尋找指令運算元所在地址的方式,對於我們來說,可以確定資料的**和去處
1. 立即數定址方式
例:mov ax,41h;(這個就是立即數)
運算元就是41h
立即數定址不執行匯流排週期,所以執行速度快
2. 暫存器定址方式
用暫存器的內容當做運算元來使用
例:mov ax,cx
暫存器在cpu內部,所以也是不需要執行匯流排週期滴,執行快
***********************下面這些在儲存器內的定址
3. 直接定址方式
顧名思義,直接給出了運算元的記憶體單元地址
例:mov ah,[2100h];(就是直接給出偏移地址)
資料預設在ds段中的偏移地址,如果在其他段,
在指令中加段字首如mov ah,es:[2100h]
*********************4,5,6,7定址方式的使用,使定址更加靈活
通過暫存器(bx,bp),變址暫存器(si,di)和指令的位移量(disp可以是8位或16位)
4. 暫存器間接定址方式
用暫存器的內容作為運算元的儲存單元的地址
例:mov ah,[bx]
可以使用的暫存器有bx,si,di,bp
bx,si,di--->他們在ds段中
bp他們在ss段中
使用其他段同上使用段字首
這個方式可以使**更靈活
5. 暫存器相對定址方式
例:mov bx,10[si]或mov bx,[si].10或mov bx,[si+10]
有點像c語言中的陣列或結構體
6. 基址變址定址方式
例:mov al,[bx+si]或mov al,[bx][si]
7. 相對基址變址定址方式
例 mov al ,[bx+si+10]
二.幾種變化靈活使用(idata代表位移量)
[bx+idata];[bp+idta];[si+idata];[di+idata]
可以這樣表示:[bx].idata;用於結構體
idata[bx];用於陣列
[bp+si];[bp+di];[bx+si];[bx+di]注意:bx和bp不能相加
這樣表示:[bx][si]用於二維陣列
[bx+si+idata]……
這樣表示:[bx]idata[si]用於**的資料idata[bx][si]用於二維陣列
4樓:匿名使用者
mov ax, word ptr[bp+08]
mov bx, word ptr[bp+02]
mov cx, word ptr[bx]
8086/8088的指令有哪些定址方式
5樓:匿名使用者
概念:1.指令集:cpu能夠執行的指令的集合。
2.指令:cpu所能夠執行的操作。
3.運算元:參加指令運算的資料。
4.定址方式:在指令中得到運算元的方式。
現在就重點討論定址方式,說白了也就是cpu怎麼樣從指令中得到運算元的問題。另外再強調一點運算元還分種類:
1)資料運算元:全都是在指令當中參加操作的資料。
1.立即運算元:它在指令中直接給出。
2.暫存器運算元:它被放到暫存器中。
3.儲存器運算元:當然在儲存器也就是記憶體中。
4.i/o運算元:它在你給出的i/o埠中。
2)轉移地址運算元:在指令當中不是參加運算或被處理的資料了,而是轉移地址。
還可以按照下面分類方式:
1)源運算元src
2)目的運算元dst
源運算元都是指令當中的第2個運算元,在執行完指令後運算元不變。而目的運算元是指令當中的第1個運算元,在執行完操作指令後被新的資料替代。
我們就圍繞這幾種運算元,也就是運算元所在的位置討論。
先說資料運算元,它分3大類共7種。
1)立即數定址方式:是針對立即運算元的定址方式。在指令當中直接給出,它根本就不用定址。
例1:mov ax,1234h
mov [bx],5678h
在這裡1234h和5678h都是立即運算元,在指令當中直接給出。
2)暫存器定址方式:是針對暫存器運算元的定址方式,它在暫存器中我們就用這中方式來找到它。
例2:mov bx,ax
mov bp,[si]
在這裡ax,bx,ds都算是暫存器定址,例1中的ax也是暫存器定址方式。
3)儲存器定址方式:針對在記憶體中的資料(儲存器運算元)都用這種方式來尋找,一共有5種(這是我自己的說法,便於記憶)。
不得不提及以下的概念:由於8086/8088的字長是16bit,能夠直接定址2的16次方也就是64kb,而地址匯流排是20bit,能夠直接定址2的20次方也就是1m空間,所以把記憶體分為若干個段,每個段最小16byte(被稱為小節),最大64kb,它們之間可以相互重疊,這樣一來記憶體就被分成以16byte為單元的64k小節,cpu就以1小節為單位定址:在段暫存器中給出段地址(16bit),在指令當中給出段內偏移地址(16bit),然後把段地址左移4bit再與偏移地址求和就得到資料在記憶體當中的實際實體地址了,因而可以找到資料。
1.儲存器直接定址方式:在指令當中以 [地址] 的方式直接給出資料所在記憶體段的偏移地址。
例3:mov ax,es:[1234h]
mov dx,value
mov dx,[value]
在這裡[1234h]和value就是在指令中直接給出的資料所在記憶體段的偏移地址(16bit)。
value是符號地址,是用偽指令來定義的,它代表一個在記憶體中的資料(也就是它的名字)。es:是段字首符,用來指出段地址,在這之前應該將段地址添入段中,本例中是es,預設是ds,也就是不需給出。
應該注意 [地址] 與立即定址的區別,在直接給出的資料兩邊加 表示儲存器直接定址,以區別立即定址。另外 value=[value]。
2.暫存器間接定址:不是在指令中直接給出資料在記憶體中的偏移地址,而是把偏移地址放到了暫存器中。
例4:mov ax,[bx]
這裡[bx]就是暫存器間接定址,bx中應方入段內偏移地址。其中:若使用bx,si,di預設段地址為ds,若使用bp則預設段地址為ss,並且允許段跨越,也就是加段字首符。
注意:在暫存器兩邊加 以與暫存器定址區別。
3.暫存器間接相對定址:偏移地址是bx,bp,si,di中的內容再與一個8bit或16bit 的位移量之和。
例5:mov ax,[bx]+12h
mov ax,[si]+5678h
mov ax,[bp]+1234h
在這裡[bx]+12h,[si]+5678h,[bp]+1234h都是暫存器間接相對定址。12h是8bit位移量,1234h和5678h是16bit位移量。若使用bx,si,di則預設段暫存器是ds,若使用bp則預設段暫存器是ss,並且允許段跨越。
4.基址變址定址:偏移地址是一個基址暫存器和一個變址暫存器內容的和,既:bx或bp中的一個與si或di中的一個求和而得到。
例6:mov ax,[bx+si]
mov ax,[bp+di]
上面[bx+si]和[bp+di]都是基址變址定址。若使用bx做基址暫存器則預設段地址為ds,若使用bp為基址暫存器則預設段為ss,允許段跨越。
5.基址變址相對定址:偏移量是一個基址暫存器一個變址暫存器只和再與一個8bit或一個16bit位移量只和得到。
例7:mov ax,[bx+si]+12h
mov ax,[bp+di]+1234h
[bx+si]+12h和[bp+di]+1234h就是基址變址相對定址。若使用bx做基址暫存器則預設段是ds,若使用bp做基址暫存器則預設段為ss。允許段跨越。
下面是轉移地址運算元的定址方式:
1)段內直接轉移
1.段內直接短轉移:cs(**段)內容不變,而ip(指令指標暫存器)內容由當前ip內容+(-127~127),在指令中直接給出。
例8:jmp short short_new_addr
其中,short是段內短轉移的操作符,用以指出是轉移到當前位置前後不超過±127位元組的地方。而new_addr是要轉移到的符號地址,它的位置應該在當前ip指標所在偏移地址不超過
±127的地方。否則語法出錯。
2.段內直接近轉移:cs內容不變,而ip內容由當前ip內容+(-32767~32767),在指令中直接給出。
例9:jmp near ptr near_new_addr
其中near ptr是段內近轉移的操作符,用以指出轉移到當前位置前後不超過±32767的地方。near_new_addr是要轉移到的符號地址。
2)段內間接轉移:cs的內容不變,而ip的內容放在暫存器中或者儲存器中給出。
例10:jmp bx
jmp word ptr [bx]+1234h
這種定址方式是在暫存器或儲存器中找到要轉移到的地址,而地址是16bit的,因而暫存器必須為16bit,如:bx,我們用word ptr來指定儲存器單元也是16bit的。注意:
它是間接的給出,只能使用類似於資料運算元中的除立即定址以外的6種定址方式(就在上面)。
3)段間直接定址:cs和ip的內容全都變化,由指令當中直接給出要轉移到的某一個段內的某一個偏移地址處。
例11:jmp 1234h:5678h
jmp far ptr new_addr
1234h送入cs中作為新的段地址,5678h送入ip中作為新的偏移地址。far ptr是段間直接轉移操作符,new_addr是另外一個段內的偏移地址,在這個指令中把new_addr的段地址送入cs(不用你給出),把它的段內偏移地址送入ip中作為新的偏移地址。
4)段間間接定址:cs和ip的內容全變化,由指令當中給出的一個4位元組連續儲存單元,其中低2位元組送入ip作為偏移地址,高2位元組送入cs作為段地址。
例12:jmp dword ptr [bx][si]+1234h
jmp dword ptr [1234h]
jmp dword ptr [si]
dword ptr是雙字(4個位元組連續儲存單元)操作符,用來指出下面的儲存單元是4個位元組的。由於它是4個位元組的,所以只能使用類似於資料運算元中的儲存器定址方式(共5種,還記得嗎?)。
另外作為特殊的定址方式還有三種:i/o定址,串定址,隱含定址。它們都分別針對i/o指令,串操作指令以及無運算元的指令,而且都比較簡單,讀者自行總結。
到此為止說明了8086/8088cpu中的所有定址方式,我這裡只是個總結,具體的細節還要大家自己鑽研課本,才能理解。
寫的有些倉促可能有些遺漏或錯誤,還請諒解。
在暫存器間接定址方式中,運算元應在中
哆啦a夢是夢想家 c.儲存單元 暫存器間接定址方式中,暫存器記憶體放的是運算元的地址,而不是運算元本身,即運算元是通過暫存器間接得到的,因此稱為暫存器間接定址。運算元放在ram某個儲存單元中,該單元的地址又放在暫存器r0或r1中。如要進行算術運算,要計算每班學員各科成績的平均值,可以編一個求平均成績...
關於資料暫存器和指令暫存器
1指令暫存器 ir 用來儲存當前正在執行的一條指令。當執行一條指令時,先把它從記憶體取到資料暫存器 dr 中,然後再傳送至ir。指令劃分為操作碼和地址碼欄位,由二進位制數字組成。為了執行任何給定的指令,必須對操作碼進行測試,以便識別所要求的操作。指令譯碼器就是做這項工作的。指令暫存器中操作碼欄位的輸...
組合語言高手指點一下定址中段暫存器使用的疑惑
1 段地址是cs,可以自己測試下 測試程式 sseg segment para stackdw 16 dup 00ffh sseg ends dseg segment tt db asdfasdf y dw dseg ends cseg segment assume cs cseg,ds dsegx...