技術摘記
1999-07-09 單晶片8085與8051的比較
三 軟體指令方面
由於8051的發展時間比8085晚,所以在指令上的有些功能會簡化很多,而且會配合輸入/輸出埠的功能,增加指令的應用性。不過8051大部份的指令 大都可對應到8085,雖然8085有些單一指令無法對應到8051,不過可藉由幾個指令的組合來達成相同的動作。以下分別介紹8051與8085的定址 模式與指令間的比較:
(一) 定址模式(Addressing Mode)
(i) 8051的定址法可分為下列5種:
1. 直接定址法 (direct addressing):
在指令中直接指定運算元所在的位址,例如:
MOV A,7F ;把位址7FH的內容放入累加器A
直 接定址法用在內部記憶體00H~7FH特殊功能暫存器中及位元定址範圍內。8085也有直接定址法,只不過8085沒有內部記憶體,所指定的位址都是外部 記憶體,不像8051在指令上還分出內部記憶體與外部記憶體的用法。8051有些指令動作很像8085的暫存器定址法。8085所有程式控制的指令都是直接定址法,而8051就不全是直接定址法。
2. 間接定址法 (indirect addressing):
在 指令中不直接指定運算元的位址,而是把運算元的指標(pointer),8051內部具有這種指標功能的暫存器有R0,R1,SP,DPTR。間接定址法 的前置符號為”@”。R0,R1,SP是8位元暫存器,DPTR是16位元暫存器。R0,R1是兩個性質完全相同的指標,可以用來定址內部資料記憶體和外 部擴充資料記憶體,例如:
MOV R0, #30H ;
MOV A, @R0 ;間接定址法取得內部RAM位址30H的內容
MOVX A, @R0 ;間接定址法取得外部RAM位址30H的內容
SP暫存器是堆疊指標(Stack Pointer)。它是堆疊區存放或取 出資料的指位器,例如:(如果SP=30H)
PUSH 80H ;把位址80H的內容放在記憶體位址31H內
DPTR是用來定址外部資料記憶體和程式記憶體的專用指標,例如:
MOV DPTR, #23ABH ; 將外部資料記憶體位址23ABH的內容拿到累
MOVX A, @DPTR ; 加器A
至於8051的B暫存器主要是用來做乘法和除法的運算,在乘法運算中用來存放乘數及運算結果的餘數。但是不做乘除運算時,B暫存器也可以當做一般用途的暫存器來使用。而8085的B暫存器能配置成對BC以處理16位元的資料。
此定址法的動作和8085的暫存器間接定址法相同。
3. 暫存器定址法 (register addressing):
在8051內部RAM有四組暫存器庫(R0~R7),至於要使用那一個暫存器庫(bank)的暫存器,則取決於PSW暫存器裡的RS0,RS1兩個bit。
此定址法的動作和8085的暫存器定址法相同。
4. 立即定址法 (immediate addressing):運算元是存放在指令碼的後面,例如:
MOV A, #20H ;將一個常數20H放入累加器A
此定址法的動作和8085相同。
5. 索引定址法 (indexed addressing):
以一個基底暫存器的內容,再加上一個索引暫存器的內容,所得的值即是運算元所在的位址。8051只有程式記憶體的內容才具有索引定址法,基底暫存器是DPTR或PC(程式計數器),索引暫存器則是累加器A。例如:
MOV A, #28H ;
MOV DPTR, #3501H ;
MOVC A, @A+DPTR ;取得程式記憶體位址3529H的內容到A
8085單一指令格式沒有索引定址法,但是8085可以利用幾個指令的組合達成索引定址法,得到和8051相同的效果(所需的指令時間自然也比較多):
LXI D, BASE ;將基底位址(16位元)移入暫存器D
MOV L, A ;將累加器的位址移入暫存器L
MVI H, 0 ;將累加器H的內容設為0
DAD D ;將累加器的位址與基底位址相加
MOV A, M ;從記憶體取出相加後的位址內容載入累加器
(ii) 8085的定址法可分為下列6種:
1. 直接定址法 (direct addressing):
所有程式控制指令都採用直接定址法。指令的第二和第三組元含有跳控的16位元位址。
2. 暫存器間接定址法 (register indirect addressing):
採用暫存器間接定址法的指令所指定的暫存器對所儲存的是記憶體的位址,該位址的記憶體位置含有待處理或運算所需要的資料。
3. 暫存器定址法 (register addressing):
指令所指定的暫存器或暫存器對含有處理或運算所需要的資料。這些指令的一個操作元必須指定一般用途暫存器B,C,D,E,F,H,L之一,而累加器A為指令所暗示的操作元。如CMP
B是將累加器A和暫存器B的內容作比較。
4. 立即定址法 (immediate addressing):
採用立即定址法的指令本身含有待處理或運算的資料。此立即指令表示它們使用立即資料。這些指令通常於最後一字元以I來區別,如ADI,CPI,MVI等。
5. 內示定址法 (implied addressing):
指令的功能暗示著指令本身所採用的定址方法,例如:指令STC(設置進位旗標為1)暗示只處理進位旗標;而指令DAA(累加器十進位數調整)暗示只處理累加器。8051有一些指令也是此種定址法,不過現在8051的書籍並沒有強調。8085內示定址法的指令有:
CMA,CMC,DAA,RAL,RAR,RIM,RLC,RRC,STC。
6. 混合定址法 (combined addressing):
既應用立即定址法,又採用暫存器間接定址法。8051有一些指令也是此種定址法,不過現在8051的書籍並沒有強調。8085使用混合定址法的指令格式有:
“ADC M”,”ADD M”,”ANA M”,”CALL address”,”CC address”,”CM address”,”CNC address”,”CNZ
address”,”CP address”,”CPE address”,”CPO address”,”CZ address”,”MVI M,I8”.
(二) 指令集
以下我們將介紹8051與8085的指令集,以8051為主幹逐一說 明指令功能的對應關係,最後列表。我們可以根據表上所列的每個指令所需的工作時脈週期數,來算出每個指令執行所需的時間。8051的1個機械週期等於12 個工作週期,但8085就不是那麼規則,隨著指令的不同,1個機械週期會有不同的工作週期數。因此要計算8085指令執行所需的時間,不能直接由機械週期數做判斷。
(i) 8051的指令集
(1). 算術運算指令:
共有9種。其中8085不能對應到的指令有:”ADD A,address”,”ADDC a,address”,”SUBB A,address”,”MUL
AB”,”DIV AB”。
1. ADD A,:
暫存器累加:
ADD A,Rn (Rn有4個:R0~R3),動作:(A)←(A)+(Rn)此指令動作與8085之” ADD R “(R有7個 : B,C,D,E,H,L,A)相同(動作:(A)←(A)+(R)),都只需要1個機械週期。
立即資料累加:
ADD A, #data ; 動作:(A)←(A)+#data
此指令動作與8085之” ADI I8 “,( I8 為8位元立即資料)相同((A)←(A)+ I8
)。8051只需1個機械週期,但8085需2個機械週期。格式上的差別,例如:(8051)
MOV A, #12H ;A=12H
ADD A, #34H ;A=12H+34H=46H
(8085)
MVI A, 12H ;A=12H
ADI A, 34H ;A=12H+34H=46H
直接位元組累加:
ADD A,direct ;動作:(A)←(A)+(direct)
8051需要1個機械週期,而8085需要2個機械 週期。此指令動作與8085有部分相同,例如:
(8051) ADD A, B ;把暫存器B的內容加入累加 器A內
(8085) ADD B ;把暫存器B的內容加入累加器A內
但是若8051寫成以下的格式,8085沒有對應的指令寫法:
ADD A, 25H ;把內部RAM位址25H的內容加入累加器A內
間接位元組累加:
ADD A, @Ri (i=0~1) ;動作:(A)←(A)+((Ri))
此指令動作與8085之 ” ADD M ”(M為參考暫存器H和L的符號)有類似的地方。8051需要1個機械週期,8085類似動作的指令需要2個機械週期。寫法的差別如下:
(8051)
MOV R1, #30 ;R1=30H
ADD A, @R1 ;把內部RAM位址30H的內容加入累加器
(8085)
LXI H, 100H ;將RAM位址100H的位置載入(H, L)暫存器中
ADD M ;把RAM位址100H的內容加入累加器中
8085有一特定的暫存器對16位元加法指令是8051所沒有的:
DAD RP ; 動作:(HL)←(HL)+(RP)
此指令只能加暫存器對B&C,D&E,H&L或SP的內容到H&L的內容中,若產生進位,此指令會設置進位旗標。例如:
設HL=034AH,BC=214CH
DAD B ;執行之後,HL=2496,C=0,BC和其他指標不變
2. ADDC A,:
暫存器與進位旗標累加:
ADDC A, Rn ;動作:(A)←(A)+(C)+(Rn)
此指令動作與8085之 “ ADC R ”相同,都只需要1個機械週期。
立即資料與進位旗標累加:
ADDC A, #data ; 動作:(A)←(A)+(C)+data
此指令動作與8085之 “ ACI I8 “ (動作:(A) ←(A)+(C)+ I8) 相同,8051只需要1個機械週期,8085需要2個週期。
直接位元組與進位旗標累加:
ADDC A, direct ; 動作:(A)←(A)+(C)+(direct)
此指令動作與8085之” ADC R”有類似的功能,都只需要 1個機械週期。但8051以下的寫法在8085中沒有對應的寫法:
ADDC A, 20H ;把進位旗標C的內容及內部RAM位址20H的內容加入累加器
間接位元組與進位旗標累加:
ADDC A, @Ri ;動作: (A)←(A)+(C)+((Ri))
此指令動作與8085之” ADC M “ (動作: (A)←(A)+(C)+(M))相同,8051需要1個機械週期,8085須要2個機械週期。
3. SUBB A,:
累加器減暫存器再減進位旗標:
SUBB A, Rn ;動作: (A)←(A)-(C)-(Rn)
此指令動作與8085之 “ SBB R “相同,都只需要1個機械週期。
累加器減立即資料再減進位旗標:
SUBB A, #data ;動作: (A)←(A)-(C)-data
此指令動作與8085之 “ SBI I8 “相同(動作: (A)←(A)-(C)- I8 ),8051需要1個機械週期,8085需要2個機械週期。
累加器減直接位元組再減進位旗標:
SUBB A, direct ;動作: (A)←(A)-(C)-(direct)
此指令動作與8085之 “ SBB R “相似,都只需要1個機械週期,但以下的指令寫法是8085沒有的:
SUBB A, #22H ;累加器的內容減去內部RAM位址22H的內容再減去進位旗標的內容
SUBB A, P1 ;累加器的內容減去P1埠的內容再減去進位旗標的內容
累加器減間接位元組再減進位旗標:
SUBB A, @Ri ;動作: (A)←(A)-(C)-((Ri))
此指令動作與8085之 ” SBB M “(動作: (A)←(A)-(C)-(M)) 相同,8051只需1個機械週期,8085需要兩個機械週期。
8085有兩個減法運算的指令是8051所沒有的分別是:
SUB R(或M) ;動作: (A)←(A)-(R)或(M)
機械週期(SUB R):1 ; (SUB M):2。
SUI I8 ;動作: (A)←(A)-(I8) ,機械週期:2。
它們與上述的8085指令的差別只在於在做減法運算時沒有減掉進位旗標的內容。
4. INC :
累加器遞加:
INC A ; 動作:(A)←(A)+1
此指令動作與8085之 “ INR A “相同,都只需要1個機械週期。
暫存器遞加:
INC Rn ; 動作:(Rn)←(Rn)+1
此指令動作與8085之 “ INR R “相同,都只需要1個機械週期。8085的指令對於暫存器內容處理,有另一個指令是處理暫存器對的內含值—“
INX RP “ (動作:(RP)←(RP)+1,機械週期:1),不同於8051視為單一位元組的處理,舉例如下:(8051)
MOV R5, #15H ;R5=15H
INC R5 ;R5=16H
(8085) 設暫存器對DE含有01FFH數值,那麼執行
INX D ;執行之後,DE的值為0200H
INX E ;執行之後,DE的值為0100H,忽略了低位部組元所產生的進位
直接位元組遞加:
INC direct ; 動作:(direct)←(direct)+1
此指令動作與8085之 “ INR R “相同(動作:(R)←(R)+1),指定的位元組內容可以在暫存器A,B,C,D,E,H和L之中,動作上都只需要1個機械週期,但以下的寫法在8085是沒有對應的寫法:
(8051) INC 30H ;把內部RAM位址30H的內容加1。
間接位元組遞加:
INC @Ri ; 動作:((Ri))←((Ri))+1
此指令動作與8085之 “ INR M “相同(動作:(M)←(M)+1),8051只需1個機械週期,8085卻需要3個機械週期。
5. INC DPTR:將資料指標的內容加1,
INC DPTR ; 動作:(DPTR)←(DPTR)+1
此指令動作與8085之 “ INX SP “相同,而且指令都不會影響任何旗標,8051需要2個機械週期,8085只需要1個機械週期。
6. DEC :
累加器遞減:
DEC A ; 動作:(A)←(A)-1
此指令動作與8085之 “ DCR A “相同,都只需要1個機械週期。
暫存器遞減:
DEC Rn ; 動作:(Rn)←(Rn)-1
此指令動作與8085之 “ DCR R “相同,都只需要1個機械週期,對進位期標沒有影響,都只需要1個機械週期。8085的指令對於暫存器內容處理,有另一個指令是處理暫存器對的內含值—“
DCX RP “ (動作:(RP)←(RP)-1),DCX指令只能減少暫存器對B&C,D&E,H&L或SP的內容,它會把兩個暫存器的內容當做單個16位元值處理,所以會有借位的產生,例如:(8051)
MOV R5, #15H ;R5=15H
DEC R5 ;R5=14H
(8085)
設暫存器對HL=9800H
DCX H ;執行之後,HL=97FFH
直接位元組遞減:
DEC direct ; 動作:(direct)←(direct)-1
此指令動作與8085之 “ DCR R “相同(動作:(R)←(R)-1),指定的位元組內容可以在暫存器A,B,C,D,E,H和L之中,動作上都只需要1個機械週期,但以下的寫法在8085是沒有對應的寫法:
(8051) DEC 30H ;減1把內部RAM位址30H的內容
間接位元組遞減:
DEC @Ri ; 動作:((Ri))←((Ri))-1
此指令動作與808之 “ DCR M “相同(動作:(M)←(M)-1),8051需要1個機械週期,8085卻需要3個機械週期。
7. MUL AB:
把累加器A的內容乘以暫存器B的內容,相乘之後所得的結果,高8位元存入B內,低8位元存入A內,執行指令需要4個機械週期。8051有乘法的指令,8085沒有乘法的指令。
8. DIV AB:
把累加器A的內容除以暫存器B的內容,得到的商存入A內,餘數則存入B內,執行指令需要4個機械週期。8085沒有除法的指令。
9. DA A:
此指令不可以直接將累加器內16進位制數字轉換成BCD碼,也不可以使用於BCD碼的減法。它是將上一次兩個BCD碼相加後放在累加器內的和調整成兩個四位元的BCD碼。此指令與8085之
“ DAA “相同,都只需要1個機械週期。動作:如果 [[(A3-0)>9] 或 [(AC)=1]
則(A3-0)←(A3-0)+6
如果 [[(A7-4)>9] 或 [(C)=1]
則(A7-4)←(A7-4)+6
表6. 8051算術運算指令
指 令 |
說 明 |
位元組 |
工作週期(時脈數) |
ADD A,Rn | 暫存器累加至累加器 |
1 |
12 |
ADD A,direct | 直接位元組加至累加器 |
2 |
12 |
ADD A,@Ri | 間接位元組加至累加器 |
1 |
12 |
ADD A,#data | 常數值加至累加器 |
2 |
12 |
ADDC A,Rn | 與C一起將暫存器加至累加器 |
1 |
12 |
ADDC A,direct | 與C一起將直接位元組加至累加器 |
2 |
12 |
ADDC A,@Ri | 與C一起將間接位元組加至累加器 |
1 |
12 |
ADDC A,#data | 與C一起將常數值加至累加器 |
2 |
12 |
SUBB A,Rn | 累加器減暫存器再減C |
1 |
12 |
SUBB A,direct | 累加器減直接位元組再減C |
2 |
12 |
SUBB A,@Ri | 累加器減間接位元組再減C |
1 |
12 |
SUBB A,#data | 累加器減常數值再減C |
2 |
12 |
INC A | 累加器加一 |
1 |
12 |
INC Rn | 暫存器加一 |
1 |
12 |
INC direct | 直接位元組加一 |
2 |
12 |
INC @Ri | 間接位元組加一 |
1 |
12 |
DEC A | 累加器減一 |
1 |
12 |
DEC Rn | 站存器減一 |
1 |
12 |
DEC direct | 直接位元組減一 |
2 |
12 |
DEC @Ri | 間接位元組減一 |
1 |
12 |
INC DPTR | 資料指標加一 |
1 |
24 |
MUL AB | A乘以B |
1 |
48 |
DIV AB | A除以B |
1 |
48 |
DA A | 累加器作BCD調整 |
1 |
12 |
(2). 邏輯運算指令:
共有10種,其中8085不能對應到的指令有:”ANL A,direct”,”ORL A,direct”,”XRL A,direct”,”CLR A”,”SWAP
A”。1. ANL ,:
累加器與暫存器做AND:
ANL A, Rn ; 動作: (A)←(A) AND (Rn)
此指令動作與8085之 “ ANA R “相同,都只需要1個機械週期。
累加器與立即資料做AND:
ANL A, #data ; 動作: (A)←(A) AND data
此指令動作與8085之 “ ANI I8 “相同,8051需要1個機械週期,8085需要2個機械週期。
累加器與直接位元組做AND:
ANL A, direct ; 動作: (A)←(A) AND (direct)
此指令動作與8085之 “ ANA R “相似,都只需要1個機械週期,但以下的寫法8085是沒有對應的:
ANL A, 30H ;把內部RAM位址30H的內容AND入累加器中
累加器與間接位元組做AND:
ANL A, @Ri ; 動作: (A)←(A) AND ((Ri))
此指令動作與8085之 “ ANA M “相同,8051需要1個機械週期,8085需要2個機械週期。
2. ORL ,:
累加器與暫存器做OR:
ORL A, Rn ; 動作: (A)←(A) OR (Rn)
此指令動作與8085之 “ ORA R “相同,都只需要1個機械週期。
累加器與立即資料做OR:
ORL A, #data ; 動作: (A)←(A) OR data
此指令動作與8085之 “ ORI I8 “相同,8051需要1個機械週期,8085需要2個機械週期。
累加器與直接位元組做OR:
ORL A, direct ; 動作: (A)←(A) OR (direct)
此指令動作與8085之 “ ORA R “相似,都只需要1個機械週期,但以下的寫法8085是沒有對應的:
ORL A, 30H ;把內部RAM位址30H的內容OR入累加器中
累加器與間接位元組做OR:
ORL A, @Ri ; 動作: (A)←(A) OR ((Ri))
此指令動作與8085之 “ ORA M “相同,8051需要1個機械週期,8085需要2個機械週期。
3. XRL ,:
累加器與暫存器做XOR:
XRL A, Rn ; 動作: (A)←(A) XOR (Rn)
此指令動作與8085之 “ XRA R “相同,都只需要1個機械週期。
累加器與立即資料做XOR:
XRL A, #data ; 動作: (A)←(A) XOR data
此指令動作與8085之 “ XRA I8 “相同,8051需要1個機械週期,8085需要2個機械週期。
累加器與直接位元組做XOR:
XRL A, direct ; 動作: (A)←(A) XOR (direct)
此指令動作與8085之 “ XRA R “相似,都只需要1個機械週期,但以下的寫法8085是沒有對應的:
XRL A, 30H ;把內部RAM位址30H的內容XOR入累加器中
累加器與間接位元組做XOR:
XRL A, @Ri ; 動作: (A)←(A) XOR ((Ri))
此指令動作與8085之 “ XRA M “相同,8051需要1個機械週期,8085需要2個機械週期。
4. CLR A:清除累加器
CLR A ; 動作: (A)←0 ; 機械週期:1
8085沒有如此動作的指令。
5. CPL A:將累加器的內容反相
CPL A ; 動作: (A)← NOT (A) ; 機械週期:1
此指令動作與8085之 “ CMA “相同,都只需要1個機械週期。
6. RL A:將累加器向左旋轉一位元
RL A ; 動作: (An+1)←(An) n=0~6
(A0)←(A7)
此指令動作與8085之 “ RLC “相似,都只需要1個機械週期,但8051的指令不改變進位旗標,8085會改變進位旗標:
(8085)
RLC ; 動作:(An+1)←(An) n=0~6
(A0)←(A7) ,(C)←(A7)
7. RLC A:將累加器經進位旗標向左旋轉
RLC A ; 動作: (An+1)←(An) n=0~6
(A0)←(C)
(C)←(A7)
此指令動作與8085之 “ RAL “相同,都只需要1個機械週期。
8. RR A:將累加器向左旋轉一位元
RR A ; 動作: (An)←(An+1) n=0~6
(A7)←(A0)
此指令動作與8085之 “ RRC “相同,都只需要1個機械週期,但
8051的指令不改變進位旗標,8085會改變進位旗標:
(8085)
RLC ; 動作:(An)←(An+1) n=0~6
(A7)←(A0) ,(C)←(A0)
9. RRC A:將累加器經進位旗標向左旋轉
RRC A ; 動作: (An)←(An+1) n=0~6
(A7)←(C)
(C)←(A0)
此指令動作與8085之 “ RAR “相同,都只需要1個機械週期。
10. SWAP A:將累加器的高4位元和低4位元內容互相交換
SWAP A ; 動作: (A3-0)←(A7-4) ; 機械週期:1
此指令動作在8085中沒有對應的指令。
表7. 8051邏輯運算指令
指 令 |
說 明 |
位元組 |
工作週期(時脈數) |
ANL A,Rn | 暫存器AND至累加器 |
1 |
12 |
ANL A,direct | 直接位元組AND至累加器 |
2 |
12 |
ANL A,@Ri | 間接位元組AND至累加器 |
1 |
12 |
ANL A,#data | 常數值AND累加器 |
2 |
12 |
ANL direct,A | 累加器AND至直接位元組 |
2 |
12 |
ANL direct,#data | 常數AND 至直接位元組 |
3 |
24 |
ORL A,Rn | 暫存器OR至累加器 |
1 |
12 |
ORL A,direct | 直接位元組OR至累加器 |
2 |
12 |
ORL A,@Ri | 間接位元組OR至累加器 |
1 |
12 |
ORL A,#data | 常數值加OR累加器 |
2 |
12 |
ORL direct,A | 累加器OR至直接位元組 |
2 |
12 |
ORL direct,#data | 常數OR至直接位元組 |
3 |
24 |
XRL A,Rn | 暫存器XRL至累加器 |
1 |
12 |
XRL A,direct | 直接位元組XRL至累加器 |
2 |
12 |
XRL A,@Ri | 間接位元組XRL至累加器 |
1 |
12 |
XRL A,#data | 常數值加XRL累加器 |
2 |
12 |
XRL direct,A | 累加器XRL至直接位元組 |
2 |
12 |
XRL direct,#data | 常數XRL 至直接位元組 |
3 |
24 |
CLR A | 清除累加器 |
1 |
12 |
CPL A | 累加器反相 |
1 |
12 |
RL A | 累加器向左旋轉 |
1 |
12 |
RLC A | 累加器與C一起向左旋轉 |
1 |
12 |
RR A | 累加器向右旋轉 |
1 |
12 |
RRC A | 累加器與C一起向右旋轉 |
1 |
12 |
SWAP A | 累加器的高低四位元交換 |
1 |
12 |
(3). 資料轉移指令:
共有8種,其中8085不能對應到的指令有:
“,” MOV DPTR,#data16 “.” MOVC A,@A+”,” XCH , “,”
1. MOV ,:
暫存器內容載入累加器:
MOV A, Rn ; 動作: (A)←(Rn)
此指令動作與8085之 “ MOV A,R “相同,都只需要1個機械週期,但8085”MOV”的指令能提供暫存器與暫存器間資料的轉移:
MOV RD, RS ; 動作: (RD)←(RS),RD及RS可為B,C,D,E,H,或L
8085還提供了暫存器對載入累加器的指令:
LDAX RR ; 動作: (A)←(RR),RR為暫存器對B&C或D&E指定的記憶體位址內容,8085需要2個機械週期。
暫存器內容載入直接位元組內:
MOV direct, Rn ; 動作: (direct)←(Rn)
此指令動作與8085之 “ MOV RD,RS “相似,8051需要2個機械週期,8085只需要1個機械週期,而且都能提供暫存器與暫存器間資料的轉移,但8085
”MOV RD,RS ”指令,RD不能直接改寫成位址。暫存器內容載入間接位元組內:
MOV direct, @Ri ; 動作: (direct)←((Ri))
此指令動作與8085之 “ MOV R,M “相似,都需要2個機械週期,但R不能直接改寫為位址。
立即資料載入累加器:
MOV A, #data ; 動作: (A)←#data
此指令動作與8085之 “ MVI A,I8 “相同,8051需要1個機械週期,8085需要2個機械週期。
立即資料載入暫存器:
MOV Rn, #data ; 動作: (Rn)←#data
此指令動作與8085之 “ MVI R,I8 “相同,8051需要1個機械週期,8085需要2個機械週期。
8085還提供了16位元立即資料載入暫存器對的指令:
LXI RP,I16 ; 動作: (RP)←I16 ,RP為暫存器對B&C,D&E,H&L,SP,需要3個機械週期。
立即資料載入直接位元組內:
MOV direct, #data ; 動作: (direct)←#data
此指令動作與8085之 “ MVI M,I8 “相似,8051需要2個機械週期,8085需要3個機械週期。
立即資料載入間接位元組內:
MOV @Ri, #data ; 動作: ((Ri))←#data
此指令動作與8085之 “ MVI M,I8 “相同,8051需要1個機械週期,8085需要3個機械週期。
直接位元組內容載入累加器:
MOV A, direct ; 動作:(A)←(direct)
此指令動作與8085之 “ LDA direct “相同,8051需要1個機械週期,8085需要4個機械週期。
直接位元組內容載入暫存器:
MOV Rn, direct ; 動作:(Rn)←(direct)
此指令動作與8085之 “ MOV RD,RS “相似,8051需要2個機械週期,8085需要1個機械週期,8085沒有將RS置換為位址的寫法。
直接位元組內容載入直接位元組內:
MOV direct, direct ; 動作:(direct)←(direct)
8051需要2個機械週期,8085沒有這樣的指令。
直接位元組內容載入間接位元組內:
MOV @Ri, direct ; 動作:((Ri))←(direct)
此指令動作與8085之 “ MOV M,R “相似,都需要2個機械週期。8085是使用暫存器對H&L來完成相同的動作:
LHLD 位址 ; 動作:L ← (位址)
H ← (位址+1) ; 機械週期:5
間接位元組內容載入累加器:
MOV A, @Ri ; 動作:(A)←((Ri))
此指令動作與8085之 “ MOV A,M “相同,8051需要1個機械週期,8085需要2 個機械週期。
間接位元組內容載入直接位元組內:
MOV direct, @Ri ; 動作:(direct)←((Ri))
此指令動作與“相似,都需要2個機械週期。8085是使用8085之 “ MOV R,M 暫存器對H&L來完成相同的動作:
SHLD 位址 ; 動作: (位址) ← L
(位址+1) ← H ; 機械週期:5
累加器內容載入暫存器:
MOV Rn, A ; 動作: (Rn)←(A)
此指令動作與8085之 “ MOV R, A “相同,都只需要1個機械週期。
8085還提供將累加器內容載入暫存器對的指令:
STAX RR ; 動作:(RR)←(A),此指令只能指定暫存器對B&C,D&E,例如:
設B=3FH, C=16H,A=3AH,則
STAX B ; 執行之後,記憶體位址3F16H含有3AH
累加器內容載入直接位元組內:
MOV diret, A ; 動作: (direct)←(A)
此指令動作與8085之 “ STA direct “相同,8051需要2個機械週期,8085需要4個機械週期。
累加器內容載入間接位元組內:
MOV @Ri, A ; 動作: ((Ri))←(A)
此指令動作與8085之 “ MOV M,A “相同,8051需要1個機械週期,8085需要2個機械週期。
2. MOV DPTR,#data16:
將16位元的常數載入資料指標內。
MOV DPTR, #data16 ; 動作:(DPTR) ← data 15-0, 機械週期:2
MOV #1234H ; 執行後高位元組DPH=12H,低位元組DPL=34H
8085沒有資料指標DPTR,只有儲存箱指標SP,且8085沒有這樣的指令。
3. MOVC A,@A+:
此指令是到程式區裡讀一個位元組資料到累加器,這個位元組的位址是由累加器的值加上一個16位元基底暫存器所產生的。機械週期皆為2。8085沒有這樣的指令。
基底暫存器為資料指標:
MOVC A, @A+DPTR ; 動作: (A) ← ((A)+(DPTR))
基底暫存器為程式計數器:
MOVC A, @A+PC ; 動作: (PC) ← (PC) +1
(A) ← ((A)+(PC))
4. MOVX ,:
此指令與8051之” MOV , ”主要差 別在於”MOVX”是對外部記憶體做存取動作,而”MOV”是對內部記憶體做存取。8085沒有內部記憶體,所以8085所使用的記憶體位址都是外部記憶體。因此,8085對應8051之”MOVX”指令,可以參考前面提過的8051之”MOV”指令部分。
外部RAM的內容載入累加器:
MOVX A,@Ri ; 動作: (A) ← ((Ri)) ;機械週期:2
DPTR定址的外部RAM內容載入累加器:
MOVX A,@DPTR ; 動作: (A) ← ((DPTR)) ;機械週期:2
把累加器的內容載入外部RAM的Ri位址內:
MOVX @Ri,A ; 動作: ((Ri)) ← (A) ;機械週期:2
把累加器的內容載入外部RAM的DPTR位址內:
MOVX @DPTR,A ; 動作: (DPTR) ← (A) ;機械週期:2
5. PUSH direct: 將直接位元組的內容推入堆疊器內。
PUSH direct ; 動作: (SP) ← (SP)+1
((SP)) ← (direct) ; 機械週期:2
此指令與8085之 " PUSH RR "有相似的作用,RR是暫存器對B&C,D&E,H&L和PSW(A&F),機械週期:3,但動作SP是呈現遞減的情形:
(SP) ← (SP)-2, STACK←RR
例如:
(8051)
設SP=09,DPTR=0123H
PUSH DPL ;將23H存入RAM的0AH位址
PUSH DPH ;將01H存入RAM的0BH位址
(8085)
設B=2AH,C=4CH,SP=9AAFH
PUSH B ; 將2A存入RAM的9AAEH位址,4CH存入RAM的9AADH位址
所以可以看出8085可以利用暫存器做到資料指標的角色。
6. POP direct:從堆疊區取回資料。
POP direct ; 動作: (direct) ← ((SP))
(SP) ← (SP)-1 ; 機械週期:2
此指令與8085之 " POP RR "有相似的作用,RR是暫存器對B&C,D&E,H&L和PSW(A&F),機械週期:3,但動作SP是呈現遞加的情形:
RR←STACK, (SP)←(SP)+2
7. XCH ,:
累加器的內容和暫存器的內容互換:
XCH A,Rn ; 動作: (A) ←→ (Rn) ;機械週期:1
8085沒有此指令動作,但8085提供暫存器H&L與D&E內容的互相交換的指令:
XCHG ; 動作: (HL) ←→ (DE) ;機械週期:1
例如:
(8085) 設HL=1234H,DE=ABCDH
XCHG ;執行後,HL=ABCDH,DE=1234H
累加器的內容和直接位元組的內容互換:
XCH A,direct ; 動作: (A) ←→ (direct) ;機械週期:1
8085沒有此指令動作。
累加器的內容和間接位元組的內容互換:
XCH A,@Ri ; 動作: (A) ←→ ((Ri)) ;機械週期:1
8085沒有此指令動作。但8085提供儲存箱頂兩組位元內容和暫存器對H&L的內容互換指令:
XTHL ; 動作: (STACK) ←→ (HL) ;機械週期:5
例如:
(8085) 設SP=10ADH,HL=0B3CH,記憶體位址10ADH含有F0H,記憶體位址10AEH含有0DH,那麼執行
XTHL ;執行後,L=F0H,H=0DH,記憶體位址10ADH含有3CH,記憶體位址10AEH含有0BH。
8. XCHD A,@Ri :交換低四位元
XCHD A,@Ri ; 動作: (A
8085沒有這樣的指令。
表8. 8051資料轉移指令
指 令 |
說 明 |
位元組 |
工作週期(時脈數) |
MOV A,Rn | 暫存器內容移至累加器 |
1 |
12 |
MOV A,direct | 直接位元組內容移至累加器 |
2 |
12 |
MOV A,@Ri | 間接位元組內容移至累加器 |
1 |
12 |
MOV A,#data | 常數值移至累加器 |
2 |
12 |
MOV Rn,A | 累加器內容移至暫存器 |
1 |
12 |
MOV Rn,direct | 直接位元組內容移至暫存器 |
2 |
24 |
MOV Rn,#data | 常數值移至暫存器 |
2 |
12 |
MOV direct,A | 累加器內容移至直接位元組 |
2 |
12 |
MOV direct,Rn | 暫存器內容移至直接位元組 |
2 |
24 |
MOV direct,direct | 直接位元組內容移至直接位
元組 |
3 |
24 |
MOV direct,@Ri | 間接位元組內容移至直接位
元組 |
2 |
24 |
MOV direct,#data | 常數移至直接位元組 |
3 |
24 |
MOV @Ri,A | 累加器內容移至間接位元組 |
1 |
12 |
MOV @Ri,direct | 直接位元組內容移至間接位
元組 |
2 |
24 |
MOV @Ri,#data | 常數移至間接位元組 |
2 |
12 |
MOV DPTR,#data 16 | 16位元常數移至資料指標 |
3 |
24 |
MOVC A,@A+DPTR | 程式記憶體的資料移入累加器 |
1 |
24 |
MOVC A,@A+PC | 程式記憶體的資料移入累加器 |
1 |
24 |
MOVX A,@Ri | 外部RAM的資料移入累加器
(8位元定址) |
1 |
24 |
MOVX A,@DPTR | 外部RAM的資料移入累加器
(16位元定址) |
||
MOVX @Ri,A | 累加器內容寫到外部RAM
(8位元位址) |
1 |
24 |
MOVX @DPTR,A | 累加器內容寫到外部RAM
(16位元位址) |
1 |
24 |
PUSH direct | 直接位元組內容放至堆疊區 |
2 |
24 |
POP direct | 從堆疊區拿回資料至直接位
元組 |
2 |
24 |
XCH A,Rn | 累加器與暫存器的內容互換 |
1 |
12 |
XCH A,direct | 累加器與直接位元組的內容
互相交換 |
2 |
12 |
XCH A,@Ri | 累加器與間接位元組的內容
互相交換 |
1 |
12 |
XCHD A,@Ri | 累加器與間接位元組的低四
位元互相交換 |
1 |
12 |
(4). 布林變數操作指令:
共有11種,其中8085不能對應的指令有:”CLR bit”,”SETB bit”,”ANL C,”,”ORL C,”,”MOV
,”,”JB bit,rel”,”JNB bit,rel”,”JBC bit,rel”.
1. CLR bit:
清除進位旗標內容:
CLR C ; 動作: (C) ← 0 ;機械週期:1
8085採用以下三種方式清除進位旗標:
(1) STC ;設置進位旗標為1
CMC ;補算(反相)進位旗標
(2) ANA A ;A的內容不變,但進位旗標被清除為0
(3) ORA A ;A的內容不變,但進位旗標被清除為0
清除直接位元內容:
CLR bit ; 動作: (bit) ← 0 ;機械週期:1
8085沒有此指令動作。
2. SETB bit:
設定進位旗標內容:
SETB C ; 動作: (C) ← 1
此指令動作與8085之 “ STC “相同,都只需要1個機械週期。
設定直接位元內容:
SETB bit ; 動作: (bit) ← 1 ;機械週期:1
8085沒有此指令動作。
3. CPL bit:
將進位旗標反相:
CPL C ; 動作: (C) ← NOT (C)
此指令動作與8085之 “ CMC “相同,都只需要1個機械週期。
將直接位元反相:
CPL bit ; 動作: (bit) ← NOT (bit) ; 機械週期:1
8085沒有此指令動作。
4. ANL C,:
將進位旗標與直接位元內容做AND:
ANL C,bit ; 動作: (C) ← (C) AND (bit)
將進位旗標與直接位元內容反相做AND:
ANL C,/bit ; 動作: (C) ← (C) AND (NOT(bit))
以上指令都需要2個機械週期,但8085沒有這樣的指令。
5. ORL C,:
將進位旗標與直接位元內容做ORL:
ORL C,bit ; 動作: (C) ← (C) ORL (bit)
將進位旗標與直接位元內容反相做AND:
ORL C,/bit ; 動作: (C) ← (C) ORL (NOT(bit))
以上指令都需要2個機械週期,但8085沒有這樣的指令。
6. MOV ,:
將直接位元的內容載入進位旗標內:
MOV C,bit ; 動作: (C) ← (bit) ;機械週期:1
將進位旗標的內容載入直接位元內:
MOV bit,C ; 動作:(bit) ← (C) ;機械週期:2
8085沒有以上的指令動作。
7. JC rel: 如果C=1就跳至相對位址
JC rel ; 動作: 如果C=0, (PC) ← (PC)+2
如果 C=1, (PC) ← (PC)+相對位址
此指令與8085之 “ JC address “相同,8051需要2個機械週期,8085需要2或3個週期。其動作:
JC address ; 如果 C=1, (PC) ← 位址
如果C=0, (PC) ← (PC)+1,執行下一指令
8. JNC rel: 如果C=0就跳至相對位址
JNC rel ; 動作: 如果C=0, (PC) ← (PC)+相對位址 如果 C=1, (PC) ← (PC)+2
此指令與8085之 “ JNC address “相同,8051需要2個機械週期,8085需要2或3個週期。其動作:
JNC address ; 如果 C=0, (PC) ← 位址
如果C=1, (PC) ← (PC)+1,執行下一指令
9. JB bit,rel: 如果bit=1就跳至相對位址
JB bit,rel ; 動作: 如果bit=1, (PC) ← (PC)+相對位址
如果bit=0, (PC) ← (PC)+3
其機械週期為2,8085沒有此指令動作。
10. JNB bit,rel: 如果bit=0就跳至相對位址
JNB bit,rel ; 動作: 如果bit=0, (PC) ← (PC)+相對位址
如果bit=1, (PC) ← (PC)+3
其機械週期為2,8085沒有此指令動作。
11. JBC bit,rel: 如果bit=1就跳至相對位址,並且清除bit
JBC bit,rel ; 動作: 如果bit=1, (PC) ← (PC)+相對位址
(bit) ← 0
如果bit=0, (PC) ← (PC)+3
其機械週期為2,8085沒有此指令動作。
表9. 布林變數指令
指 令 |
說 明 |
位元組 |
工作週期(時脈數) |
CLR C | 清除進位旗標 |
1 |
12 |
CLR bit | 清除bit |
2 |
12 |
SETB C | 設定進位旗標 |
1 |
12 |
SETB bit | 設定bit=1 |
2 |
12 |
CPL C | 進位旗標反相 |
1 |
12 |
CPL bit | bit反相 |
2 |
12 |
ANL C,bit | bit AND 至進位旗標 |
2 |
24 |
ANL C,/bit | bit 反相後再AND至進位旗標 |
2 |
24 |
ORL C,bit | bit OR 至進位旗標 |
2 |
24 |
ORL C,/bit | bit 反相後OR至進位旗標 |
2 |
24 |
MOV C,bit | bit之狀態移至進位旗標 |
2 |
12 |
MOV bit,C | 進位旗標之狀態移至bit |
2 |
24 |
JC rel | 若C=1就跳躍 |
2 |
24 |
JNC rel | 若C=0就跳躍 |
2 |
24 |
JB bit,rel | 若bit=1就跳躍 |
3 |
24 |
JNB bit,rel | 若bit=0就跳躍 |
3 |
24 |
JBC bit,rel | 若bit=1就跳躍,且清除此位元 |
3 |
24 |
(5). 程式分控(Branch)指令:
@A+DPTR “,“ JZ rel “,” JNZ rel “,CJNE , “,” DJNZ ,rel
1. ACALL addr11:絕對副程式呼叫
ACALL addr11 ; 動作:(PC) ← (PC)+2
(SP) ← (SP)+1
((SP)) ← (PC7-0)
(SP) ← (SP)+1
((SP)) ← (PC15-8)
(PC10-0) ← page address ;機械週期:2
由於有效位址只有11位元,所以欲呼叫之副程式,位址必須在相同的2K byte範圍內。8085沒有此動作指令。
2. LCALL addr16: 遠程副程式呼叫
LCALL addr16 ; 動作:(PC) ← (PC)+2
(SP) ← (SP)+1
((SP)) ← (PC7-0)
(SP) ← (SP)+1
((SP)) ← (PC15-8)
(PC15-0) ← page address ;機械週期:2
由於有效位址為16位元,所以呼叫的副程式位址可在64K byte程式記憶體的任何位址,本指令可簡寫為” CALL address ”。此指令與8085之
“ CALL address “有相同的效用,8085推入堆疊區的動作是呈遞減:CALL address ;動作: (SP) ← (SP)-1 ,STACK←PC8-15
(SP) ← (SP)-1 ,STACK←PC0-7
(PC15-0) ← address ;機械週期:5
3. RET : 由副程式返回主程式
RET ; 動作: (PC15-8) ← ((SP))
(SP) ← (SP)-1
(PC7-0) ← ((SP))
(SP) ← (SP)-1
此指令動作與8085之 “ RET “相同,一般來說RET和CALL連用,8051需要2個機械週期,8085需要3個機械週期。
4. RETI: 由中斷副程式返回主程式
RET ; 動作: (PC15-8) ← ((SP))
(SP) ← (SP)-1
(PC7-0) ← ((SP))
(SP) ← (SP)-1 ; 機械週期:2
在8051中斷副程式一定要用RETI做結尾,8085沒有這樣的指令。
5. AJMP addr11:絕對跳躍
AJMP addr11 ; 動作: (PC) ← (PC)+2
(PC10-0) ← page address ;機械週期:2
由於有效位址只有11位元,所以欲跳躍之目的位址,必須在相同的2K bytes範圍內。8085沒有此動作指令。
6. LJMP addr16:遠程跳躍
LJMP addr16 ; 動作:(PC) ← address15-0
由於有效位址為16位元,所以跳躍之目的位址可在64K byte程式記憶體的任何位址,本指令可簡寫為” JMP address ”。此指令與8085之
“ JMP address “相同,8051需要2個機械週期,8085需要3個機械週期。7. SJMP rel:短程跳躍
SJMP ; 動作: (PC) ← (PC)+2
(PC) ← (PC)+相對位址 ; 機械週期:2
8085沒有這樣的指令。
8. JMP @A+DPTR:間接跳躍
JMP @A+DPTR ; 動作: (PC) ← (A)+(PC)+2 ; 機械週期:2
8085沒有這樣的指令。
9. JZ rel: 如果累加器不等於零,則跳至相對位址
JZ rel ; 動作: 如果A≠0, (PC) ← (PC)+相對位址
如果A=0,(PC) ← (PC)+2 ;機械週期:2
8085沒有這樣的指令。而8085的 “ JZ address “指令動作決定於零旗標值,如果零旗標值等於1,則跳至指定的位址;如果零旗標值等於0,則程式執行下一順序指令。機械週期2或3。
(8085) JZ address ;若Z=1, (PC) ← (PC)+位址
若Z=0, (PC) ← (PC)+1 ;
10. JNZ rel: 如果累加器等於零,則跳至相對位址
JNZ rel ; 動作: 如果A=0, (PC) ← (PC)+相對位址
如果A≠0,(PC) ← (PC)+2 ;機械週期:2
8085沒有這樣的指令。而8085的 “ JNZ address “指令動作決定於零旗標值,如果零旗標值等於0,則跳至指定的位址;如果零旗標值等於1,則程式執行下一順序指令。機械週期:2或3。
(8085) JNZ address ;若Z=0, (PC) ← (PC)+位址
若Z=1, (PC) ← (PC)+1
11. CJNE ,,rel:
累加器的內容不等於直接位元組的內容就跳至相對位址:
CJNE A,direct,rel ;
動作: 若(A)=(direct), (PC) ← (PC)+3
若(A)≠(direct), (PC) ← (PC)+相對位址
若(A) < (direct),則(C) ← 1
否則(C) ← 0
累加器的內容不等於立即資料就跳至相對位址:
CJNE A,#data,rel ;
動作: 若(A)=data, (PC) ← (PC)+3
若(A)≠data, (PC) ← (PC)+相對位址
若(A) < (data),則(C) ← 1
否則(C) ← 0
暫存器的內容不等於立即資料就跳至相對位址:
CJNE Rn,#data,rel ;
動作: 若(Rn)=data, (PC) ← (PC)+3
若(Rn)≠data, (PC) ← (PC)+相對位址
若(Rn) < data,則(C) ← 1
否則(C) ← 0
間接位元組的內容不等於立即資料就跳至相對位址:
CJNE @Ri,#data,rel ;
動作: 若((Ri))=data, (PC) ← (PC)+3
若((Ri))≠data, (PC) ← (PC)+相對位址
若((Ri)) < data,則(C) ← 1
否則(C) ← 0
以上指令都需要2個機械週期,但8085沒有這樣的指令。
12. DJNZ ,rel:
暫存器的內容遞減,結果不等於零則跳至相對位址:
DJNZ Rn,rel ;
動作: (Rn) ← (Rn)-1
若Rn≠0, 則(PC) ← (PC)+相對位址
若Rn=0, 則(PC) ← (PC)+2
直接位元組的內容遞減,結果不等於零則跳至相對位址:
DJNZ direct,rel ;
動作: direct ← direct-1
若direct≠0,則(PC) ← (PC)+相對位址
若direct=0,則(PC) ← (PC)+3
以上指令都需要2個機械週期,但8085沒有這樣的指令。
13. NOP :無動作。
動作:(PC) ← (PC)+1
此指令動作與8085之 “ NOP “相同,都需要1個機械週期。
表10. 程式分控指令
指 令 |
說 明 |
位元組 |
工作週期(時脈數) |
ACALL addr11 | 絕對式副程式呼叫 |
2 |
24 |
LCALL addr16 | 遠程副程式呼叫 |
3 |
24 |
RET | 從副程式返回 |
1 |
24 |
RETI | 從中斷副程式返回 |
1 |
24 |
AJMP addr11 | 絕對式跳躍 |
2 |
24 |
LJMP addr11 | 遠程跳躍 |
3 |
24 |
SJMP rel | 短程跳躍 |
2 |
24 |
JMP @A+DPTR | 間接跳躍 |
1 |
24 |
JZ rel | 若A=0就跳躍 |
2 |
24 |
JNZ rel | 若A≠0就跳躍 |
2 |
24 |
CJNE A,direct,rel | 若累加器與直接位元組內容不
相等就跳躍 |
3 |
24 |
CJNE A,#data,rel | 若累加器內容不等於data就
跳躍 |
3 |
24 |
CJNE Rn,#data,rel | 若暫存器內容不等於data就
跳躍 |
3 |
24 |
CJNE @Ri,#data,rel | 若間接位元組內容不等於data
就跳躍 |
3 |
24 |
DJNZ Rn,rel | 暫存器內容減一,若不等於零
就跳躍 |
2 |
24 |
DJNZ direct,rel | 直接位址內容減一,若不等於零
就跳躍 |
3 |
24 |
NOP | 沒動作 |
1 |
12 |
(ii). 8085的指令集
(1). 算術運算指令:8051的算術運算指令都能對應到8085。
- ADD 加到累加器
- ADI 以立即資料加到累加器
- ADC 利用進位旗標加到累加器
- ACI 利用進位旗標以立即資料加到累加器
- SUB 從累加器減去
- SUI 累加器減去立即資料
- SBB 利用貸位旗標從累加器中減去
- SBI 利用貸位旗標從累加器中減去立即資料
- INR 增加指定組元1
- DCR 減少指定組元1
- INX 增加暫存器對1
- DCX 減少暫存器對1
- DAD 將指定的暫存器對的內容加到H和L暫存器對中
- DAA 調整累加器的8位元數值成兩個4位元二進位碼十 進位數字,在多位元組算術運算中,DAA是緊跟在算術運算指令之後。
(表中目的碼:
ppqq代表4個16進位數字記憶體的位址,
YY代表兩個16進位數字資料YYYY代表4個16進位數字資料,
X代表資料表選擇的二進位數字,
ddd代表識別目的暫存器的二進位數字,
sss代表識別來源暫存器的二進位數字:
000=B,001=C,010=D,011=E,100=H,101=L,111=A。
機械週期種類為:1=4個T狀態的操作元取出,
2=6個T狀態的操作元取出,
3=記憶體讀取,4=I/O讀取,5=記憶體寫入,6=I/O寫入,7=通徑等候)
表11. 8085算術運算指令目的碼和執行週期
指令 |
目的碼 |
組元 |
時脈週期 |
8085A 機械週期種類 |
|
8080A |
8085A |
||||
ACI DATA |
CE YY |
2 |
7 |
7 |
1 3 |
ADC REG |
10001XXX |
1 |
4 |
4 |
1 |
ADC M |
8E |
1 |
7 |
7 |
1 3 |
ADD REG |
10000XXX |
1 |
4 |
4 |
1 |
ADD M |
86 |
1 |
7 |
7 |
1 3 |
ADI DATA |
C6 YY |
2 |
7 |
7 |
1 3 |
DAA |
27 |
1 |
4 |
4 |
1 |
DAD RP |
00XX1001 |
1 |
10 |
10 |
1 7 7 |
DCR REG |
00XXX101 |
1 |
5 |
4 |
1 |
DCR M |
35 |
1 |
10 |
10 |
1 3 5 |
DCX RP |
00XX1011 |
1 |
5 |
6 |
2 |
INR REG |
00XXX100 |
1 |
5 |
4 |
1 |
INR M |
34 |
1 |
10 |
10 |
1 3 5 |
INX RP |
00XX0011 |
1 |
5 |
6 |
2 |
SBB REG |
10011XXX |
1 |
4 |
4 |
1 |
SBB M |
9E |
1 |
7 |
7 |
1 3 |
SBI DATA |
DE YY |
2 |
7 |
7 |
1 3 |
SUB REG |
10010XXX |
1 |
4 |
4 |
1 |
SUB M |
96 |
1 |
7 |
7 |
1 3 |
SUI DATA |
D6 YY |
2 |
7 |
7 |
(2). 邏輯運算指令:其中8051不能對應的指令有:”CMP R”,”CMP M”,”CPI I8 “。
- ANA 與累加器AND運算
- ANI 利用立即資料與累加器AND運算
- ORA 與累加器OR運算
- ORI 利用立即資料與累加器OR運算
- XRA 與累加器XOR運算
- XRI 利用立即資料與累加器XOR運算
- CMP 與累加器比較:比較的結果由進位旗標和零旗標表示。
CMP R ; 動作: 兩值相等時, Z=1
兩值同號時,累加器值較大→Z=0,C=0
兩值同號時,累加器值較小→Z=0,C=1
兩值異號或其中一值為補數時,累加器值較大→Z=0,C=0
兩值異號或其中一值為補數時,累加器值較小→Z=0,C=1
機械週期:1
CMP M ;動作如" CMP R ",但機械週期為2。- CPI 利用立即資料與累加器比較,結果由進位旗標和零旗標表示。
CPI I8 ; 動作: 兩值相等時, Z=1
兩值同號時,累加器值較大→Z=0,C=0
兩值同號時,累加器值較小→1Z=0,C=1
兩值異號或其中一值為補數時,累加器值較大→Z=0,C=0
兩值異號或其中一值為補數時,累加器值較小→Z=0,C=1
機械週期:2- RLC 左旋轉累加器一位
- RRC 右旋轉累加器一位
- RAL 左旋轉累加器一位,經過進位數元
- RAR 右旋轉累加器一位,經過進位數元
- CMA 補算累加器
- CMC 補算進位旗標
- STC 設置進位旗標
表12. 8085邏輯運算指令目的碼和執行週期
指令 |
目的碼 |
組元 |
時脈週期 |
8085A 機械週期種類 |
|
8080A |
8085A |
||||
ANA REG |
10100XXX |
1 |
4 |
4 |
1 |
ANA M |
A6 |
1 |
7 |
7 |
1 3 |
ANI DATA |
E6 YY |
2 |
7 |
7 |
1 3 |
CMA |
2F |
1 |
4 |
4 |
1 |
CMC |
3F |
1 |
4 |
4 |
1 |
CMP REG |
10111XXX |
1 |
4 |
4 |
1 |
CMP M |
BE |
1 |
7 |
7 |
1 3 |
CPI DATA |
FE YY |
2 |
7 |
7 |
1 3 |
ORA REG |
10110XXX |
1 |
5 |
4 |
1 |
ORA M |
B6 |
1 |
7 |
7 |
1 3 |
ORI DATA |
F6 YY |
2 |
7 |
7 |
1 3 |
RAL |
17 |
1 |
4 |
4 |
1 |
RAR |
1F |
1 |
4 |
4 |
1 |
RLC |
07 |
1 |
4 |
4 |
1 |
RRC |
0F |
1 |
4 |
4 |
1 |
STC |
37 |
1 |
4 |
4 |
1 |
XRA REG |
10101XXX |
1 |
4 |
4 |
1 |
XRA M |
AE |
1 |
7 |
7 |
1 3 |
XRI DATA |
EE YY |
2 |
7 |
7 |
3 |
(3)資料轉移指令:其中8051不能對應的指令有:” XCHG “,” XTHL “。
- MOV 轉移
- MVI 轉移立即資料
- LDA 直接由記憶體裝載累加器
- STA 直接儲存累加器到記憶體
- LHLD 直接由記憶體裝載H和L暫存器
- SHLD 直接儲存H和L暫存器到記憶體
- LXI 以立即資料裝載暫存器對
- LDAX 由暫存器對裡的位址指定的記憶體裝載累加器
- STAX 儲存累加器到暫存器對裡的位址指定的記憶體中
- XCHG 將暫存器對D和E與暫存器對H和L交換
XCHG ; 動作: (HL) ←→ (DE) ;機械週期:1- XTHL 以暫存器對H和L與儲存箱頂兩組元交換
XTHL ; 動作: (STACK) ←→ (HL) ;機械週期:5
表13. 8085資料轉移指令目的碼和執行週期
指令 |
目的碼 |
組元 |
時脈週期 |
8085A 機械週期種類 |
|
8080A |
8085A |
||||
LDA ADDR |
3A ppqq |
3 |
13 |
13 |
1 3 3 3 |
LDAX RP |
000X0001 |
3 |
10 |
10 |
1 3 |
LHLD ADDR |
2A ppqq |
3 |
16 |
16 |
1 3 3 3 3 |
LXI RP,DATA16 |
00XX0001 YYYY |
3 |
10 |
10 |
1 3 3 |
MOV REG,REG |
01dddsss |
1 |
5 |
4 |
1 |
MOV M,REG |
01110sss |
3 |
10 |
10 |
1 5 |
MOV REG,M |
01ddd110 |
1 |
7 |
7 |
1 3 |
MVI REG,DATA |
00ddd110 YYYY |
2 |
7 |
7 |
1 3 |
MVI M,DATA |
36 YY |
2 |
10 |
10 |
1 3 5 |
SHLD ADDR |
22 ppqq |
3 |
16 |
16 |
1 3 3 5 5 |
STA ADDR |
32 ppqq |
3 |
13 |
13 |
1 3 3 5 |
STAX RP |
000X0010 |
1 |
7 |
7 |
1 5 |
XCHG |
EB |
1 |
4 |
4 |
1 |
XTHL |
E3 |
1 |
18 |
16 |
5 |
(4)分控指令:
1. 無條件分控指令 :
在任何情況下都改變程式執行的正常順序,8051都有指令可以對應。
1.1 JMP 跳控
1.2 CALL 叫控
1.3 RET 回轉2. 條件分控指令:
取決於決策條件是否成立。8085於取出指令第二位元組時試驗條件,若特定的狀況沒有滿足,就會跳越過指令的第二位元組去取出下一指令的操作碼。 “,
2.1 條件跳控:
8051不能對應的指令有:” JZ “,” JNZ “,” JPE “,” JPO “,JP “,” JM “,” JPE “,” JPO “.
2.1.1 JC address: 若進位旗標等於1,跳控到指定的位址。
2.1.2 JNC address: 若進位旗標等於0,跳控到指定的位址。
2.1.3 JZ address: 若零旗標等於1,跳控到指定的位址。
8051沒有這樣的指令。機械週期:2或3。
2.1.4 JNZ address: 若零旗標等於0,跳控到指定的位址。
8051沒有這樣的指令。機械週期:2或3。
2.1.5 JP address: 若帶號旗標等於0,跳控到指定的位址。
動作: 若S=0,(PC) ← 位址
若S=1,(PC) ← (PC)+1 ,執行下一指令。
8051沒有這樣的指令。機械週期: 2或3。2.1.6 JM address: 若帶號旗標等於1,跳控到指定的位址。
動作: 若S=1,(PC) ← 位址
若S=0,(PC) ← (PC)+1 ,執行下一指令。
8051沒有這樣的指令。機械週期: 2或3。2.1.7 JPE address: 若同位數旗標等於1,跳控到指定的位址。
動作: 若P=1,(PC) ← 位址
若P=0,(PC) ← (PC)+1 ,執行下一指令。
8051沒有這樣的指令。機械週期: 2或3。2.1.8 JPO address: 若同位數旗標等於0,跳控到指定的位址。
動作: 若P=1,(PC) ← 位址
若P=0,(PC) ← (PC)+1 ,執行下一指令。
8051械週期: 2或3。沒有這樣的指令。機2.2 條件叫控:
8051不能對應以下的指令,不過8051可以使用相同的指令組合對應8085”CC”與”CNC”。
2.2.1 CC address: 具有JC和PUSH指令的組合功能。
動作: 若C=1,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7 )
(PC) ← 位址
若C=0,(PC) ← (PC)+1
機械週期: 2或5。2.2.2 CNC address: 具有JNC和PUSH指令的組合功能。
動作: 若C=0,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7 )
(PC) ← 位址
若C=1,(PC) ← (PC)+1
機械週期: 2或5。2.2.3 CZ address: 具有JZ和PUSH指令的組合功能。
動作: 若Z=1,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7)
(PC) ← 位址
若Z=0,(PC) ← (PC)+1
機械週期: 2或5。2.2.4 CNZ address: 具有JNZ和PUSH指令的組合功能。
動作: 若Z=0,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7)
(PC) ← 位址
若Z=1,(PC) ← (PC)+1
機械週期: 2或5。2.4.5 CP address: 具有JP和PUSH指令的組合功能。
動作: 若S=0,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7)
(PC) ← 位址
若S=1,(PC) ← (PC)+1
機械週期: 2或5。2.4.6 CM address: 具有JM和PUSH指令的組合功能。
動作: 若S=1,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7)
(PC) ← 位址
若S=0,(PC) ← (PC)+1
機械週期: 2或5。2.4.7 CPE address: 具有JPE和PUSH指令的組合功能。
動作: 若P=1,(SP) ← (SP)-1,(STACK)←(PC8-15)
(SP) ← (SP)-1,(STACK)←(PC0-7)
(PC) ← 位址
若P=0,(PC) ← (PC)+1
機械週期: 2或5。2.4.8 CPO address: 具有JPO和PUSH指令的組合功能。
動作: 若P=0,(SP) ← (SP)-1,(STACK)←(PC8-15 )
(SP) ← (SP)-1,(STACK)←(PC0-7 )
(PC) ← 位址
若P=1,(PC) ← (PC)+1
機械週期: 2或5。2.3 條件回轉:
2.3.1 RC :若進位旗標等於1,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若C=1,(PC)←(STACK), (SP)←(SP)+2
若C=0,(PC)←(PC)+1
機械週期:1或3。2.3.2 RNC:若進位旗標等於0,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若C=0,(PC)←(STACK), (SP)←(SP)+2
若C=1,(PC)←(PC)+1
機械週期:1或3。2.3.3 RZ: 若零旗標等於1,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若Z=1,(PC)←(STACK), (SP)←(SP)+2
若Z=0,(PC)←(PC)+1
機械週期:1或3。2.3.4 RNZ:若零旗標等於0,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若Z=0,(PC)←(STACK), (SP)←(SP)+2
若Z=1,(PC)←(PC)+1
機械週期:1或3。2.4.5 RP: 若帶號旗標等於1,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若S=1,(PC)←(STACK), (SP)←(SP)+2
若S=0,(PC)←(PC)+1
機械週期:1或3。2.4.6 RM: 若帶號旗標等於0,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若S=0,(PC)←(STACK), (SP)←(SP)+2
若S=1,(PC)←(PC)+1
機械週期:1或3。2.4.7 RPE:若同位旗標等於1,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若P=1,(PC)←(STACK), (SP)←(SP)+2
若P=0,(PC)←(PC)+1
機械週期:1或3。2.4.8 RPO:若同位旗標等於1,由儲存箱中取出兩位元組資料,存入程式計數器中。
動作:若P=0,(PC)←(STACK), (SP)←(SP)+2
若P=1,(PC)←(PC)+1
機械週期:1或3
表14。 條件回轉指令
條件跳控 |
條件叫控 |
條件回轉 |
試驗條件 |
JC |
CC |
RC |
進位(C=1) |
JNC |
CNC |
RNC |
無進位(C=0) |
JZ |
CZ |
RZ |
零(Z=1) |
JNZ |
CNZ |
RNZ |
非零(Z=0) |
JP |
CP |
RP |
正數(S=0) |
JM |
CM |
RM |
負數(S=1) |
JPE |
CPE |
RPE |
偶同位數(P=1) |
JPO |
CPO |
RPO |
奇同位數(P=0) |
3. 其他兩個指令:8051沒有這樣的指令。
3.1 PCHL 轉移H和L給程式計數器
動作: (PC8-15) ← (H),(PC0-7) ← (L)
機械週期:13.2 RST 用於中斷的特殊重新開始指令
動作: (RST5,4,3) ← 位址碼
機械週期:3
表15. 8085分控指令目的碼和執行週期
指令 |
目的碼 |
組元 |
時脈週期 |
8085A 機械週期種類 |
|
8080A |
8085A |
||||
CALL LABLE |
CD ppqq |
3 |
17 |
18 |
2 3 3 5 5 |
CC LABLE |
DC ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CM LABLE |
FC ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CNC LABLE |
D4 ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CNZ LABLE |
C4 ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CP LABLE |
F4 ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CPE LABLE |
EC ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CPO LABLE |
E4 ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
CZ LABLE |
CC ppqq |
3 |
11/17 |
9/18 |
2 3,2 3 3 5 5 |
JC LABLE |
DA ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JM LABLE |
FA ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JMP LABLE |
C3 ppqq |
3 |
10 |
10 |
1 3 3 |
JNC LABLE |
D2 ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JNZ LABLE |
C2 ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JP LABLE |
F2 ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JPE LABLE |
EA ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JPO LABLE |
E2 ppqq |
3 |
10 |
7/10 |
1 3,1 3 3 |
JZ LABLE |
CA ppqq |
3 |
10 |
7/10 |
1 3 3 3 |
PCHL |
E9 |
1 |
5 |
6 |
2 |
RC |
D8 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RET |
C9 |
1 |
10 |
10 |
1 3 3 |
RM |
F8 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RNC |
D0 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RNZ |
C0 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RP |
F0 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RPE |
E8 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RPO |
E0 |
1 |
5/11 |
6/12 |
2,2 3 3 |
RST N |
11XXX111 |
1 |
11 |
12 |
2 3 3 |
RZ |
C8 |
1 |
5/11 |
6/12 |
2,2 3 3 |
(5). 儲存箱,輸入/輸出和機械控制指令:
其中8051沒有的指令:” XTHL “,” SPHL “,” HLT”.
- PUSH 將兩組元資料推入儲存箱中
- POP 從暫存箱中取出兩組元資料
- XTHL 以暫存器對H和L與儲存箱頂兩組元交換
XTHL ;動作: (STACK) ←→ (HL) ; 機械週期:5。- SPHL 將H和L的內容轉移給儲存箱指標暫存器SP
SPHL ;動作: (SPHL) ←→ (HL) ; 機械週期:1。- IN 起動輸入操作,將8位元的資料由特定的輸入/輸出埠載入累加器
IN 出入埠 ;動作: 位址通徑8-15 ← 出入埠
A ←出入埠的資料 ; 機械週期:3
8051是採用MOV指令將輸入/輸出埠或是緩衝器中的資料取出,如:”MOV A,P1”,”MOV A,SBUF”…等等。- OUT 起動輸出操作,將累加器中8位元的資料輸出到特定的輸入/輸出埠。
OUT 出入埠 ;動作:出入埠←位址通徑8-15
出入埠的資料←A ; 機械週期:3
8051是採用MOV指令將資料輸出到輸入/輸出埠或是緩衝器中,如:”MOV P1,A”,”MOV SBUF,A”…等等。- EI 使中斷系統致能,機械週期:1。
- DI 使中斷系統無能,機械週期:1。
- HLT 暫停,處理機處於呆候狀況,機械週期:1。在使用HLT
指令前要使中斷系統致能,如果執行HLT指令時,中斷系統無能,唯一能使處理機重新起動的是應用重置訊號。一般的8051沒有此指令動作,但是如果選擇使用CHMOS版本的8051,其功率下降模式指令-“ORL
PCON,#20H”,可以達到相同的效果。- NOP 無動作
表16. 8085儲存箱,輸入/輸出和機械控制指令目的碼和執行週期
指令 |
目的碼 |
組元 |
時脈週期 |
8085A 機械週期種類 |
|
8080A |
8085A |
||||
DI |
F3 |
1 |
4 |
4 |
1 |
EI |
FB |
1 |
4 |
4 |
1 |
HLT |
76 |
1 |
4 |
4 |
1 |
IN PORT |
DB YY |
2 |
10 |
10 |
1 3 4 |
NOP |
00 |
1 |
4 |
4 |
1 |
OUT PORT |
D3 YY |
2 |
10 |
10 |
1 3 6 |
POP RP |
11XX0001 |
1 |
10 |
10 |
1 3 3 |
PUSH RP |
11XX0101 |
1 |
11 |
12 |
2 5 5 |
SPHL |
F9 |
1 |
5 |
6 |
2 |
XTHL |
E3 |
1 |
18 |
16 |
1 3 3 5 5 |
(6). 中斷指令
RIM :此指令將8位元的資料載入累加器,表示串列輸入資料與中斷情形。
此指令將下列資料載入累加器中:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SID |
17 |
16 |
15 |
IE |
7.5 |
6.5 |
5.5 |
位元0~2:硬體中斷罩除,位元內容等於1時罩除。
位元3:中斷使能旗標,位元內容等於1時使能。
位元4~6:硬體等候中斷,位元內容等於1時等候中。
位元7:串列輸入資料位元,位元內容等於1時則有。
機械週期:1。SIM :由累加器的內容來執行以下的功能:設置應體中斷RST5.5,
RST6.5和RST7.5的中斷罩除位元,重置RST7.5的邊緣感測輸入,輸出累加器位元7之值給串列輸出資料保存器。
機械週期:1。
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SOD |
SDE |
XXX |
R7.5 |
MSE |
M7.5 |
M6.5 |
M5.5 |
位元0~2:分別代表RST5.5,RST6.5,RST7.5罩除位元,
若位元內容等於1則罩除,等於0則有效。
位元3:罩除設置使能,若為0,位元0~2被忽略;若為1,罩除位元被設置。
位元4:重置RST7.5:若為1,RST7.5正反器被重置為0。
位元5:沒有使用。
位元6:若為1,位元7輸出給串列輸出資料保存器。
位元7:串列輸出資料:若位元6等於0則被忽略。