8085 指令集

2024 年 8 月 29 日 | 阅读 12 分钟

指令和数据格式

指令中指定数据的各种技术是:

  1. 8 位或 16 位数据可以直接包含在指令本身中。
  2. 数据所在的存储器位置、I/O 端口或 I/O 设备的地址可以直接包含在指令本身中。
  3. 在某些指令中,只指定一个寄存器。指定寄存器的内容是操作数之一。
  4. 有些指令指定两个寄存器。寄存器的内容是所需数据。
  5. 在某些指令中,数据是隐含的。这类指令大多数都操作累加器的内容。

由于指定指令数据的方式不同,所有指令的机器码长度不尽相同。它可能是 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 1616 位数据
r, r1, r2寄存器 A、B、C、D、E、H 或 L 中的一个
A, B, C, D, H, L8 位寄存器
A累加器
H-L寄存器对 H-L
B-C寄存器对 B-C
D-E寄存器对 D-E
PSW程序状态字
M地址在 H-L 对中的存储器
H出现在数字组末尾,表示十六进制,例如 2500H
Rp寄存器对之一。
Rh寄存器对的高位寄存器
Rl寄存器对的低位寄存器
PC16 位程序计数器,PCH 是 PC 寄存器的高 8 位,PCL 是低 8 位。
CS进位状态
[]括号中标识的寄存器的内容
[ [] ]括号中标识的寄存器对所包含地址的存储器位置的内容
^AND 操作
OR 运算
⊕ 或 ∀异或
数据按箭头方向移动
交换内容

Intel 8085 指令

计算机的指令是给计算机执行指定操作的命令。在微处理器中,指令集是微处理器设计用于执行的指令的集合。

程序员使用这些指令以汇编语言编写程序。这些指令已分为以下几类:

数据传输组

用于将数据从一个寄存器传输到另一个寄存器,从存储器到寄存器或从寄存器到存储器的指令属于此组。

指令集说明状态标志寻址机器周期示例
MOV r1, r2
[r1] ← [r2]
将一个寄存器的内容移动到另一个寄存器4寄存器1MOV A, B
MOV r, M
[r]←[[H-L]]
将存储器的内容移动到寄存器7寄存器间接2MOV B, M
MOV M, r
[[H-L]]←[r]
将寄存器的内容移动到存储器7寄存器间接2MOV M, C
MVI r, data
[r] ←data
将立即数据移动到寄存器7立即寄存器3MVI M, 08
LXI rp, data 16
[rp] ←data 16 位,[rh] ← 8 位 MSB,[rl] ← 8 位 LSB 数据
立即加载寄存器对10Immediate3LXI H, 2500H
LDA addr
[A] ←[addr]
直接加载累加器13直接4LDA 2400 H
STA Addr
[addr] ←[A]
直接存储累加器13直接4STA 2000H
LHLD addr
[L] ←[addr], [H] ← [addr + 1 ]
直接加载 H-L 对16直接5LHLD 2500H
SHLD addr
[addr] ←[L], [addr +1] ← [H]
直接存储 H-L 对16直接5SHLD 2500 H
LDAX rp
[A] ←[[rp]]
间接加载累加器7寄存器间接2LDAX B
STAX rp
[[rp]] ←[A]
间接存储累加器7寄存器间接2STAX D
XCHG
[H-L] ↔[D-E]
将 H-L 对与 D-E 对的内容交换4寄存器1

算术组

此组的指令执行算术运算,如加、减、增量或减量寄存器或存储器的内容。

指令集说明状态标志寻址机器周期示例
ADD r
[A] ←[A]+[r]
将寄存器加到累加器4全部寄存器1ADD K
ADD M
[A] ← [A] + [[H-L]]
将存储器加到累加器7全部寄存器间接2ADD K
ACC r
[A] ← [A] + [r] + [CS]
将带进位的寄存器加到累加器4全部寄存器1ACC K
ADC M
[A] ← [A] + [[H-L]] [CS]
将带进位的存储器加到累加器7全部寄存器间接2ADC K
ADI data
[A] ← [A] + data
将立即数据加到累加器7全部Immediate2ADI 55K
ACI data
[A] ← [A] + data + [CS]
带进位立即数据加到累加器7全部Immediate2ACI 55K
DAD rp
[H-L] ←[H-L] + [rp]
将寄存器对加到 H-L 对10CS寄存器3DAD K
SUB r
[A] ←[A]-[r]
从累加器减去寄存器4全部寄存器1SUB K
SUB M
[A] ← [A] - [[H-L]]
从累加器减去存储器7ALL寄存器间接2SUB K
SBB r
[A] ←[A]-[H-L]] - [CS]
带借位的从累加器减去存储器7全部寄存器间接2SBB K
SUI data
[A] ←[A]-data
从累加器减去立即数据7全部Immediate2SUI 55K
SBI data
[A] ←[A]-data-[CS]
带借位的从累加器减去立即数据7全部Immediate2XCHG
INR r
[r] ←[r]+1
增加寄存器内容4除进位标志外所有寄存器1INR K
INR M
[[H-L]] ←[[H-L]]+1
增加存储器内容10除进位标志外所有寄存器间接3INR K
DCR r
[r] ←[r] -1
减少寄存器内容4除进位标志外所有寄存器1DCR K
DCR M
[[H-L]] ← [[H-L]]-1
减少存储器内容10除进位标志外所有寄存器间接3DCR K
INX rp
[rp] ←[rp]+1
增加存储器内容6寄存器1INX K
DCX rp
[rp] ←[rp]-1
减少寄存器对6寄存器1DCX K
DAA十进制调整累加器41DAA

逻辑组

