Intel 8080/85 指令集

“ISA小抄”系列是新开的坑,内容为各种CPU的简要介绍,可能包括芯片的参数,架构,寄存器安排,指令集介绍这些内容
之所以写这个,顾名思义,就是想让自己在有机会使用这些老古董时,可以快速地学会关于这个CPU的云云,并开始使用她

这次我选择了第一台真正意义上的“个人电脑”——Altair 8800所用的CPU——Intel 8080,作为本系列的开篇(其实之前的PDP-8简介也能算是一个)
因为想要阅读4k basic的反汇编源码,而8080的指令集又与8086很不同,就写了这篇东西来给自己看

(题图来自wikimedia commons,拍摄者是Ed Uthman)
(下次再看到我这么搞排版,请弄死我)

基本信息:

                Intel 8080              Intel 8085
发布日期:      |1974-04                |1976
最大时钟频率:  |2MHz(8080A@3.125MHz) |3,5,6 MHz
工艺水平:      |6μm                    |3μm
指令数:        |78                     |80
通用寄存器宽度:|8位
地址总线宽度:  |16位
数据总线宽度:  |8位

寄存器安排:

简称|全称               |特殊功能       |位数
----|-------------------|---------------|------------------
A   |Accumulator        |累加器         |8位
F   |Flags              |标记位寄存器   |8位
B,C |                   |               |16位(可拆分)
D,E |                   |               |16位(可拆分)
H,L |indirect address   |间接地址寄存器 |16位(可拆分)
PC  |Program Counter    |    程序计数器 |16位
SP  |Stack Pointer      |栈指针寄存器   |16位

标记位:
Flags:|S|Z|I|AC|-|P|-|CY|

简称|全称       |为1时含义
----|-----------|-------------------------------------------
S   |Sign       |结果为负
Z   |Zero       |结果为0
I   |Interrupt  |允许硬件中断
AC  |Aux Carry  |低4位发生进位或借位(亦称“Half-carry”)
P   |Parity     |结果中1为偶数个
CY  |Carry      |发生了进位或借位

指令集:

指令集部分内容涉及一些简写:

