Помогите написать цикл для подсчёта по формуле на ассемблере для простой ЭВМ. Проблема в нехватке ячеек памяти

Необходимо реализовать циклический алгоритм:
Формула:
введите сюда описание изображения

У модели есть 16 ячеек и 2 регистра.

Каждая команда ассемблера состоит из мнемокода операции и операндов. Каждая строка может иметь метку - идентификатор, состоящий не более чем из пяти символов, и отделяющийся от мнемокода операции символом ":" ("двоеточие"). На этапе ассемблирования любой метке соответствует некоторое значение программного счетчика, таким образом, метка может расcматриваться как символический адрес, на который могут ссылаться другие команды программы. Кодирование операндов в командах осуществляется следующим образом:
• если операнд является регистром, то в поле операндов он кодируется номером регистра(0 или 1);
• если операндом является содержимое ячейки памяти, то в поле операндов записывается символический или абсолютный шестнадцатеричный адрес соответствующей ячейки памяти;
• если операнд является адресом ячейки памяти, то в поле операндов указывается либо символический, либо абсолютный шестнадцатеричный адрес памяти.

Список команд:

  1. INP A - ввод слова из канала ввода и запись его по адресу A.
  2. OUT A - вывод содержимого ячейки памяти с адресом A в канал вывода.
  3. MOVR R,A - загрузка регистра R содержимым ячейки памяти с адресом A.
  4. MOVM R,A - запись содержимого регистра R в ячейку памяти с адресом A.
  5. ARM R,A - сложить содержимое регистра R с содержимым ячейки памяти с адресом A.
  6. SRM R,A - из содержимого регистра R вычесть содержимое ячейки памяти с адресом A.
  7. MRM R,A - перемножить содержимое регистра R и ячейки памяти с адресом A.
  8. DRM R,A - поделить содержимое регистра R на содержимое ячейки памяти с адресом A.
  9. ARR R1,R2 - сложить содержимое регистров R1 и R2.
  10. SRR R1,R2 - из содержимого R1 вычесть содержимое R2.
  11. MRR R1,R2 - содержимое регистра R1 умножить на содержимое регистра R2.
  12. DRR R1,R2 - содержимое регистра R1 поделить на содержимое регистра R2.
  13. AMM A1,A2 - сложить содержимое ячеек памяти с адресами A1 и A2.
  14. SMM A1,A2 - из содержимого ячейки с адресом A1 вычесть содержимое ячейки памяти с адресом A2.
  15. MMM A1,A2 - перемножить содержимое ячеек памяти с адресами A1 и A2.
  16. DMM A1,A2 - содержимое ячейки памяти с адресом A1 поделить на содержимое ячейки памяти с адресом A2.
  17. JMP A - безусловный переход по адресу A.
  18. JV A - переход по переполнению по адресу A.
  19. JP A - переход по положительному результату по адресу A.
  20. JPV A - переход по переполнению или положительному результату по адресу A.
  21. JZ A - переход по нулевому результату.
  22. JZV A - переход по неотрицательному и неположительному результату.
  23. JZP A - переход по положительному или нулевому результату.
  24. JZPV A - переход по неотрицательному результату.
  25. JN A - переход по отрицательному результату.
  26. JNV A - переход по отрицательному результату или переполнению.
  27. JNP A - переход по отрицательному или нулевому результату.
  28. JNPV A - переход по ненулевому результату.
  29. JNZ A - переход по отрицательному или нулевому результату.
  30. JNZV A - переход по неположительному результату.
  31. JNZP A - переход по непереполнению.
  32. LOOP A - организация цикла со счетчиком в регистре 0.
  33. STOP - останов.

Директива определения ячейки памяти присваивает ячейке памяти символический адрес и обеспечивает занесение в эту ячейку значения, указанного в качестве параметра директивы. Формат директивы следующий: [метка:] .DW параметр

Здесь параметр - шестнадцатеричное число не более чем из трех значащих цифр. Если число начинается с шестнадцатеричных цифр A, B,C, D, E или F, то перед первой значащей цифрой числа должен стоять 0.

Директива резервирования ячейки памяти только присваивает ячейке памяти символический адрес. Формат директивы следующий: [метка:] .DS

Цикл реализуется так:
введите сюда описание изображения
Проблема в том, что я не знаю как впихнуть формулу в оставшиеся 4 строки...


Ответы (1 шт):

Автор решения: Harry

А ну-ка, проверяйте... Писал на ходу, мог что-то и пропустить.

       MOVR 0, N   ; организация цикла
CYCL:  MOVR 1, K   ; множитель (-1)^i
       MRM  1, A   ; умножение на значение a+i
       SMM  A, M   ; увеличение a (значение a+i для следующей итерации) 
       MMM  K, M   ; смена знака (-1)^i
       AMR  S, 1   ; вычисление окончательной суммы
       LOOP CYCL   ; цикл N раз
       OUT  S      ; вывод суммы
       STOP
N: .DW  5   ; исходные 
A: .DW  2   ;    значения
M: .DW -1   ; константа
K: .DW  1   ; текущее (-1)^i
S: .DW  0   ; сумма

На каждой итерации после просчета просто увеличиваем A на 1.

→ Ссылка