奎克的藏经阁 · 原书印刷页

编码 隐匿在计算机软硬件背后的语言 · 第 298 页

PDF 物理页索引 314 · 编码隐匿在计算机软硬件背后的语言

书名
编码 隐匿在计算机软硬件背后的语言
作者
未记录
印刷页
298
PDF 物理页
314(从 0 开始)
章节
编码隐匿在计算机软硬件背后的语言
UUID
38270854-596f-4a26-8183-db8c968c6020
来源类型
original_book
页面 SHA-256
229b7fc813a883982392ffaee55ba9edc3a07242eab6c4bb0fefe5abf8169fa7

对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