Данному образовательному сайту пришлось несколько раз менять свое имя. С 2011 года доступ к нему обеспечивается по URL
http://educomp.runnet.ru

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)

Модели (hardware):






Награды сайта
Награды сайта

"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.

Результатом трансляции будет следующий машинный код (для его получения можно воспользоваться таблицей с системой команд, а можно загрузить соответствующий файл в имитатор и откомпилировать).
E300
E400
8234
F020
150A
F052
00000

Для остальных примеров результирующий код приводить не будем.


Пример 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


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com