Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
"ANT-8": примеры программ"ANT" имеет хорошую документацию. Это объясняется его педагогическими целями: не просто дать студентам готовый симулятор, но предложить им самим его разработать (или реализовать ассемблер для него). Очевидно, что когда ставится такая задача, она должна быть четко сформулирована - отсюда и подробная документация. Учитывая сказанное, я решил не мудрствовать и просто перевел комментарии к нескольким типичным примерам из описания ассемблера для "ANT-8", которое прилагается авторами к программной реализации. Эти же демонстрационные примеры имеются в виде ассемблерных файлов. Покольку приводимые фрагменты невелики и сохраняют ссылку на автора (Даниэля Элларда) и источник информации, их вполне можно считать цитатами. Пример 1.Демонстрирует простейшую и классическую по своей структуре линейную программу: ввод данных, вычисление и вывод на экран. Попутно отмечу весьма условный характер команд ввода и вывода в модели, что часто встречается в учебных машинах. # Dan Ellard -- 11/2/96 # add2.asm-- Программа для Ant-8, которая вычисляет и печатает # сумму двух чисел, вводимых пользователем в ходе # выполнения программы; после вывода происходит # переход на следующую строку # Используемые регистры: # r2 - используется для хранения результата. # r3 - используется для хранения первого числа. # r4 - используется для хранения второго числа. # r5 - используется для хранения константы '\n' (перевод строки). in r3, Hex # прочитать первое число в r3 (как hex). in r4, Hex # прочитать второе число в r4 (как hex). add r2, r3, r4 # вычислить сумму r2 = r3 + r4. out r2, Hex # напечатать содержимое r2 (как hex). lc r5, '\n' # записать код символа ПС в r5 out r5, ASCII # напечатать содержимое r5, как ASCII hlt # стоп # конец add2.asm. Результатом трансляции будет следующий машинный код (для его получения можно воспользоваться таблицей с системой команд, а можно загрузить соответствующий файл в имитатор и откомпилировать).
Для остальных примеров результирующий код приводить не будем.
Пример 2.А это простейшая разветвляющаяся программа. Ее алгоритм легко понять из приведенных комментариев. Обратите внимание на реализацию условного перехода: его адрес предварительно заносится в регистр. Не сильно изящно, зато инструкции более единообразны, что хорошо с точки зрения принципов RISC-архитектуры. # Dan Ellard -- 11/2/96 # larger.asm-- Программа для Ant-8, которая вычисляет и печатает # большее из двух чисел, вводимых пользователем # в ходе выполнения программы. Используется алгоритм, # который помещает большее из r2 и r3 в r4, а затем # печатает r4. # Используемые регистры: # r2 - используется для хранения первого числа. # r3 - используется для хранения второго числа. # r4 - используется для хранения большего из r2 и r3. # r5 - используется для хранения адреса метки "r2_larger" # r6 - используется для хранения символа ПС in r2, Hex # прочитать hex-число в r2 in r3, Hex # прочитать hex-число в r3 lc r5, $r2_larger # поместить адрес метки r2_larger в r5 bgt r5, r2, r3 # если r2 больше, перейти на r2_larger add r4, r3, r0 # "скопировать" r3 в r4 jmp $endif # и перейти на endif r2_larger: add r4, r2, r0 # "скопировать" r2 в r4 endif: out r4, Hex # напечатать содержимое r4 (как hex). lc r6, '\n' # записать код символа ПС в r6 out r6, ASCII # напечатать содержимое r6 (как ASCII) hlt # стоп # конец larger.asm. Пример 3.В данном примере продемонстрированы сразу две новые черты - организация цикла и работа с памятью. # Dan Ellard -- 01/19/2000 # hello.asm-- An Ant-8 "Hello World" program. # Используемые регистры: # r2 - содержит адрес строки # r3 - содержит адрес конца цикла # r4 - содержит очередной символ для печати. lc r2, $str_data # загрузить адрес строки в r2 lc r3, $endloop # загрузить адрес конца цикла. loop: ld1 r4, r2, 0 # Извлечь символ из строки beq r3, r4, r0 # Если он нулевой - заканчиваем. out r4, ASCII # Иначе печатаем символ. inc r2, 1 # Увеличиваем r2, чтобы он показывал # на следующий символ, и jmp $loop # повторяем процесс... endloop: hlt _data_: # Здесь начинаются данные программы: str_data: .byte 'H', 'e', 'l', 'l', 'o', ' ' .byte 'W', 'o', 'r', 'l', 'd', '\n', 0 # конец hello.asm Пример 4.Завершает нашу страничку пример, который демонстрирует совместную работу ввода и вывода. Он организует эхо-вывод на экран вводимых символов (текста). Для понимания условного ветвления в программе следует помнить, что в регистре r0 всегда хранится 0, а при EOI в r1 заносится 1. # Dan Ellard - 11/10/96 # echo.asm - Программа для Ant-8, которая организует эхо-печать # ввода до достижения EOI (End Of Input). # Используемые регистры: # r2 - содержит очередной прочитанный символ. # r3 - адрес метки $print. lc r3, $print loop: in r2, ASCII # r2 = getchar (); beq r3, r1, r0 # if not EOF, go to $print. jmp $exit # else go to $exit. print: out r2, ASCII # putchar (r2); jmp $loop # go to $loop. exit: hlt # конец # конец echo.asm |