【发布时间】:2012-03-17 14:09:11
【问题描述】:
好吧,我被难住了。 TAOCP vol1,第 3 版,第 1.3.2 节“MIX 汇编语言”提供了一个简单的汇编程序,用于查找数组的最大值。该程序在第 145 页上给出,以及每条指令应该执行的次数。在下一页它说“[...] 执行子程序的时间长度;它是 (5+5n+3A)u [...]”
但是:当您实际将列表中给出的计数相加时,您最终会得到 (4+4n+2A) 的因子。这种差异也出现在其他算法中。例如,在第 1.3.3 节对程序 A 的分析中,Knuth 写道“通过简单的加法 [..] (7+5A+...)”。当您实际执行“简单加法”时,您最终会得到 (5+3A+...)
这是怎么回事?
这里是 MIX 代码,其中并排括号中的文本计数。为了便于输入,我将标签名称缩短为两个字符
X EQU 1000
ORIG 3000
MA STJ EX [1]
IN ENT3 0,1 [1]
JMP CH [1]
LO CMPA X,3 [n-1]
JGE *+3 [n-1]
CH ENT2 0,3 [A+1]
LDA X,3 [A+1]
DEC3 1 [n]
J3P LO [n]
EX JMP * [1]
【问题讨论】:
-
您愿意添加与您的示例对应的代码吗?
-
好的,我已经添加了查找最大值的代码清单。程序 A 相当长(~ 80 LOC),所以我不会输入它。
-
由于您没有提供有关“A”和“n”是什么的任何信息,我只能猜测。汇编中的某些指令根据情况需要或多或少的周期(例如条件跳转)。这可能是答案(也许这本书给出了最坏的情况)。另一种可能性是这本书(我不知道)可能有一些关于时间长度的特殊约定。
-
@Sword22 A 和 n 是什么并不重要;只是参数。你说得对,我自己也弄明白了:有些指令的执行时间比其他指令要长;括号中的因素后面的“u”告诉了我。我还将所有内容乘以每条指令所需的时间单位数,现在一切都检查出来了。而且文中没有解释,grrr。