Привет всем , не могу решить задачку на учебной dosbox машине.
Задача:

Моя попытка решения задачи:
Описание модели и команды:
Функциональная модель имеет: оперативную память, состоящую из шестнадцати двенадцатиразрядных ячеек, блок регистров общего назначения, состоящий из двух регистров - 0 и 1. Необходимо уложиться в 16 строчек кода (хотя программа позволяет вводить 19 и вроде бы код работает)
Ниже приведен список команд ассемблера функциональной модели с указанием мнемокодов и типов операндов, используемых в командах.
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 - останов.
Кроме того, в состав команд входит команда END, сообщающая ассемблеру о конце программы (строго говоря, это не команда, а псевдокоманда, поскольку в машинный код она не переводится, а служит для управления процессом трансляции), а также две директивы : директива определения содержимого ячейки памяти и директива резервирования ячейки памяти.
Директива определения ячейки памяти присваивает ячейке памяти символический адрес и обеспечивает занесение в эту ячейку значения, указанного в качестве параметра директивы. Формат директивы следующий:
[метка:] .DW параметр
Здесь параметр - шестнадцатеричное число не более чем из трех значащих цифр. Если число начинается с шестнадцатеричных цифр A, B,C, D, E или F, то перед первой значащей цифрой числа должен стоять 0.
Директива резервирования ячейки памяти только присваивает ячейке памяти символический адрес. Формат директивы следующий:
[метка:] .DS
При записи программ на ассемблере функциональной модели
следует придерживаться следующих правил:
• для записи меток, мнемокодов операций и символических адресов используются прописные и строчные буквы латинского алфавита и цифры от 0 до 9;
• присутствие двоеточия вслед за идентификатором метки является обязательным;
• первый операнд отделяется от мнемокода операции хотя бы одним пробелом, если операндов два, то второй операнд отделяется от первого запятой.
Пример построения программы на ассемблере функциональной модели ЭВМ-1
Выражение Y:=N!
Программа, реализующая данное выражение, будет иметь вид:
MOVR 0,N
MOVR 1,ONE
CYCL:JZ OU1
MRR 1,0
LOOP CYCL
OU1: MOVM 1,FACT
OUT FACT
STOP
N: .DW 5
ONE: .DW 1
FACT:.DS
END