古いアセンブリ言語を使用して、LMC で 2 つの異なるプログラムを作成しようとしています。最初は次のとおりです。
ゼロに達するまで、2 つの入力、カウントダウンする数値、およびステップ値 (例: 35 から 5 ずつカウントダウン) を取る LMC プログラムを作成します。各ステップと、シーケンスがゼロで終わらない場合はゼロの前の最後の数値を出力する必要がありますが、数値が負になると、その数値は出力されません。13 と 3 を入力として使用した出力例は、13、10、7、4、1 です。入力として 12 と 3 を使用した出力例は、12、9、6、3、0 です。
私はこれに沿って何かを試しました:
IN
STO 91
IN
STO 92
IN
STO 93
LDA 91
ADD 92
SUB 93
OUT
HLT
うまくいかないもの
私が書こうとしている 2 番目の LMC プログラムは次のとおりです。
三角形の面積と周長を計算するコードを書きます。プログラムは、三角形の底辺、高さ、3 番目の辺の順に 3 つの入力を受け取る必要があります。コードは、出力ボックスに 2 つの値を生成する必要があります。最初の数値は面積で、2 番目の数値は周長です。(ヒント: DAT ステートメントを使用して、いくつかの値を保存することをお勧めします)。
私はこれをどこから始めるべきかさえ知りません。
どんな助けでも大歓迎です。
役立つサンプルコードもいくつかあります。
周囲と面積を計算する - 入力として L と W を取り、最初に周囲を出力し、次に面積を出力します。
00 LDA #01;
01 STA 99;
02 IN;
03 STA 98;
04 LDA #00;
05 STA 96;
06 IN;
07 STA 97;
08 ADD 97;
09 ADD 98;
10 ADD 98;
11 OUT;
12 LDA 96;
13 ADD 98;
14 STA 96;
15 LDA 97;
16 SUB 99;
17 STA 97;
18 SKZ;
19 JMP 12;
20 LDA 96;
21 OUT;
22 HLT;
2 つの数を乗算します。
00 IN;
01 STA 99;
02 STA 97;
03 IN;
04 STA 98;
05 SUB 90;
06 STA 98;
07 SKZ;
08 JMP 12;
09 LDA 97;
10 OUT;
11 HLT;
12 LDA 97;
13 ADD 99;
14 STA 97;
15 LDA 98;
16 JMP 05;
90 DAT 001;
最初の数値入力をそれ自体に加算し、合計から 2 番目の入力を減算します
00 IN;
01 STA 90;
02 IN;
03 STA 91;
04 LDA 90;
05 ADD 90;
06 SUB 91;
07 OUT;
08 HLT;
入力からゼロまでカウントする 1 つの方法
00 IN;
01 OUT;
02 SUB 98;
03 SKP;
04 JMP 06;
05 JMP 01;
06 HLT;
98 DAT 002;
数の二乗
00 IN; take input
01 STA 99; save value as a mulitiplier
02 STA 97; save value as multiplicand
03 SUB 90; subtract one from counter
04 STA 98; copy value to counter
05 LDA 97; load our accumulator number
06 ADD 99; Add original number
07 STA 97; store intermediate sum
08 LDA 98; Load counter
09 SUB 90; subtract one from counter
10 STA 98; Store counter value
11 SKZ; skip if counter is at zero
12 JMP 05; othewise, loop back to 5
13 LDA 97; load our squared number
14 OUT; Write output
15 HLT; stop
90 DAT 01; countdown value