此组的指令执行逻辑运算,如 AND、OR、比较、旋转等。

指令集说明状态标志应对机器周期
ANA r
[A] ←[A]∧[r]
累加器与寄存器进行 AND4全部寄存器1
ANA M
[A] ←[A]∧[[H-]]
累加器与存储器进行 AND4全部寄存器间接2
ANI data
[A] ← [A] ∧ [data]
累加器与立即数据进行 AND7全部Immediate2
ORA r
[A] ←[A]∨[r]
累加器与寄存器进行 OR4全部寄存器1
ORA M
[A] ←[A]∨[[H-L]]
累加器与存储器进行 OR7全部寄存器间接2
ORI data
[A] ← [A] ∨ [data]
累加器与立即数据进行 OR7全部Immediate2
XRA r [A] ← [A]∀[r]累加器与寄存器进行 XOR4全部寄存器1
XRA M [A] ← [A] ∀ [[H-L]]累加器与存储器进行 XOR7全部寄存器间接2
XRI data [A] ←[A] ∀ [data]累加器与立即数据进行 XOR7全部Immediate2
CMA [A] ←[A]对累加器进行取反4隐含1
CMC
[CS] ←[CS]
对进位状态进行取反4CS1
STC
[CS] ← 1
设置进位状态4CS1
CMP r
[A]-[r]
将寄存器与累加器进行比较4全部寄存器1
CMP M
[A] - [[H-L]]
将存储器与累加器进行比较7全部寄存器间接2
CPI data
[A] - data
将立即数据与累加器进行比较7全部Immediate2
RLC
[An+1] ←[An], [A0] ←[A7], [CS] ←[A7]
累加器左移4Cs隐含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] ← 标签
无条件跳转:跳转到由地址指定的指令10Immediate3

条件跳转

指令集说明状态机器周期
Jump addr (label)
[PC] ← 标签
条件跳转:如果满足指定条件,则跳转到由地址指定的指令10,如果为真,并且
7,如果为假
3,如果为真,并且
2,如果为假
指令集说明地位状态标志应对机器周期
JZ addr (label) [PC] ← 地址(标签)跳转,如果结果为零跳转,如果 Z=17/10Immediate2/3
JNZ addr (label)
[PC] ← 地址(标签)
跳转,如果结果不为零跳转,如果 Z=07/10Immediate2/3
JC addr (label)
[PC] ← 地址(标签)
如果存在进位则跳转跳转,如果 CS =17/10Immediate2/3
JNC addr (label)
[PC] ← 地址(标签)
如果不存在进位则跳转跳转,如果 CS =07/10Immediate2/3
JP addr (label)
[PC] ← 地址(标签)
如果结果为正则跳转跳转,如果 S=07/10Immediate2/3
JM addr (label)
[PC] ← 地址(标签)
如果结果为负则跳转跳转,如果 S=17/10Immediate2/3
JPE addr (label)
[PC] ← 地址(标签)
如果奇偶校验为偶数则跳转奇偶校验状态 P =17/10Immediate2/3
JPO addr (label)
[PC] ← 地址(标签)
如果奇偶校验为奇数则跳转奇偶校验状态 P =07/10Immediate2/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 =19/18立即/寄存器2/5
CNC addr (label)如果进位状态 CS=0,则调用子程序CS =09/18立即/寄存器2/5
CZ addr (label)如果结果为零,则调用子程序零状态 Z=19/18立即/寄存器2/5
CNZ addr (label)如果结果不为零,则调用子程序零状态 Z=09/18立即/寄存器2/5
CP addr (label)如果结果为正,则调用子程序符号状态 S=09/18立即/寄存器2/5
CM addr (label)如果结果为负,则调用子程序符号状态 S= 19/18立即/寄存器2/5
CPE addr(label)如果奇偶校验为偶数,则调用子程序奇偶校验状态 P=19/18立即/寄存器2/5
CPO addr(label)如果奇偶校验为奇数,则调用子程序奇偶校验状态 P= 09/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 =16/12寄存器间接1/3
RNC如果进位状态不为零,则从子程序返回。CS = 06/12寄存器间接1/3
RZ如果结果为零,则从子程序返回。零状态 Z=16/12寄存器间接1/3
RNZ如果结果不为零,则从子程序返回。零状态 Z= 06/12寄存器间接1/3
RP如果结果不为正,则从子程序返回。符号状态 S= 06/12寄存器间接1/3
RM如果结果不为负,则从子程序返回。符号状态 S= 06/12寄存器间接1/3
RPE如果奇偶校验为偶数,则从子程序返回。奇偶校验状态 P= 16/12寄存器间接1/3
RPO如果奇偶校验为奇数,则从子程序返回。奇偶校验状态 P= 16/12寄存器间接1/3

重启

指令集说明状态标志应对机器周期
RST
[[SP]-1] ← [PCH], [[SP]-2] ← [PCL],
[SP] ← [SP] - 2,
[PC] ← 8 乘以 n
Restart 是一个单字节 CALL 指令。12寄存器间接3

重启指令和位置如下:

指令操作码重启位置
RST 0C70000
RST 1CF0008
RST 2D70010
RST 3DF0018
RST 4E70020
RST 5EF0028
RST 6F70030
RST 7FF0038

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停止51
XTHL
[L] ↔ [[SP]],
[H] ↔ [[SP] + 1]
交换堆栈顶部与 H-L16寄存器间接5
SPHL
[H-L] → [SP]
将 H-L 对的内容移动到堆栈指针6寄存器1
EI启用中断41
SIM设置中断掩码41
RIM读取中断掩码41
NOP无操作41

下一主题8085 编程