Вопросы языка ассемблера. Маленькая Человек Компьютерная Программа

Я пытаюсь написать две разные программы на 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.

Другие вопросы по тегам