0

アセンブリ言語形式でのコーディングの基本を学ぶために、可視仮想マシンと呼ばれるリトルマンコンピューターシミュレータープログラムを使用しています。現在、私は任意の2つの数値(xy)を乗算しようとしていますが、最大の数値を取得し、それに小さい数値の何倍に等しいかを加算することにより、効率的な方法で。数字を入れ替えて、最大の数字を取り、小さい数字の何倍に等しいかを追加するにはどうすればよいですか?

例えば

入力は次のいずれかになります。

5 * 12また12 * 5

効率的な計算:

12 + 12 + 12 + 12 +12 = 60

効率的ではありません:

5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 = 60

コード:

IN 
STO 99
IN 
STO 98 
STO 96
LDA 99
SUB 97
STO 99
LDA 96
ADD 98
BRP 07
LDA 96
OUT 96
*95
DAT 001
HLT
4

1 に答える 1

3

コマンドリストを見ると、2番目の入力から最初の入力を減算し、条件分岐を使用してどちらが大きいかを確認することで、これを実現できるようです。このようなもの:

     INP       // Get input into accumulator
     BRZ QUIT  // If zero, we're finished
     STA A     // Accumulator to A
     INP       // Get input into accumulator
     BRZ QUIT  // If zero, we're finished
     STA B     // Accumulator to B
     SUB A     // Subtract A from accumulator (B)
     BRP LOOP  // Jump to LOOP if B > A already, otherwise swap
     LDA A     // Put A into accumulator
     STA TEMP  // Accumulator to TEMP
     LDA B     // Put B into accumulator
     STA A     // Overwrite A with B
     LDA TEMP  // Put TEMP (A) into accumulator
     STA B     // Overwrite B with A: now B > A
LOOP LDA AB    // Put result into accumulator (starts off as zero)
     ADD B     // Add larger input to accumulator
     STA AB    // Update result
     LDA A     // Put loop counter (A) into accumulator
     SUB ONE   // Decrement
     STA A     // Update loop counter
     BRZ DONE  // Jump to DONE if loop counter is zero
     BRP LOOP  // Jump to LOOP if loop counter is positive
DONE LDA AB    // Put result into accumulator
QUIT OUT       // Output
     HLT       // Finish
ONE  DAT 1     // ONE = 1
A    DAT       // First input
B    DAT       // Second input
AB   DAT       // A * B
TEMP DAT       // Temporary (needed for swap)

これは完全にテストされていないため、バグが含まれている可能性が高いことに注意してください。ただし、ソースにコメントしたので、アイデアを確認できます。


編集バグはないことが判明しました-暗闇の中で刺すのは悪くありません;)とにかく、コメントで言及されているJavaベースのシミュレータで実行されるわずかに変更された構文は次のとおりです。

      INP       // Get input into accumulator
      BRZ :QUIT // If zero, we're finished
      STA :A    // Accumulator to A
      INP       // Get input into accumulator
      BRZ :QUIT // If zero, we're finished
      STA :B    // Accumulator to B
      SUB :A    // Subtract A from accumulator (B)
      BRP :LOOP // Jump to LOOP if B > A already, otherwise swap
      LDA :A    // Put A into accumulator
      STA :TEMP // Accumulator to TEMP
      LDA :B    // Put B into accumulator
      STA :A    // Overwrite A with B
      LDA :TEMP // Put TEMP (A) into accumulator
      STA :B    // Overwrite B with A: now B > A
LOOP: LDA :AB   // Put result into accumulator (starts off as zero)
      ADD :B    // Add larger input to accumulator
      STA :AB   // Update result
      LDA :A    // Put loop counter (A) into accumulator
      SUB :ONE  // Decrement
      STA :A    // Update loop counter
      BRZ :DONE // Jump to DONE if loop counter is zero
      BRP :LOOP // Jump to LOOP if loop counter is positive
DONE: LDA :AB   // Put result into accumulator
QUIT: OUT       // Output
      HLT       // Finish
ONE:  1         // ONE = 1
A:    0         // First input
B:    0         // Second input
AB:   0         // A * B
TEMP: 0         // Temporary (needed for swap)
于 2013-02-26T15:10:55.203 に答える