8085微处理器减法操作指令
在两个数的减法运算中,8085要求累加器(Accumulator)存储其中一个操作数,然后从该操作数中减去由以下方式指定的另一个操作数。
—8位寄存器的内容;
—HL寄存器对指向的内存单元的内容;
—8位立即数。
在8085指令集中,**SUB** 是一个助记符,代表“从累加器中减去R的内容”。 这里R代表以下任意一个寄存器,或者HL寄存器对指向的内存单元M。
R = A, B, C, D, E, H, L, 或 M
助记符,操作数 | 操作码(十六进制) | 字节数 |
---|---|---|
SUB A | 97 | 1 |
SUB B | 90 | 1 |
SUB C | 91 | 1 |
SUB D | 92 | 1 |
SUB E | 93 | 1 |
SUB H | 94 | 1 |
SUB L | 95 | 1 |
SUB M | 96 | 1 |
在这条指令中,寄存器R的内容将从累加器中减去,结果差将存储到累加器中,覆盖累加器之前的内容。由于R可以是8个值中的任意一个,因此此类指令有8个操作码,如上表所示。它只占用内存中的1个字节。
让我们以**SUB E**作为此类指令的示例。由于它是一条1字节指令,因此它将占用内存中的单个字节空间。该指令执行的结果如下面的示例所示。
示例1
假设累加器和E寄存器初始值分别为ABH和CDH。那么,执行**SUB E**指令后,寄存器的内容将变为:
之前 | 之后 | |
---|---|---|
(A) | ABH | DEH |
(E) | CDH | CDH |
(F) | 任意值 | Cy=1,AC=0,S=1,P=1,Z=0 |
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2004 | 93 | SUB E | 累加器 = 累加器 + E的二进制补码 |
这里Cy=1表示结果为负。实际上A – E = A + E的二进制补码。以下是计算过程:
(A) BH (1010 1011) ---------------> 1010 1011
二进制补码
(E) CDH (1100 1101) ---------------> 0011 0011
---------
1101 1110 (DEH)
以下是**SUB E**指令的时序图:
**总结:**因此,这条指令**SUB E**需要1个字节、1个机器周期(操作码获取)和4个T状态才能执行,如时序图所示。
示例2
假设累加器和E寄存器初始值分别为CDH和ABH。那么,执行**SUB E**指令后,寄存器的内容将变为:
之前 | 之后 | |
---|---|---|
(A) | CDH | 22H |
(E) | ABH | ABH |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2004 | 93 | SUB E | 累加器 = 累加器 + E的二进制补码 |
这里Cy=0表示结果为正。实际上A – E = A + E的二进制补码。以下是计算过程:
(A) CDH (1100 1101) ---------------> 1100 1101
二进制补码
(E) ABH (1010 1011) ---------------> 0101 0101
---------
0010 0010 (22H)
以下是**SUB E**指令的时序图:
**总结:**因此,这条指令**SUB E**需要1个字节、1个机器周期(操作码获取)和4个T状态才能执行,如时序图所示。
在8085指令集中,**SUI** 是一个助记符,代表“从累加器中减去立即数”,这里**d8**代表任意8位或1字节数据。这条指令用于从累加器中减去8位立即数。减法的结果将存储到累加器中,覆盖其之前的内容。由于它是一个算术指令,因此标志位将根据结果进行影响。它是一条2字节指令,在内存中占用2个字节。
助记符,操作数 | 操作码(十六进制) | 字节数 |
---|---|---|
SUI 数据 | D6 | 2 |
当我们发出**SUI d8**指令时,实际上会将d8的二进制补码与累加器的内容相加。结果将存储回累加器。
示例1
SUI ABH 是此类指令的一个示例。这意味着从累加器的内容中减去ABH的二进制补码。假设累加器的初始内容为CDH。以下是跟踪表:
之前 | 之后 | |
---|---|---|
(A) | CDH | 22H |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2002 | D6 | SUI ABH | 累加器 = 累加器 + ABH的二进制补码 |
2003 | AB | 操作数 ABH |
这里Cy=0表示结果为正。实际上A – ABH = A + ABH的二进制补码。以下是计算过程:
(A) CDH (1100 1101) ---------------> 1100 1101
二进制补码
(d8) ABH (1010 1011) ---------------> 0101 0101
---------------
0010 0010 (22H)
以下是**SUI ABH**指令的时序图:
**总结:**因此,这条指令**SUI d8**需要2个字节、2个机器周期(操作码获取、内存读取)和7个T状态才能执行,如时序图所示。
示例1
SUI ABH 是此类指令的一个示例。这意味着从累加器的内容中减去ABH的二进制补码。假设累加器的初始内容为CDH。以下是跟踪表:
之前 | 之后 | |
---|---|---|
(A) | CDH | 22H |
(F) | 任意值 | Cy=0,AC=1,S=0,P=1,Z=0 |
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2002 | D6 | SUI ABH | 累加器 = 累加器 + ABH的二进制补码 |
2003 | AB | 操作数 ABH |
这里Cy=0表示结果为正。实际上A – ABH = A + ABH的二进制补码。以下是计算过程:
(A) CDH (1100 1101) ---------------> 1100 1101
二进制补码
(d8) ABH (1010 1011) ---------------> 0101 0101
--------------
0010 0010 (22H)
以下是**SUI ABH**指令的时序图:
**总结:**因此,这条指令**SUI d8**需要2个字节、2个机器周期(操作码获取、内存读取)和7个T状态才能执行,如时序图所示。
示例2
SUI CDH 是此类指令的一个示例。这意味着从累加器的内容中减去CDH的二进制补码。假设累加器的初始内容为ABH。以下是跟踪表:
之前 | 之后 | |
---|---|---|
(A) | ABH | DEH |
(F) | 任意值 | Cy=1,AC=0,S=1,P=1,Z=0 |
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2002 | D6 | SUI CDH | 累加器 = 累加器 + CDH的二进制补码 |
2003 | CD | 操作数 CDH |
这里Cy=1表示结果为负。实际上A – CDH = A + CDH的二进制补码。以下是计算过程:
ABH (1010 1011) ---------------> 1010 1011
二进制补码
(d8) CDH (1100 1101) ---------------> 0011 0011
--------------
1101 1110 (DEH)
以下是**SUI CDH**指令的时序图:
**总结:**因此,这条指令**SUI d8**需要2个字节、2个机器周期(操作码获取、内存读取)和7个T状态才能执行,如时序图所示。