Memory 机器级架构,使用其他工具执行命令
做一些面试前的准备工作,也做一些人们在glassdoor上贴出的面试问题。遇到了一个我卡住了,有点困惑的问题 只有1个寄存器和2个内存插槽的处理器。它有两个指令SUB和STO。仅使用以下工具实现LOD、ADD和MOV:Memory 机器级架构,使用其他工具执行命令,memory,cpu-architecture,cpu-registers,instructions,Memory,Cpu Architecture,Cpu Registers,Instructions,做一些面试前的准备工作,也做一些人们在glassdoor上贴出的面试问题。遇到了一个我卡住了,有点困惑的问题 只有1个寄存器和2个内存插槽的处理器。它有两个指令SUB和STO。仅使用以下工具实现LOD、ADD和MOV: a分节,备忘录1 a分段,备忘录2 STO记忆1,a STO memory2,a 我假设STO是存储,LOD是加载。那么,是否会假定寄存器以值0开始?如果没有,我甚至不知道如何开始,因为如果寄存器中没有值,我就不能使用减法,可以吗?这里有点迷糊。这基本上就是解谜。作为一种面试技巧
我假设STO是存储,LOD是加载。那么,是否会假定寄存器以值0开始?如果没有,我甚至不知道如何开始,因为如果寄存器中没有值,我就不能使用减法,可以吗?这里有点迷糊。这基本上就是解谜。作为一种面试技巧,这并不是非常有效,但理解这一点并将其与有条理的编程问题区别对待显然是值得的。在面试中,你要清楚地表明你是如何接近搜索空间的,你在想什么,而不是仅仅说出答案 本着这种精神,我将以更对话的方式来处理这个问题 根据
a
最初是否必须为零的问题,如果初始值是任意的,我们会怎么做?我们如何使它为零?我们唯一的计算指令是减法。。。你如何从中得到保证的零?那么X-X
总是零对吗?因此,如果我们需要累加器为零,我们存储到一个内存位置,然后从累加器中减去它。后条件是蓄能器为零
因此,从这里我们可以看到一个约束,我们将使用一个或两个内存位置作为临时存储。这是一个相当大的问题,但我们可能必须坚持复合指令序列使用一个内存位置作为临时值,而另一个是输入操作数。能否在不破坏输入的情况下实现所有操作是一个悬而未决的问题
让我们从load开始,因为它应该是最简单的。我们希望:
LOD a, memory1 # a = *memory1 -- destroys value in memory2
让我们试试:
# zero a
STO a, memory2
SUB a, memory2
SUB a, memory1 # a == -memory1
# Save -memory1 and zero a again
STO a, memory2
SUB a, memory2 # a = 0
SUB a, memory2 # a = 0 - (-memory1)
有详细资料。很可能更高效,但这应该让你开始
ADD a, memory1 # a = a + *memory1 -- destroys value in memory2
如上所述,我们将使用X-(-Y)=X+Y
代数等价
STO memory2, a # save a, call this "original_a"
SUB a, memory2 # a = 0
SUB a, memory1 # a = -*memory1
SUB a, memory2 # a = -*memory1 - original_a
# Save -*memory1 - original_a, then zero a
STO a, memory2
SUB a, memory2
SUB a, memory2 # a = -(-*memory1 - original_a) == *memory1 + original_a
等等…这基本上就是解谜。作为一种面试技巧,这并不是非常有效,但理解这一点并将其与有条理的编程问题区别对待显然是值得的。在面试中,你要清楚地表明你是如何接近搜索空间的,你在想什么,而不是仅仅说出答案 本着这种精神,我将以更对话的方式来处理这个问题 根据
a
最初是否必须为零的问题,如果初始值是任意的,我们会怎么做?我们如何使它为零?我们唯一的计算指令是减法。。。你如何从中得到保证的零?那么X-X
总是零对吗?因此,如果我们需要累加器为零,我们存储到一个内存位置,然后从累加器中减去它。后条件是蓄能器为零
因此,从这里我们可以看到一个约束,我们将使用一个或两个内存位置作为临时存储。这是一个相当大的问题,但我们可能必须坚持复合指令序列使用一个内存位置作为临时值,而另一个是输入操作数。能否在不破坏输入的情况下实现所有操作是一个悬而未决的问题
让我们从load开始,因为它应该是最简单的。我们希望:
LOD a, memory1 # a = *memory1 -- destroys value in memory2
让我们试试:
# zero a
STO a, memory2
SUB a, memory2
SUB a, memory1 # a == -memory1
# Save -memory1 and zero a again
STO a, memory2
SUB a, memory2 # a = 0
SUB a, memory2 # a = 0 - (-memory1)
有详细资料。很可能更高效,但这应该让你开始
ADD a, memory1 # a = a + *memory1 -- destroys value in memory2
如上所述,我们将使用X-(-Y)=X+Y
代数等价
STO memory2, a # save a, call this "original_a"
SUB a, memory2 # a = 0
SUB a, memory1 # a = -*memory1
SUB a, memory2 # a = -*memory1 - original_a
# Save -*memory1 - original_a, then zero a
STO a, memory2
SUB a, memory2
SUB a, memory2 # a = -(-*memory1 - original_a) == *memory1 + original_a
等等…为答案干杯为答案干杯