2017-11-29 51 views
0

同様のポジションのためにglassdoorに投稿したインタビューの質問を行うために、インタビューの準備をしています。私は立ち往生し、ちょっと混乱している。マシンレベルのアーキテクチャ、他者を使用してコマンドを実装する

レジスタは1つのみ、メモリスロットは2つのみのプロセッサです。それは2つの命令SUBとSTOを持っています。のみ、以下を使用してLODを実装し、ADD、およびMOV:

  1. サブA、メモリ1
  2. サブA、メモリ2
  3. STOのメモリ1、
  4. STOのメモリ2、

私はSTOが店舗であり、LODがここにロードされていると仮定します。レジスタは値0で始まると見なされますか?そうでない場合は、レジスタに値を持たない場合は減算を使うことができないので、開始する方法もわからないのですか?ここで失われたビット。

答えて

2

これは基本的にパズル解決です。インタビュー技術としてはそれほど生産的ではありませんが、それが事実であることを理解して、それを少しばかり扱うことは間違いありません。計画的プログラミング問題。インタビューの状況では、検索スペースにどのように近づいているのか、答えを吐き出すのではなく、何を考えているのかを非常に明確にしたいと考えています。この精神で

、私はもう少し会話的これに近づくだろう...かどうかaの質問パー

は、初期値は任意であるならば、我々は何をするだろう、最初はゼロである必要がありますか?どのようにしてゼロになるのでしょうか?私たちが持っている唯一の計算命令は減算です...それでは、どのように保証されたゼロを得るのですか?よくX - Xは常にゼロですか?したがって、アキュムレータをゼロにする必要があれば、メモリ位置に格納し、アキュムレータから戻します。そのためのポスト条件はアキュムレータがゼロであることです。

ここから、1つまたは両方のメモリロケーションを一時ストレージとして使用するという制約があることがわかります。これはかなり大きな問題ですが、合成命令シーケンスにはtempとして1つのメモリ位置を使用し、もう一方は入力オペランドを使用するようにする必要があります。入力を壊さずにすべての操作を実装できるかどうかは疑問です。

最も簡単なはずの負荷から始めましょう。我々はしたい:

# 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) 

LODがあります:

LOD a, memory1 # a = *memory1 -- destroys value in memory2 

は試すことができます。より効率的になる可能性は十分ありますが、それはあなたを始めさせるはずです。

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 

のように...答えメイトのため

+0

乾杯 –

関連する問題