机器级架构,使用其他实现命令
Machine Level Architecture, implement commands using others
为面试做一些准备,做一些面试问题,人们已经在 glassdoor 上发布了类似职位的面试问题。 运行 进入一个我被卡住并且有点困惑的地方。
只有 1 个寄存器和 2 个内存插槽的处理器。它有两条指令 SUB 和 STO。仅使用以下内容实施 LOD、ADD 和 MOV:
- SUB a,记忆1
- SUB a, memory2
- STO内存1,一个
- STO 内存 2,
我假设 STO 是商店,LOD 是加载在这里。那么是否会假定寄存器以 0 值开始?如果不是,我什至不确定如何开始,因为如果它没有任何价值,我不能对寄存器使用减法,可以吗?这里有点迷路。
这基本上是解谜。作为一种面试技巧,这并不是非常有效,但了解情况并以与例如不同的方式对待它肯定是值得的。一个有条不紊的编程问题。在面试上下文中,您想非常清楚地说明您是如何进行搜索的 space 以及您在想什么,而不是只是吐出答案。
本着这种精神,我将以更对话的方式来处理这个问题...
根据 a
最初是否必须为零的问题,如果初始值是任意的,我们会怎么做?我们如何让它为零?我们唯一的计算指令是减法……你如何从中得到保证的零?那么 X - X
总是零,对吗?所以如果我们需要累加器为零,我们存储到一个内存位置,然后从累加器中减去它。 post 条件是累加器为零。
因此从这里我们可以看出,我们将面临的一个限制是使用一个或两个内存位置作为临时存储。这是一个相当大的问题,但我们可能不得不坚持复合指令序列使用一个内存位置作为临时地址,而另一个是输入操作数。是否可以在不破坏输入的情况下实现所有操作,这是一个悬而未决的问题。
让我们从加载开始,因为它应该是最简单的。我们想要:
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
等等...
为面试做一些准备,做一些面试问题,人们已经在 glassdoor 上发布了类似职位的面试问题。 运行 进入一个我被卡住并且有点困惑的地方。
只有 1 个寄存器和 2 个内存插槽的处理器。它有两条指令 SUB 和 STO。仅使用以下内容实施 LOD、ADD 和 MOV:
- SUB a,记忆1
- SUB a, memory2
- STO内存1,一个
- STO 内存 2,
我假设 STO 是商店,LOD 是加载在这里。那么是否会假定寄存器以 0 值开始?如果不是,我什至不确定如何开始,因为如果它没有任何价值,我不能对寄存器使用减法,可以吗?这里有点迷路。
这基本上是解谜。作为一种面试技巧,这并不是非常有效,但了解情况并以与例如不同的方式对待它肯定是值得的。一个有条不紊的编程问题。在面试上下文中,您想非常清楚地说明您是如何进行搜索的 space 以及您在想什么,而不是只是吐出答案。
本着这种精神,我将以更对话的方式来处理这个问题...
根据 a
最初是否必须为零的问题,如果初始值是任意的,我们会怎么做?我们如何让它为零?我们唯一的计算指令是减法……你如何从中得到保证的零?那么 X - X
总是零,对吗?所以如果我们需要累加器为零,我们存储到一个内存位置,然后从累加器中减去它。 post 条件是累加器为零。
因此从这里我们可以看出,我们将面临的一个限制是使用一个或两个内存位置作为临时存储。这是一个相当大的问题,但我们可能不得不坚持复合指令序列使用一个内存位置作为临时地址,而另一个是输入操作数。是否可以在不破坏输入的情况下实现所有操作,这是一个悬而未决的问题。
让我们从加载开始,因为它应该是最简单的。我们想要:
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
等等...