8085微处理器中的无条件调用和返回指令
有时在8085汇编语言编码中,我们需要多次重复某个程序段。在这种情况下,我们可以定义子程序。在这些子程序中,我们可以包含我们可重复使用的指令集或代码。然后,根据需要,我们将相应地调用这些子程序。子程序也可以称为过程。
每当需要执行子程序中的指令时,我们使用**CALL**指令将程序控制分支到子程序。**CALL**是3字节指令,其中1字节用于操作码,2字节用于子程序的地址。**CALL**助记符代表“调用子程序”。执行子程序中编写的指令后,我们将希望将控制返回到**CALL**指令之后编写的下一条指令,然后我们将使用助记符**RET**。这里**RET**代表从子程序返回。RET是1字节指令。在下表中,我们提到了**CALL**和**RET**指令的代码和字节数:
助记符,操作数 | 操作码(十六进制) | 字节数 |
---|---|---|
CALL 标签 | CD | 3 |
RET | C9 | 1 |
让我们考虑以下示例代码以更好地解释:
地址 | 十六进制代码 | 助记符 | 注释 |
---|---|---|---|
2000 | 31 | LXI SP, 5000H | SP ← 5000H. 初始化SP |
2001 | 00 | 地址的低位字节 | |
2002 | 50 | 地址的高位字节 | |
2003 | 3E | MVI A, 00H | A ← 00H,初始化累加器 |
2004 | 00 | 操作数为00H | |
2005 | 06 | MVI B, 01H | B ← 01H |
2006 | 01 | 操作数为01H | |
2007 | 0E | MVI C, 02H | C ← 02H |
2008 | 02 | 操作数为02H | |
2009 | 16 | MVI D, 03H | D ← 03H |
200A | 03 | 操作数为03H | |
200B | CD | CALL 2013H | 调用地址为2013H的子程序。因此,程序的控制将转移到2013H位置。下一个指令的返回地址200EH(即下一条指令的地址)将被压入堆栈顶部。结果,4FFFH(SP – 1)将包含20H,而4FFEH(SP – 2)将分别包含0EH。 |
200C | 13 | 地址的低位字节 | |
200D | 20 | 地址的高位字节 | |
200E | 21 | LXI H, 4050H | HL ← 4050H,初始化HL寄存器对。执行RET指令后,控制将返回到此指令。4050H将具有值06H,即01H + 02H + 03H = 06H的最终和 |
200F | 50 | 地址的低位字节 | |
2010 | 40 | 地址的高位字节 | |
2011 | 77 | MOV M, A | M ← A,累加器的内容将被传输到HL寄存器对指向的内存位置4050H |
2012 | 76 | HLT | 程序结束。 |
2013 | 80 | ADD B | A ← A + B |
2014 | 81 | ADD C | A ← A + C |
2015 | 82 | ADD D | A ← A + D |
2016 | C9 | RET | 将控制返回到地址200EH。返回地址200EH将从堆栈顶部弹出。因此,从地址4FFEH弹出0EH,从地址4FFFH弹出20H,SP将相应地将其内容恢复为初始地址5000H。 |
针对此指令**CALL 2013H**执行的时序图如下:
**总结** − 因此,此指令**CALL**需要3个字节、5个机器周期(操作码提取、内存读取、内存读取、内存写入、内存写入)和18个T状态才能执行,如时序图所示。
针对此指令**RET**执行的时序图如下:
**总结** − 因此,此指令**RET**需要1个字节、3个机器周期(操作码提取、内存读取、内存读取)和10个T状态才能执行,如时序图所示。
广告