简写      |含义    
----------|-----------------------------------------------
addr      |16位地址(address)
data      |8位数据
data16    |16位数据
datah     |16位数据的高8位(data high)
datal     |16位数据的低8位(data low)
port      |8位端口编号
大写字母  |具体的某个寄存器或某个标记位
r,r1,r2   |某个寄存器(register)
rp        |某个寄存器对(仅需写出高位寄存器的代号)(reg pair)
rh        |寄存器对里的高位寄存器(如B,C中的B)(reg high)
rl        |寄存器对里的低位寄存器(如B,C中的C)(reg low)
(#)       |#内的数据,或一个常数    
[#]       |数据“#”指向的内存空间
n         |重启编号0~7
#d        |十进制数#
CCC       |某个条件
X         |未定义

寄存器,寄存器对,地址,常数用半角括号框起来以增加可读性
“长度”以字节为单位
“周期”为执行该指令所需的机器周期
“状态数”为执行该指令时CPU内部需要进行的操作次数,斜杠标明同一个指令在不同情况下需要的不同的状态数
“影响”指所影响的标记位

8080的指令有三种大小:单字节指令,双字节指令和三字节指令
每一种指令的第一个字节都是编码操作符的,其余字节用于编码数据或地址

8080可以用以下方式从内存中获取数据:
直接寻址
寄存器直接寻址
寄存器间接寻址
直接数

8089支持以下跳转方式:
直接跳转 使用编码在一条指令中的地址作为目的地
寄存器间接跳转 使用一个寄存器对内的16位地址作为目的地

8080指令索引:

一类:数据传送指令

MOV
MVI
LXI
LDA
STA
LHLD
SHLD
LDAX
STAX
XCHG

二类:数学运算指令

ADD
ADI
ADC
ACI

SUB
SUI
SBB
SBI

INR
DCR
INX
DCX
DAD

DAA

三类:逻辑运算指令

ANA
ANI
XRA
XRI
ORA
ORI

CMP
CPI

RLC
RRC
RAL
RAR

CMA
CMC
STC

四类:分支指令

JMP
Jcondition, If
CALL
Ccondition, If
RET
Rcondition, If
RST
PCHL

五类:栈/IO/机器控制指令

PUSH
PUSH PSW
POP
POP PSW
XTHL
SPHL

IN
OUT

EL
DI

HLT
NOP

RIM(仅限8085)
SIM(仅限8085)


一类:数据传送指令

    MOV    r1, r2
        长度:  1
        效果:  (r1)<-(r2)
        周期:  1
        状态数:4(8085),5(8080)
    MOV    r, M
        长度:  1
        效果:  (r)<-[(H,L)]
        周期:  2
        状态数:7
    MOV    M, r
        长度:  1
        效果:  [(H,L)]<-(r)
        周期:  2
        状态数:7
    MVI    r, data
        长度:  2
        效果:  (r)<-(data)
        周期:  2
        状态数:7
    MVI    M, data
        长度:  2
        效果:  [(H,L)]<-(data)
        周期:  3
        状态数:10
    LXI    rp, data16
        长度:  3
        效果:  (rh)<-(datah)
                (rl)<-(datal)
        周期:  3
        状态数:10
    LDA    addr
        长度:  3
        效果:  (A)<-[addr]
        周期:  3
        状态数:13
    STA addr
        长度:  3
        效果:  [addr]<-(A)
        周期:  4
        状态数:13
    LHLD addr
        长度:  3
        效果:  (L)<-[addr]
                (H)<-[addr+1]
        周期:  5
        状态数:16
    SHLD addr
        长度:  3
        效果:  [addr]<-(L)
                [addr+1]<-(H)
        周期:  5
        状态数:16    
    LDAX rp
        长度:  1
        效果:  (A)<-[(rp)]
        周期:  2
        状态数:7    
    STAX rp
        长度:  1
        效果:  [(rp)]<-(A)
        周期:  2
        状态数:7
    XCHG
        长度:  1
        效果:  (H)(D)
                (L)(E)
        周期:  1
        状态数:4

二类:数学运算指令

    ADD r
        长度:  1
        效果:  (A)<-(A)+(r)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    ADD    M
        长度:  1
        效果:  (A)<-(A)+[(H,L)]
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    ADI data
        长度:  2
        效果:  (A)<-(A)+(data)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    ADC r
        长度:  1
        效果:  (A)<-(A)+(r)+(CY)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    ADC M
        长度:  1
        效果    (A)<-(A)+[(H,L)]+(CY)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    ACI data
        长度:  2
        效果:  (A)<-(A)+(data)+(CY)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
        
    SUB r
        长度:  1
        效果:  (A)<-(A)-(r)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    SUB    M
        长度:  1
        效果:  (A)<-(A)-[(H,L)]
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    SUI data
        长度:  2
        效果:  (A)<-(A)-(data)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    SBB r
        长度:  1
        效果:  (A)<-(A)-(r)-(CY)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    SBB M
        长度:  1
        效果    (A)<-(A)-[(H,L)]-(CY)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    SBI data
        长度:  2
        效果:  (A)<-(A)-(data)-(CY)
        周期:  2
        状态数:7
        影响:  Z S P CY AC        
        
    INR    r
        长度:  1
        效果:  (r)<-(r)+1
        周期:  1
        状态数:4(8085),5(8080)
        影响:  Z S P AC    
    INR M
        长度:  1
        效果:  [(H,L)]<-[(H,L)]+1
        周期:  3
        状态数:10
        影响:  Z S P AC
    DCR    r
        长度:  1
        效果:  (r)<-(r)-1
        周期:  1
        状态数:4(8085),5(8080)
        影响:  Z S P AC    
    DCR M
        长度:  1
        效果:  [(H,L)]<-[(H,L)]-1
        周期:  3
        状态数:10
        影响:  Z S P AC
    
    INX rp
        长度:  1
        效果:  (rh,rl)<-(rh,rl)+1
        周期:  1
        状态数:6(8085),5(8080)
        影响:  无
    DCX rp
        长度:  1
        效果:  (rh,rl)<-(rh,rl)-1
        周期:  1
        状态数:6(8085),5(8080)
        影响:  无
    DAD rp
        长度:  1
        效果:  (H,L)<-(H,L)+(rh,rl) 
        周期:  3 
        状态数:10 
        影响:  CY 
        
    DAA 
        长度:  1 
        效果:  对A内数据进行BCD调整 
                如果 低4位>9d 或 AC=1 (A)<-(A)+6d 
                如果 高4位>9d 或 CY=1 (A)<-(A)+96d (向高4位+6d)
        周期:  1
        状态数:4
        影响:  Z S P CY AC

三类:逻辑运算指令

    ANA r
        长度:  1
        效果:  (A)<-(A)AND(r)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    ANA M
        长度:  1
        效果:  (A)<-(A)AND[(H,L)]
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    ANI data
        长度:  2
        效果:  (A)<-(A)AND(data)
        状态数:7
        影响:  Z S P CY AC
        
    XRA    r
        长度:  1
        效果:  (A)<-(A)XOR(r)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    XRA    M
        长度:  1
        效果:  (A)<-(A)XOR[(H,L)]
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    XRI    data
        长度:  2
        效果:  (A)<-(A)XOR(data)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
        
    ORA    r
        长度:  1
        效果:  (A)<-(A)OR(r)
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    ORA    M
        长度:  1
        效果:  (A)<-(A)OR[(H,L)]
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    ORI    data
        长度:  2
        效果:  (A)<-(A)OR(data)
        周期:  2
        状态数:7
        影响:  Z S P CY AC
        
    CMP r
        长度:  1
        效果:  等效于不保存结果的SUB r
                (A)==(R), Z=1
                (A)<(R), CY=1
        周期:  1
        状态数:4
        影响:  Z S P CY AC
    CMP M
        长度:  1
        效果:  等效于不保存结果的SUB M
                (A)==[(H,L)], Z=1
                (A)<[(H,L)], CY=1
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    CPI data
        长度:  2
        效果:  等效于不保存结果的SUI data
                (A)==(data), Z=1
                (A)<(data), CY=1
        周期:  2
        状态数:7
        影响:  Z S P CY AC
    
    RLC
        长度:  1
        效果:  (An+1)<-(An);(A0)<-(A7)
                (CY)<-(A7)
        周期:  1
        状态数:4
        影响:  CY
    RRC
        长度:  1
        效果:  (An)<-(An+1);(A7)<-(A0)
                (CY)<-(A0)
        周期:  1
        状态数:4
        影响:  CY
    RAL
        长度:  1
        效果:  (An+1)<-(An);(CY)<-(A7)
                (A0)<-(CY)
        周期:  1
        状态数:4
        影响:  CY
    RAR
        长度:  1
        效果:  (An)<-(An+1);(CY)<-(A0)
                (A7)<-(CY)
        周期:  1
        状态数:4
        影响:  CY
    
    CMA
        长度:  1
        效果:  (A)<-NOT(A)
        周期:  1
        状态数:4
        影响:  无
    CMC
        长度:  1
        效果:  (CY)<-NOT(CY)
        周期:  1
        状态数:4
        影响:  CY
    STC
        长度:  1
        效果:  (CY)<-1
        周期:  1
        状态数:4

四类:分支指令

支持的条件:

    NZ    -不等于0    (Z=0)
    Z     -等于0        (Z=1)
    NC    -无进位/借位(CY=0)
    C     -有进位/借位(CY=1)
    PO    -1为奇数个    (P=0)
    PE    -1为偶数个    (P=1)
    P     -正数        (S=0)
    M     -负数        (S=1)
        
    JMP    addr
        长度:  3
        效果:  (PC)<-(addr)
        周期:  3
        状态数:10
        
    Jcondition addr If (CCC)
        长度:  3
        效果:  当 (CCC) 成立,(PC)<-(addr)
        周期:  2/3(8085),3(8080)
        状态数:7/10(8085),10(8080)
        
    CALL addr
        长度:  3
        效果:  [(SP)-1]<-(PCh)
                [(SP)-2]<-(PCl)
                (SP)<-(SP)-2
                (PC)<-(addr)
        周期:  5
        状态数:18(8085),17(8080)
    Ccondition addr If (CCC)
        长度:  3
        效果:  当 (CCC) 成立
                [(SP)-1]<-(PCh)
                [(SP)-2]<-(PCl)
                (SP)<-(SP)-2
                (PC)<-(addr)
        周期:  2/5(8085),3/5(8080)
        状态数:9/18(8085),11/17(8080)
        
    RET
        长度:  1
        效果:  (PCl)<-[(SP)]
                (PCh)<-[(SP)+1]
                (SP)<-(SP)+2
        周期:  3
        状态数:10
    Rcondition If (CCC)
        长度:  1
        效果:  当 (CCC) 成立
                (PCl)<-[(SP)]
                (PCh)<-[(SP)+1]
                (SP)<-(SP)+2
        周期:  1/3
        状态数:6/12(8085),5/11(8080)
    
    RST n
        长度:  1
        效果:  [(SP)-1]<-(PCh)
                [(SP)-2]<-(PCl)
                (SP)<-(SP)-2
                (PC)<-8*(NNN)
        周期:  3
        状态数:12(8085),11(8080)
        
    PCHL
        长度:  1
        效果:  (PCh)<-(H)
                (PCl)<-(L)
        周期:  1
        状态数:6(8085),5(8080)

五类:栈/IO/机器控制指令

    PUSH rp
        长度:  1
        效果:  [(SP)-1]<-(rh)
                [(SP)-2]<-(rl)
                (SP)<-(SP)-2
        周期:  3
        状态数:12(8085),11(8080)
    PUSH PSW
        长度:  1
        效果:  [(SP)-1]<-(A)
                [(SP)-2]<-(S),(Z),X,(AC),X,(P),(X),(CY) 
                (每一个符号位占一位)
                (SP)<-(SP)-2
        周期:  3
        状态数:12(8085),11(8080)
    POP rp
        长度:  1
        效果:  (rh)<-[(SP)]
                (rl)<-[(SP)+1]
                (SP)<-(SP)+2
        周期:  3
        状态数:10
    POP PSW
        长度:  1
        效果:    
                (S),(Z),X,(AC),X,(P),(X),(CY)<-[(SP)-2]
                (每一个符号位占一位)
                (A)<-[(SP)-1]
                (SP)<-(SP)+2
        周期:  3
        状态数:10
        影响:  Z,S,P,CY,AC
    XHTL
        长度:  1
        效果:  (L)[(SP)]
                (H)[(SP)+1]
        周期:  5
        状态数:16(8085),18(8080)
    SPHL
        长度:  1
        效果:  (SP)(H,L)
        周期:  1
        状态数:6(8085),5(8080)
    
    IN port
        长度:  2
        效果:  (A)<-(data)
        周期:  3
        状态数:10
    OUT    port
        长度:  2
        效果:  (data)<-(A) 
        周期:  3 
        状态数:10 
    
    EI 
        长度:  1  
        效果:  在下一个指令执行后允许中断 
        周期:  1 
        状态数:4 
    DI 
        长度:  1 
        效果:  立即屏蔽中断 
        周期:  1 
        状态数:4 
    
    HLT 
        长度:  1 
        效果:  停机,在8085上还会发出一个ALE信号 
        周期:  >1(8085),1(8080)
        状态数:5(8085),7(8080)
    NOP
        长度:  1
        效果:  无
        周期:  1
        状态数:4
    
    以下待补
    RIM    (仅限8085)
    SIM    (仅限8085)

2 thoughts on “Intel 8080/85 指令集”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.