1樓:**易過敏
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]用於二維陣列
2樓:匿名使用者
mov ax, word ptr[bp+08]
mov bx, word ptr[bp+02]
mov cx, word ptr[bx]
8086/8088的指令有哪些定址方式
3樓:匿名使用者
概念: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中的所有定址方式,我這裡只是個總結,具體的細節還要大家自己鑽研課本,才能理解。
寫的有些倉促可能有些遺漏或錯誤,還請諒解。
關於8086定址方式
是指cpu在執行指令時尋找運算元或運算元地址的方式。1.立即定址 直接放在指令中的常數稱為立即數,立即數只能是源運算元,立即數存放在指令操作碼之後的儲存單元中。例 mov al,50h 2.暫存器定址 存放在暫存器中的資料為運算元,暫存器運算元可以是源運算元,也可以是目的運算元。例 mov al,b...
微控制器定址方式,51系列微控制器定址方式的定址方式
mov 60h,40h 是直接定址方式方式mov a,58hmov ro,0b0hmov ro,amov 0b0h,28h結果是 0b0h 28h p3 58h 這個不太確定 內部ram七種方法都可以的啊,外部資料儲存器只能和a累加器進行資料傳送 微控制器有七種定址方式分別是 1.暫存器定址例如 m...
組合語言中什麼是直接定址和間接定址?
一 直接定址方式。指令所要的運算元存放在記憶體中,在指令中直接給出該運算元的有效位址,這種定址方式為直接定址方式。在通常情況下,運算元存放在資料段中,所以,其實體地址將由資料段暫存器ds和指令中給出的有效位址直接形成,但如果使用段超越字首,那麼,運算元可存放在其它段。如。mov bx,1234h 二...