8051程序分支组
在 8051 微控制器中,逻辑组下有 17 条不同的指令。总共有 46 个操作码。这些指令不影响标志位,但 CJNE 影响 CY 标志位。在这些指令中,使用了 11 位地址和 16 位地址。
在下表中,我们将看到助记符、长度、机器周期执行时间、操作码数量等。
助记符 | 字节数 | 执行时间 | 操作码数量 |
---|---|---|---|
ACALL addr11 | 2 | 2 | 8 |
LCALL addr16 | 3 | 2 | 1 |
RET | 1 | 2 | 1 |
RETI | 1 | 2 | 1 |
AJMP addr11 | 2 | 2 | 8 |
LJMP addr16 | 3 | 2 | 1 |
SJMP rel | 2 | 2 | 1 |
JMP @A+DPTR | 1 | 2 | 1 |
JZ rel | 2 | 2 | 1 |
JNZ rel | 2 | 2 | 1 |
CJNE A, a8, rel | 3 | 2 | 1 |
CJNE A, #d8, rel | 3 | 2 | 1 |
CJNE Rn, #d8, rel | 3 | 2 | 8 |
CJNE @Ri, #d8, rel | 3 | 2 | 2 |
DJNE Rn, rel | 2 | 2 | 8 |
DJNZ a8, rel | 3 | 2 | 1 |
NOP | 1 | 1 | 1 |
示例
序号 | 指令和描述 |
---|---|
1 | LJMP LABEL 这是一个 LJMP addr16 的示例。LJMP 代表长跳转。它可以跳转到符号位置标签。地址由汇编器根据标签的值生成。使用此指令,我们可以跳转到程序中的任何位置。 |
2 | ACALL SUBR 这是 ACALLa ddr11 类型的指令。ACALL 是绝对调用。使用此指令,它从符号位置 SUBR 调用子程序。在调用之前,它将程序计数器的值存储在堆栈顶部。 |
3 | SJMP LABEL 此指令类似于 SJMP rel。SJMP 表示短跳转。这里 LABEL 是由汇编器生成的 8 位地址。使用此指令,我们可以停止 8051 中的程序。 |
4 | JZ LABEL 此指令类似于 JZ rel 指令。当 A 寄存器的值为 00h 时,它才会跳转到 LABEL,否则将被忽略。汇编器从指令生成 8 位有符号位移。 |
5 | RET 这是返回指令。当它执行时,程序计数器的下一个地址从堆栈顶部弹出,并且 SP 的值减少 2。 |
6 | RETI 这是中断返回。它也类似于 RET 指令。但它也恢复中断逻辑。因此,在恢复后,它可以在相同的优先级级别接受其他中断。 |
7 | DJNZ 80H, LABEL 这类似于 DJNZ a8, rel。它表示递减并如果非零则跳转。因此,端口 P0 的内容递减 1。当递减后值不为 00H 时,将发生分支指令。这里 LABEL 是一个 8 位有符号数。 |
8 | CJNE R5, #90H, LABEL 这类似于指令 CJNE Rn, #d8, rel。CJNE 代表比较并如果非等则跳转。因此,它是比较和跳转的组合指令。这里 R5 的内容与 90H 进行比较。当值不相同时,它会跳转到标签。LABEL 是 8 位有符号数。 |
在执行 ACALL 或 AJMP 期间,我们可以认为程序内存被划分为 2K 字节块。从 16 位地址中,前五位是固定的。此外,可以将 2K 内存块划分为 256 字节页面。因此,我们需要 3 位来选择页面。
有三种无条件跳转:SJMP、LJMP 和 AJMP,但有两种无条件调用指令 ACALL、LCALL。没有 SCALL。
广告