8085 指令集2024 年 8 月 29 日 | 阅读 12 分钟 指令和数据格式指令中指定数据的各种技术是: - 8 位或 16 位数据可以直接包含在指令本身中。
- 数据所在的存储器位置、I/O 端口或 I/O 设备的地址可以直接包含在指令本身中。
- 在某些指令中,只指定一个寄存器。指定寄存器的内容是操作数之一。
- 有些指令指定两个寄存器。寄存器的内容是所需数据。
- 在某些指令中,数据是隐含的。这类指令大多数都操作累加器的内容。
由于指定指令数据的方式不同,所有指令的机器码长度不尽相同。它可能是 1 字节、2 字节或 3 字节的指令。
寻址模式每条指令都需要一些数据在其上进行操作。有不同的技术可以指定指令的数据。这些技术称为寻址模式。Intel 8085 使用以下寻址模式: 在这种寻址模式下,操作数(数据)的地址包含在指令本身中。 示例 STA 2400H: 它将累加器的内容存储在存储器位置 2400H。 32, 00, 24: 上述指令的代码形式。 在本指令中,2400H 是要存储数据的存储器地址。它包含在指令本身中。指令的第二和第三个字节指定了存储器位置的地址。这里,可以理解数据源是累加器。 在寄存器寻址模式下,操作数位于通用寄存器之一中。操作码除了要执行的操作外,还指定了寄存器的地址。 示例 MOV A, B: 将 B 寄存器的内容移到 A 寄存器。 78: 指令的代码形式。 在上例中,MOV A, B 是 78H。除了要执行的操作外,操作码还指定了源寄存器和目标寄存器。 操作码 78H 可以写成二进制形式 01111000。前两位,即 0 1 是 MOV 操作,接下来的三位 1 1 1 是寄存器 A 的二进制代码,最后三位 000 是寄存器 B 的二进制代码。 在寄存器间接寻址模式下,操作数的地址由寄存器对指定。 示例 - LXI H, 2500 H - 用 2500H 加载 H-L 对。
- MOV A, M - 将 H-L 对中存储器位置(即 2500 H)的内容移到累加器。
- HLT - 停止。
在上面的程序中,MOV A, M 指令是寄存器间接寻址的一个例子。对于此指令,操作数位于存储器中。存储器的地址没有直接包含在指令中。存储器的地址驻留在 H-L 对中,并且它已经由程序中的早期指令指定,即 LXI H, 2500 H。 在这种寻址模式下,操作数包含在指令本身中。 示例 LXI H, 2500 是立即寻址的一个例子。2500 是 16 位数据,它包含在指令本身中。它将被加载到 H-L 对中。 有些指令操作累加器的内容。这类指令不需要操作数的地址。 示例 CMA, RAL, RAR 等。
状态标志有一组五个触发器,它们指示算术和逻辑指令执行后产生的状态(条件)。它们是: - 进位标志 (CS)
- 奇偶校验标志 (P)
- 辅助进位标志 (AC)
- 零标志 (Z)
- 符号标志 (S)
符号和缩写在解释 Intel 8085 指令时使用的符号和缩写如下: 符号/缩写 | 含义 |
---|
Addr | 存储器位置的 16 位地址。 | 数据 | 8 位数据 | data 16 | 16 位数据 | r, r1, r2 | 寄存器 A、B、C、D、E、H 或 L 中的一个 | A, B, C, D, H, L | 8 位寄存器 | A | 累加器 | H-L | 寄存器对 H-L | B-C | 寄存器对 B-C | D-E | 寄存器对 D-E | PSW | 程序状态字 | M | 地址在 H-L 对中的存储器 | H | 出现在数字组末尾,表示十六进制,例如 2500H | Rp | 寄存器对之一。 | Rh | 寄存器对的高位寄存器 | Rl | 寄存器对的低位寄存器 | PC | 16 位程序计数器,PCH 是 PC 寄存器的高 8 位,PCL 是低 8 位。 | CS | 进位状态 | [] | 括号中标识的寄存器的内容 | [ [] ] | 括号中标识的寄存器对所包含地址的存储器位置的内容 | ^ | AND 操作 | ∨ | OR 运算 | ⊕ 或 ∀ | 异或 | ← | 数据按箭头方向移动 | ⇔ | 交换内容 |
Intel 8085 指令计算机的指令是给计算机执行指定操作的命令。在微处理器中,指令集是微处理器设计用于执行的指令的集合。 程序员使用这些指令以汇编语言编写程序。这些指令已分为以下几类: 数据传输组用于将数据从一个寄存器传输到另一个寄存器,从存储器到寄存器或从寄存器到存储器的指令属于此组。 指令集 | 说明 | 状态 | 标志 | 寻址 | 机器周期 | 示例 |
---|
MOV r1, r2 [r1] ← [r2] | 将一个寄存器的内容移动到另一个寄存器 | 4 | 无 | 寄存器 | 1 | MOV A, B | MOV r, M [r]←[[H-L]] | 将存储器的内容移动到寄存器 | 7 | 无 | 寄存器间接 | 2 | MOV B, M | MOV M, r [[H-L]]←[r] | 将寄存器的内容移动到存储器 | 7 | 无 | 寄存器间接 | 2 | MOV M, C | MVI r, data [r] ←data | 将立即数据移动到寄存器 | 7 | 无 | 立即寄存器 | 3 | MVI M, 08 | LXI rp, data 16 [rp] ←data 16 位,[rh] ← 8 位 MSB,[rl] ← 8 位 LSB 数据 | 立即加载寄存器对 | 10 | 无 | Immediate | 3 | LXI H, 2500H | LDA addr [A] ←[addr] | 直接加载累加器 | 13 | 无 | 直接 | 4 | LDA 2400 H | STA Addr [addr] ←[A] | 直接存储累加器 | 13 | 无 | 直接 | 4 | STA 2000H | LHLD addr [L] ←[addr], [H] ← [addr + 1 ] | 直接加载 H-L 对 | 16 | 无 | 直接 | 5 | LHLD 2500H | SHLD addr [addr] ←[L], [addr +1] ← [H] | 直接存储 H-L 对 | 16 | 无 | 直接 | 5 | SHLD 2500 H | LDAX rp [A] ←[[rp]] | 间接加载累加器 | 7 | 无 | 寄存器间接 | 2 | LDAX B | STAX rp [[rp]] ←[A] | 间接存储累加器 | 7 | 无 | 寄存器间接 | 2 | STAX D | XCHG [H-L] ↔[D-E] | 将 H-L 对与 D-E 对的内容交换 | 4 | 无 | 寄存器 | 1 | |
算术组此组的指令执行算术运算,如加、减、增量或减量寄存器或存储器的内容。 指令集 | 说明 | 状态 | 标志 | 寻址 | 机器周期 | 示例 |
---|
ADD r [A] ←[A]+[r] | 将寄存器加到累加器 | 4 | 全部 | 寄存器 | 1 | ADD K | ADD M [A] ← [A] + [[H-L]] | 将存储器加到累加器 | 7 | 全部 | 寄存器间接 | 2 | ADD K | ACC r [A] ← [A] + [r] + [CS] | 将带进位的寄存器加到累加器 | 4 | 全部 | 寄存器 | 1 | ACC K | ADC M [A] ← [A] + [[H-L]] [CS] | 将带进位的存储器加到累加器 | 7 | 全部 | 寄存器间接 | 2 | ADC K | ADI data [A] ← [A] + data | 将立即数据加到累加器 | 7 | 全部 | Immediate | 2 | ADI 55K | ACI data [A] ← [A] + data + [CS] | 带进位立即数据加到累加器 | 7 | 全部 | Immediate | 2 | ACI 55K | DAD rp [H-L] ←[H-L] + [rp] | 将寄存器对加到 H-L 对 | 10 | CS | 寄存器 | 3 | DAD K | SUB r [A] ←[A]-[r] | 从累加器减去寄存器 | 4 | 全部 | 寄存器 | 1 | SUB K | SUB M [A] ← [A] - [[H-L]] | 从累加器减去存储器 | 7 | ALL | 寄存器间接 | 2 | SUB K | SBB r [A] ←[A]-[H-L]] - [CS] | 带借位的从累加器减去存储器 | 7 | 全部 | 寄存器间接 | 2 | SBB K | SUI data [A] ←[A]-data | 从累加器减去立即数据 | 7 | 全部 | Immediate | 2 | SUI 55K | SBI data [A] ←[A]-data-[CS] | 带借位的从累加器减去立即数据 | 7 | 全部 | Immediate | 2 | XCHG | INR r [r] ←[r]+1 | 增加寄存器内容 | 4 | 除进位标志外所有 | 寄存器 | 1 | INR K | INR M [[H-L]] ←[[H-L]]+1 | 增加存储器内容 | 10 | 除进位标志外所有 | 寄存器间接 | 3 | INR K | DCR r [r] ←[r] -1 | 减少寄存器内容 | 4 | 除进位标志外所有 | 寄存器 | 1 | DCR K | DCR M [[H-L]] ← [[H-L]]-1 | 减少存储器内容 | 10 | 除进位标志外所有 | 寄存器间接 | 3 | DCR K | INX rp [rp] ←[rp]+1 | 增加存储器内容 | 6 | 无 | 寄存器 | 1 | INX K | DCX rp [rp] ←[rp]-1 | 减少寄存器对 | 6 | 无 | 寄存器 | 1 | DCX K | DAA | 十进制调整累加器 | 4 | | | 1 | DAA |
逻辑组此组的指令执行逻辑运算,如 AND、OR、比较、旋转等。 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
ANA r [A] ←[A]∧[r] | 累加器与寄存器进行 AND | 4 | 全部 | 寄存器 | 1 | ANA M [A] ←[A]∧[[H-]] | 累加器与存储器进行 AND | 4 | 全部 | 寄存器间接 | 2 | ANI data [A] ← [A] ∧ [data] | 累加器与立即数据进行 AND | 7 | 全部 | Immediate | 2 | ORA r [A] ←[A]∨[r] | 累加器与寄存器进行 OR | 4 | 全部 | 寄存器 | 1 | ORA M [A] ←[A]∨[[H-L]] | 累加器与存储器进行 OR | 7 | 全部 | 寄存器间接 | 2 | ORI data [A] ← [A] ∨ [data] | 累加器与立即数据进行 OR | 7 | 全部 | Immediate | 2 | XRA r [A] ← [A]∀[r] | 累加器与寄存器进行 XOR | 4 | 全部 | 寄存器 | 1 | XRA M [A] ← [A] ∀ [[H-L]] | 累加器与存储器进行 XOR | 7 | 全部 | 寄存器间接 | 2 | XRI data [A] ←[A] ∀ [data] | 累加器与立即数据进行 XOR | 7 | 全部 | Immediate | 2 | CMA [A] ←[A] | 对累加器进行取反 | 4 | 无 | 隐含 | 1 | CMC [CS] ←[CS] | 对进位状态进行取反 | 4 | CS | | 1 | STC [CS] ← 1 | 设置进位状态 | 4 | CS | | 1 | CMP r [A]-[r] | 将寄存器与累加器进行比较 | 4 | 全部 | 寄存器 | 1 | CMP M [A] - [[H-L]] | 将存储器与累加器进行比较 | 7 | 全部 | 寄存器间接 | 2 | CPI data [A] - data | 将立即数据与累加器进行比较 | 7 | 全部 | Immediate | 2 | RLC [An+1] ←[An], [A0] ←[A7], [CS] ←[A7] | 累加器左移 | 4 | Cs | 隐含 | 1 | RRC [A7] ←[A0], [CS] ←[A0], [An] ←[An+1] | 累加器右移 | | CS | 隐含 | 1 | RAL [An+1] ←[An], [CS] ←[A7], [A0] ←[CS] | 带进位累加器左移 | | CS | 隐含 | 1 | RAR [An] ←[An+1], [CS] ←[A0], [A7] ←[CS] | 带进位累加器右移 | | CS | 隐含 | 1 |
分支控制组此组包含有条件和无条件跳转、子程序调用和返回以及重启指令。 无条件跳转 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
JMP addr(label) [PC] ← 标签 | 无条件跳转:跳转到由地址指定的指令 | 10 | 无 | Immediate | 3 |
条件跳转 指令集 | 说明 | 状态 | 机器周期 |
---|
Jump addr (label) [PC] ← 标签 | 条件跳转:如果满足指定条件,则跳转到由地址指定的指令 | 10,如果为真,并且 7,如果为假 | 3,如果为真,并且 2,如果为假 |
指令集 | 说明 | 地位 | 状态 | 标志 | 应对 | 机器周期 |
---|
JZ addr (label) [PC] ← 地址(标签) | 跳转,如果结果为零 | 跳转,如果 Z=1 | 7/10 | 无 | Immediate | 2/3 | JNZ addr (label) [PC] ← 地址(标签) | 跳转,如果结果不为零 | 跳转,如果 Z=0 | 7/10 | 无 | Immediate | 2/3 | JC addr (label) [PC] ← 地址(标签) | 如果存在进位则跳转 | 跳转,如果 CS =1 | 7/10 | 无 | Immediate | 2/3 | JNC addr (label) [PC] ← 地址(标签) | 如果不存在进位则跳转 | 跳转,如果 CS =0 | 7/10 | 无 | Immediate | 2/3 | JP addr (label) [PC] ← 地址(标签) | 如果结果为正则跳转 | 跳转,如果 S=0 | 7/10 | 无 | Immediate | 2/3 | JM addr (label) [PC] ← 地址(标签) | 如果结果为负则跳转 | 跳转,如果 S=1 | 7/10 | 无 | Immediate | 2/3 | JPE addr (label) [PC] ← 地址(标签) | 如果奇偶校验为偶数则跳转 | 奇偶校验状态 P =1 | 7/10 | 无 | Immediate | 2/3 | JPO addr (label) [PC] ← 地址(标签) | 如果奇偶校验为奇数则跳转 | 奇偶校验状态 P =0 | 7/10 | 无 | Immediate | 2/3 |
无条件 CALL 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
CALL addr (label) [SP]-1] ← [PCH] ,[[SP-2] ← [PCL], [SP] ← [SP]-2, [PC] ← addr(label) | 无条件 CALL:调用由地址标识的子程序 | 18 | 无 | 立即/寄存器 | 5 |
条件 CALL 指令集 | 说明 | 状态 | 机器周期 |
---|
CALL addr (label) [SP]-1] ← [PCH] , [[SP-2] ← [PCL], [PC] ← addr (label), [SP] ← [SP]-2 | 无条件 CALL:如果满足指定条件,则调用由地址标识的子程序 | 18,如果为真,并且 9,如果为假 | 5,如果为真,并且 2,如果为假 |
指令集 | 说明 | 地位 | 状态 | 标志 | 应对 | 机器周期 |
---|
CC addr(label) | 如果进位状态 CS=1,则调用子程序 | CS =1 | 9/18 | 无 | 立即/寄存器 | 2/5 | CNC addr (label) | 如果进位状态 CS=0,则调用子程序 | CS =0 | 9/18 | 无 | 立即/寄存器 | 2/5 | CZ addr (label) | 如果结果为零,则调用子程序 | 零状态 Z=1 | 9/18 | 无 | 立即/寄存器 | 2/5 | CNZ addr (label) | 如果结果不为零,则调用子程序 | 零状态 Z=0 | 9/18 | 无 | 立即/寄存器 | 2/5 | CP addr (label) | 如果结果为正,则调用子程序 | 符号状态 S=0 | 9/18 | 无 | 立即/寄存器 | 2/5 | CM addr (label) | 如果结果为负,则调用子程序 | 符号状态 S= 1 | 9/18 | 无 | 立即/寄存器 | 2/5 | CPE addr(label) | 如果奇偶校验为偶数,则调用子程序 | 奇偶校验状态 P=1 | 9/18 | 无 | 立即/寄存器 | 2/5 | CPO addr(label) | 如果奇偶校验为奇数,则调用子程序 | 奇偶校验状态 P= 0 | 9/18 | 无 | 立即/寄存器 | 2/5 |
无条件返回 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
RET [PCL] ← [[SP]], [PCH] ← [[SP] + 1], [SP] ← [SP] + 2 | 无条件 RET:从子程序返回 | 10 | 无 | 间接 | 3 |
条件返回 指令集 | 说明 | 状态 | 机器周期 |
---|
RET [PCL] ← [[SP]], [PCH] ← [[SP] + 1], [SP] ← [SP] + 2 | 条件 RET:从子程序返回 | 12,如果为真,6,如果为假 | 3,如果为真,1,如果为假 |
指令集 | 说明 | 地位 | 状态 | 标志 | 应对 | 机器周期 |
---|
RC | 如果进位状态为零,则从子程序返回。 | CS =1 | 6/12 | 无 | 寄存器间接 | 1/3 | RNC | 如果进位状态不为零,则从子程序返回。 | CS = 0 | 6/12 | 无 | 寄存器间接 | 1/3 | RZ | 如果结果为零,则从子程序返回。 | 零状态 Z=1 | 6/12 | 无 | 寄存器间接 | 1/3 | RNZ | 如果结果不为零,则从子程序返回。 | 零状态 Z= 0 | 6/12 | 无 | 寄存器间接 | 1/3 | RP | 如果结果不为正,则从子程序返回。 | 符号状态 S= 0 | 6/12 | 无 | 寄存器间接 | 1/3 | RM | 如果结果不为负,则从子程序返回。 | 符号状态 S= 0 | 6/12 | 无 | 寄存器间接 | 1/3 | RPE | 如果奇偶校验为偶数,则从子程序返回。 | 奇偶校验状态 P= 1 | 6/12 | 无 | 寄存器间接 | 1/3 | RPO | 如果奇偶校验为奇数,则从子程序返回。 | 奇偶校验状态 P= 1 | 6/12 | 无 | 寄存器间接 | 1/3 |
重启 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
RST [[SP]-1] ← [PCH], [[SP]-2] ← [PCL], [SP] ← [SP] - 2, [PC] ← 8 乘以 n | Restart 是一个单字节 CALL 指令。 | 12 | 无 | 寄存器间接 | 3 |
重启指令和位置如下: 指令 | 操作码 | 重启位置 |
---|
RST 0 | C7 | 0000 | RST 1 | CF | 0008 | RST 2 | D7 | 0010 | RST 3 | DF | 0018 | RST 4 | E7 | 0020 | RST 5 | EF | 0028 | RST 6 | F7 | 0030 | RST 7 | FF | 0038 |
PCHL指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
PCHL [PC] ← [H-L], [PCH] ←[H], [PCL] ←[L] | 跳转到 H-L 对指定的地址 | 6 | 无 | 寄存器 | 1 |
堆栈、I/O 和机器控制组此组包含输入/输出端口、堆栈和机器控制指令。 指令集 | 说明 | 状态 | 标志 | 应对 | 机器周期 |
---|
IN port - address [A] ← [Port] | 从 I/O 端口输入到累加器 | 10 | 无 | 直接 | 3 | OUT port-address [Port] ← [A] | 从累加器输出到 I/O 端口 | 10 | 无 | 直接 | 3 | PUSH rp [[SP] - 1] ← [rh], [[SP] - 2] ← [rh], [SP] ← [SP] - 2 | 将寄存器对的内容推送到堆栈 | 12 | 无 | 寄存器(源)/寄存器间接(目标) | 3 | PUSH PSW [SP]-1] ← [A], [[SP] -2] ← PSW, [SP] ← [SP] - 2 | 推送处理器字 | 12 | 无 | 寄存器(源)/寄存器间接(目标) | 3 | POP rp [rl] ← [ [ SP ] ], [rh] ← [[SP]+1], [SP] ← [SP] + 2 | 从堆栈弹出已保存的寄存器对的内容 | 10 | 无 | 寄存器(源)/寄存器间接(目标) | 3 | HLT | 停止 | 5 | 无 | | 1 | XTHL [L] ↔ [[SP]], [H] ↔ [[SP] + 1]
| 交换堆栈顶部与 H-L | 16 | 无 | 寄存器间接 | 5 | SPHL [H-L] → [SP] | 将 H-L 对的内容移动到堆栈指针 | 6 | 无 | 寄存器 | 1 | EI | 启用中断 | 4 | 无 | | 1 | SIM | 设置中断掩码 | 4 | 无 | | 1 | RIM | 读取中断掩码 | 4 | 无 | | 1 | NOP | 无操作 | 4 | 无 | | 1 |
|