-
Notifications
You must be signed in to change notification settings - Fork 2
Assembler
- Синтаксис
- Описание директив
- Метки
- Специальные метки
- Комментарии
- Ограничения и известные проблемы
- Примеры использования
Назначение | Синтаксис | Пример использования |
---|---|---|
Управление размещением в памяти | ORG адрес | ORG 10 |
Константы и переменные | [метка:] WORD ЗНАЧЕНИЕ [, ЗНАЧЕНИЕ ...] | XYZ: WORD ?, DEAD, BEEF |
[метка:] WORD количество DUP (значение) | ARRAY: WORD 6 DUP (?) | |
Адресная команда с прямой адресацией | [метка:] МНЕМОНИКА АРГУМЕНТ | MOV R |
Адресная команда с косвенной адресацией | [метка:] МНЕМОНИКА (АРГУМЕНТ) | ADD (K) |
Безадресная команда | [метка:] МНЕМОНИКА | BEGIN: CLA |
Команда ввода-вывода | [метка:] МНЕМОНИКА АДРЕС ВУ | OUT 3 |
Метки, команды, их аргументы и т.п. должны быть отделены друг от друга пробелом или символом табуляции.
ORG address
- указывает компилятору, что следующее значение необходимо располагать по указанному адресу. Похожа на пультовую команду "Ввод адреса". Обычно данную директиву достаточно использовать один раз в начале программы.
WORD
- ввод констант и резервирование памяти. Может быть указано одно или более значений. Если в качестве значения указан вопросительный знак, то соответствующая ячейка памяти остаётся неинициализированной. Если указанное значение не удалось распознать как шестнадцатеричное число, то в качестве значения будет использован адрес метки с указанным именем. При использовании в синтаксисе WORD количество DUP (значение) соответствующее значение будет продублировано указанное количество раз.
Метки являются ссылками на соответствующие ячейки памяти. Могут использоваться в качестве аргумента для адресных команд и для инициализации других ячеек адресом, на которую ссылается метка. В имени метки могут использоваться любые символы, однако, в связи с особенностями обработки констант, не рекомендуется использовать имена меток, которые могут быть восприняты как шестнадцатеричное число.
BEGIN
- указывает компилятору на первую выполняемую команду программы. Должна быть указана в любой программе.
R
- указывает на ячейку, в которой будет располагаться результат. После успешной компиляции, если в программе была обнаружена метка R, консольная версия БЭВМ выведет адрес соответствующей ячейки памяти.
Любой текст в строке после символа ;
или #
считается комментарием.
Все вводимые значения воспринимаются в шестнадцатеричной системе, и диапазон допустимых значений не проверяется. Следует обратить внимание, что, например, значения 8000 и -8000 будут интерпретированы как одно и тоже число.
Аргументы адресных команд воспринимаются как имя метки только если не являются шестнадцатеричным числом. Обработка и диагностика ошибок находятся в зачаточном состоянии.
При использовании директивы ORG компилятор не отслеживает возможное перекрытие частей программы. Приведённый ниже код скомпилируется без ошибок, но в памяти БЭВМ окажется некорректная программа.
ORG 10
BEGIN: CLA
ADD X
ADD Y
MOV R
HLT
ORG 12
X: WORD DEAD
Y: WORD BEEF
R: WORD ?
ORG 010
BEGIN: CLA
ADD X
ADD Y
MOV R
HLT
ORG 018
R: WORD ?
X: WORD DEAD
Y: WORD BEEF
ORG 00F
WORD 0020
BEGIN: WORD F200,480F,A017,F200,401B,F800,301B,001A,C010,F000,FFFA,0000
ORG 020
WORD 0001,FFFF,0002,FFFE,0003,FFFD
- Работает
- Ввод программы максимально приближен к обычной работе с БЭВМ
- Собственно возможности ассемблера не используются.
- Из текста программы не понятно где расположены команды, а где данные и результат.
ORG 00F
WORD 0020
BEGIN: CLA
ADD (00F)
BMI SKIP
CLA
ADD R
INC
MOV R
SKIP: ISZ 01A
BR BEGIN
HLT
WORD -6
R: WORD ?
ORG 020
X: WORD 0001, FFFF, 0002, FFFE, 0003, FFFD
- Тоже работает
- Из поля зрения выпадают исходные данные хранящие адрес первого элемента массива и их количество.
- При повторном запуске программы с новыми данными результат может быть некорректным.
ORG 00F
K: WORD ? ; Адрес первого элемента массива
BEGIN: CLA
MOV R
ADD (K)
BMI SKIP
CLA
ADD R
INC
MOV R
SKIP: ISZ N
BR BEGIN
HLT
N: WORD ? ; Количество элементов массива
R: WORD ? ; Результат
ORG 020
X: WORD 6 DUP (?) ; Элементы массива
- Видны все исходные данные, используемые программой.
- При повторном запуске программы с новыми исходными данными результат будет корректным.
- Перед запуском программы пользователь должен самостоятельно ввести все исходные данные.
- Пользователь может ошибочно посчитать, что программа может работать только с массивом из 6 элементов.
- В основной программе должно циклически сдвигаться содержимое ячейки R, всегда содержащее один единичный бит.
- Раз в десять секунд должно увеличиваться содержимое ячейки T.
- При запросе от ВУ1 выводить на него значение ячейки X.
- При запросе от ВУ2 сохранять введённое в РД ВУ2 значение в ячейку X.
- При запросе от ВУ3 обменивать местами значение его РД и ячейки X.
- Обмен с ВУ осуществлять в режиме прерывания.
ORG 000
RET: WORD ?
BR INT
ORG 010
BEGIN: CLA
MOV T
ADD CONST
OUT 0
EI
CLA
INC
LOOP: ROR
BCS LOOP
MOV R
BR LOOP
ORG 01C
CONST: WORD 64
X: WORD 0
T: WORD ?
R: WORD ?
INT: MOV STOR_A
ROL
MOV STOR_C
TSF 0
BR IO1
CLF 0
ISZ T
NOP
IO1: TSF 1
BR IO2
CLA
ADD X
OUT 1
CLF 1
IO2: TSF 2
BR IO3
CLA
IN 2
CLF 2
MOV X
IO3: TSF 3
BR END
CLA
IN 3
MOV TMP
CLA
ADD X
OUT 3
CLF 3
CLA
ADD TMP
MOV X
END: CLA
ADD STOR_C
ROR
CLA
CMA
AND STOR_A
EI
BR (RET)
TMP: WORD ?
STOR_A: WORD ?
STOR_C: WORD ?
При выполнении данной программы в графической реализации эмулятора рекомендуется уменьшить задержку между тактами.