Вопросы языка ассемблера. Маленькая Человек Компьютерная Программа
Я пытаюсь написать две разные программы на LMC, используя старый язык ассемблера. Первый как следует:
Напишите программу LMC, которая принимает два входа: число для обратного отсчета и значение шага (пример: обратный отсчет от 35 до 5), пока не достигнет нуля. Он должен печатать каждый шаг и последнее число перед нулем, если последовательность не заканчивается на нуле, но если число становится отрицательным, это число не должно быть напечатано. Пример вывода с использованием 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
Который не работает
Вторая программа LMC, которую я пытаюсь написать, выглядит следующим образом:
Напишите код для расчета площади и периметра треугольника. Программа должна принимать 3 входа: по порядку: основание, высота и третья сторона треугольника. Код должен выдавать 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;
НЕСКОЛЬКО ДВУХ ЧИСЕЛ.
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;
ДОБАВЛЯЕТ ПЕРВЫЙ ЦИФРОВОЙ ВХОД ДЛЯ СЕБЯ, ЗАТЕМ ВЫЧИВАЕТ ВТОРОЙ ВХОД ОТ ИТОГО
00 IN;
01 STA 90;
02 IN;
03 STA 91;
04 LDA 90;
05 ADD 90;
06 SUB 91;
07 OUT;
08 HLT;
ОДИН СПОСОБ УЧЕТА ОТ ВХОДА ВНУТРИ НУЛЯ
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
1 ответ
В псевдокоде:
Input R0 and R1
repeat {
Output R0
Subtract R1 from R0
} until the result goes negative
А в LMC ассемблер:
INP
STA R0
INP
STA R1
LOOP LDA R0
OUT
SUB R1
STA R0
BRP LOOP
HLT
R0 DAT
R1 DAT
Вы можете увидеть код, работающий здесь: Декремент по шагам на LMC Emulator.