8086的指令系統(tǒng)可以分為以下六個功能組:
1.?dāng)?shù)據(jù)傳送(data transter)
2.算術(shù)運算(arithmetic)
3.邏輯運算(logic)
4.串操作(string menipulation)
5.程序控制(program control)
6.處理器控制(processor control)
一、數(shù)據(jù)傳送指令
主要介紹 mov,xchg、堆棧和地址傳送指令。
1.?dāng)?shù)據(jù)傳送mov指令
一般格式movoprd1,oprd2
mov 是操作碼,oprd1和oprd2分別是目的操作數(shù)和源操作數(shù)。
功能完成數(shù)據(jù)傳送。
具體來說,一條數(shù)據(jù)傳送指令能實現(xiàn):
⑴ cpu內(nèi)部寄存器之間數(shù)據(jù)的任意傳送(除了代碼段寄存器cs和指令指針ip以外)。
moval,bl;字節(jié)傳送
movcx,bx;字傳送
movds,bx
⑵ 立即數(shù)傳送至cpu內(nèi)部的通用寄存器組(即ax、 bx、cx、dx、bp、sp、si、di),
movcl,4
movax,03ffh
movsi,057bh
⑶ cpu內(nèi)部寄存器(除了cs和ip以外)與存儲器(所有尋址方式)之間的數(shù)據(jù)傳送。
moval,buffer
movax,[si]
mov[di],cx
movsi,block[bp]
movds,data[si+bx]
movdest[bp+di],es
⑷ 能實現(xiàn)用立即數(shù)給存儲單元賦值
例如:mov[2000h],25h
mov[si],35h
對于mov 指令應(yīng)注意幾個問題:
①存儲器傳送指令中,不允許對cs和ip進行操作;
②兩個操作數(shù)中,除立即尋址之外必須有一個為寄存器尋址方式,即兩個存儲器操作數(shù)之間不允許直接進行信息傳送;
如我們需要把地址(即段內(nèi)的地址偏移量)為areal的存儲單元的內(nèi)容,傳送至同一段內(nèi)的地址為area2的存儲單元中去,mov指令不能直接完成這樣的傳送,但我們可以cpu內(nèi)部寄存器為橋梁來完成這樣的傳送:
moval,areal
movarea2,al
③兩個段寄存器之間不能直接傳送信息,也不允許用立即尋址方式為段寄存器賦初值;如:mov ax,0;mov ds,ax
④目的操作數(shù),不能用立即尋址方式。
2.堆棧指令(簡述堆棧的概念及存取特點,如先進后出)
包括入棧(push)和出棧(pop)指令兩類。僅能進行字運算。(操作數(shù)不能是立即數(shù))
(1) 入棧指令 push
一般格式pushoprd
源操作數(shù)可以是cpu內(nèi)部的16位通用寄存器、段寄存器(cs除外)和內(nèi)存操作數(shù)(所有尋址方式)。入棧操作對象必須是16位數(shù)。
功能將數(shù)據(jù)壓入堆棧
執(zhí)行步驟為:sp=sp-2;[sp]=操作數(shù)低8位;[sp+1]= 操作數(shù)高8位
【例如】 pushbx
執(zhí)行過程為:sp=sp-1,[sp]=bh;sp=sp-1,[sp]=bl,如下圖所示。
(2) 出棧指令pop
一般格式popoprd
功 能 將數(shù)據(jù)彈出堆棧
對指令執(zhí)行的要求同入棧指令。
【例如】pop ax
pop [bx]
pop ds
3.交換指令xchg
一般格式xchg oprd1,oprd2
功 能 完成數(shù)據(jù)交換
這是—條交換指令,把一個字節(jié)或一個字的源操作數(shù)與目的操作數(shù)相交換。交換能在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲器之間進行。但段寄存器和立即數(shù)不能作為一個操作數(shù),不能在累加器之間進行。
【例如】 xchg al,cl
xchgax,di
xchgbx,si
xchgax,buffer
xchgdata[si],dh
4.累加器專用傳送指令
有三種,輸入、輸出和查表指令。前兩種又稱為輸入輸出指令。
(1) in 指令
一般格式
in al,n??; b al←[n]
in ax,n??; wax←[n+1][n]
in al,dx; bal←[dx]
in ax,dx?。弧ax←[dx+1][dx]
功能從i/o端口輸入數(shù)據(jù)至al或ax。
輸入指令允許把一個字節(jié)或一個字由一個輸入端口傳送到al或ax中。若端口地址超過255時,則必須用dx保存端口地址,這樣用dx作端口尋址最多可尋找64k個端口。
(2) out 指令
一般格式 outn,al; bal→[n]
outn,ax; w ax→[n+1][n]
outdx,al ;bal→[dx]
outdx,ax??;w ax→[dx+1][dx]
功能將al或ax的內(nèi)容輸出至i/o端口。
該指令將al或ax中的內(nèi)容傳送到一個輸出端口。端口尋址方式與in指令相同。
(3)xlat指令
一般格式xlat; al=(dx)×16+(bx)+(al))
功能完成一個字節(jié)的查表轉(zhuǎn)換。
要求:①寄存器al的內(nèi)容作為一個256字節(jié)的表的下標(biāo)。②表的基地址在bx中,③轉(zhuǎn)換后的結(jié)果存放在al中.table:
【例如】mov bx,offset table
mov al,8 ……
inal,1第9個字符 aah
xlat?。徊楸怼?
out1,al;(al)= aah 表長度256
本指令可用在數(shù)制轉(zhuǎn)換、函數(shù)表查表、代碼轉(zhuǎn)換等場合。