Memory 机器级架构,使用其他工具执行命令

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开始?如果没有,我甚至不知道如何开始,因为如果寄存器中没有值,我就不能使用减法,可以吗?这里有点迷糊。这基本上就是解谜。作为一种面试技巧

做一些面试前的准备工作,也做一些人们在glassdoor上贴出的面试问题。遇到了一个我卡住了,有点困惑的问题

只有1个寄存器和2个内存插槽的处理器。它有两个指令SUB和STO。仅使用以下工具实现LOD、ADD和MOV:

  • a分节,备忘录1
  • a分段,备忘录2
  • STO记忆1,a
  • STO memory2,a

  • 我假设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
    

    等等…

    为答案干杯为答案干杯