对HL中。8080中的乘法子程序如下:
注意,上述子程序的第一行有一个标志Multiply。当然,实际上这个标志对应着子程序在存储器中的起始地址。该子程序在开始处使用了两个PUSH指令,这是因为通常在子程序的起始处要保存程序用到的寄存器。
保存寄存器后,子程序下面要做的是把寄存器H和L置 $0 _ { \circ }$ 尽管可以使用MVI(转移立即数)指令代替SUB指令来实现该操作,但这样会用到4个字节而不是2个字节的指令。子程序执行成功后,运算结果会保存到寄存器对HL中。
接下来子程序把寄存器B中的数(即乘数)转移到累加器A,并判断该数是否为 $\mathbf { 0 } _ { \circ }$ 如果为0,则乘法子程序结束,因为乘数为 $0 _ { \circ }$ 由于寄存器H和L已经为0,所以子程序可以使用 JZ(JumpIf Zero)指令跳转到程序最后的两条 POP指令。
如果乘数不是0,子程序会把寄存器B置为 $\mathbf { 0 } _ { \circ }$ 现在寄存器对 BC存放的是16 位的被乘数,而累加器中存放的是乘数。接下来DAD指令会把BC(被乘数)加到HL(运算结果)中。A中的乘数减1,如果结果不为0,则执行JNZ(非零跳转)指令,该指令会使BC再次加到HL。这个循环会继续执行,直到循环的次数等于乘数为止(当然也可以利用8080的移位指令编写一个更有效率的乘法子程序)。
编码——隐匿在计算机软硬件背后的语言
298