Программирование на Ассемблере
Выполняя пошагово все
команды до rts, убедитесь, что конечное содержимое D0 совпадает с
предыдущим результатом. Заметим, что здесь мы вынуждены использовать
команду move.l для записи адреса таблицы в A0, так как адреса в Amiga
представляются длинными словами (то же самое можно сделать и с помощью lea:
lea table,A0, причем в этом случае суффикс .l не нужен - lea работает
только с длинными словами). А теперь сделаем наш алгоритм еще более компактным, используя \"(A0)+\"
вместо \"x(A0)\". В этом случае, после каждого обращения к элементам таблицы
указатель A0 будет увеличиваться на число считанных байт (в нашем случае на
два), так что в конце программы A0 будет указывать на первое
неиспользованное слово после таблицы. Можно сделать еще лучше, задавая число суммируемых элементов как отдельную
переменную (например, в D1). Для этого нам понадобится организовать цикл:
будем после каждого обращения к памяти декрементировать D1, пока не дойдем
до нуля. Теперь программа будет выглядеть примерно так: ;(4.1C)
adding2: ;A0 должен содержать адрес таблицы, а
;D1 - число элементов moveq #0,D0 ;обнуляем D0 (быстрее, чем clr.l D0)
loop: ;метка начала цикла
add (A0)+,D0 ;прибавляем очередной элемент
subq #1,D1 ;уменьшаем счетчик
bne.s loop ;повторяем, пока не ноль (можно было
;сделать то же самое и с помощью dbra)
rts ;иначе возврат table: dc.w 2,4,6,8,10
end Для тестирования этой программы, запишите в A0 адрес таблицы, а в D1 -
число элементов. Затем выполните программу в пошаговом режиме, наблюдая за
содержимым регистров (в системе SEKA можно использовать команду \"x pc\" для
установки PC на адрес \"adding2\", а затем \"s\" для пошагового выполнения). Завершая этот пример, попробуйте написать программу для суммирования байтов
или длинных слов.
|