Помогите написать цикл для подсчёта по формуле на ассемблере для простой ЭВМ. Проблема в нехватке ячеек памяти
Необходимо реализовать циклический алгоритм:
Формула:
У модели есть 16 ячеек и 2 регистра.
Каждая команда
ассемблера состоит из мнемокода операции и операндов. Каждая строка может иметь
метку - идентификатор, состоящий не более чем из пяти символов, и отделяющийся от
мнемокода операции символом ":" ("двоеточие"). На этапе ассемблирования любой метке
соответствует некоторое значение программного счетчика, таким образом, метка может
расcматриваться как символический адрес, на который могут ссылаться другие команды
программы. Кодирование операндов в командах осуществляется следующим образом:
• если операнд является регистром, то в поле операндов он кодируется номером
регистра(0 или 1);
• если операндом является содержимое ячейки памяти, то в поле операндов
записывается символический или абсолютный шестнадцатеричный адрес
соответствующей ячейки памяти;
• если операнд является адресом ячейки памяти, то в поле операндов указывается
либо символический, либо абсолютный шестнадцатеричный адрес памяти.
Список команд:
- INP A - ввод слова из канала ввода и запись его по адресу A.
- OUT A - вывод содержимого ячейки памяти с адресом A в канал вывода.
- MOVR R,A - загрузка регистра R содержимым ячейки памяти с адресом A.
- MOVM R,A - запись содержимого регистра R в ячейку памяти с адресом A.
- ARM R,A - сложить содержимое регистра R с содержимым ячейки памяти с адресом A.
- SRM R,A - из содержимого регистра R вычесть содержимое ячейки памяти с адресом A.
- MRM R,A - перемножить содержимое регистра R и ячейки памяти с адресом A.
- DRM R,A - поделить содержимое регистра R на содержимое ячейки памяти с адресом A.
- ARR R1,R2 - сложить содержимое регистров R1 и R2.
- SRR R1,R2 - из содержимого R1 вычесть содержимое R2.
- MRR R1,R2 - содержимое регистра R1 умножить на содержимое регистра R2.
- DRR R1,R2 - содержимое регистра R1 поделить на содержимое регистра R2.
- AMM A1,A2 - сложить содержимое ячеек памяти с адресами A1 и A2.
- SMM A1,A2 - из содержимого ячейки с адресом A1 вычесть содержимое ячейки памяти с адресом A2.
- MMM A1,A2 - перемножить содержимое ячеек памяти с адресами A1 и A2.
- DMM A1,A2 - содержимое ячейки памяти с адресом A1 поделить на содержимое ячейки памяти с адресом A2.
- JMP A - безусловный переход по адресу A.
- JV A - переход по переполнению по адресу A.
- JP A - переход по положительному результату по адресу A.
- JPV A - переход по переполнению или положительному результату по адресу A.
- JZ A - переход по нулевому результату.
- JZV A - переход по неотрицательному и неположительному результату.
- JZP A - переход по положительному или нулевому результату.
- JZPV A - переход по неотрицательному результату.
- JN A - переход по отрицательному результату.
- JNV A - переход по отрицательному результату или переполнению.
- JNP A - переход по отрицательному или нулевому результату.
- JNPV A - переход по ненулевому результату.
- JNZ A - переход по отрицательному или нулевому результату.
- JNZV A - переход по неположительному результату.
- JNZP A - переход по непереполнению.
- LOOP A - организация цикла со счетчиком в регистре 0.
- STOP - останов.
Директива определения ячейки памяти присваивает ячейке памяти символический адрес и обеспечивает занесение в эту ячейку значения, указанного в качестве параметра директивы. Формат директивы следующий: [метка:] .DW параметр
Здесь параметр - шестнадцатеричное число не более чем из трех значащих цифр. Если число начинается с шестнадцатеричных цифр A, B,C, D, E или F, то перед первой значащей цифрой числа должен стоять 0.
Директива резервирования ячейки памяти только присваивает ячейке памяти символический адрес. Формат директивы следующий: [метка:] .DS
Цикл реализуется так:
Проблема в том, что я не знаю как впихнуть формулу в оставшиеся 4 строки...
Ответы (1 шт):
А ну-ка, проверяйте... Писал на ходу, мог что-то и пропустить.
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.