Это команда xa, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
xa - 6502 / R65C02 / 65816 кросс-ассемблер
СИНТАКСИС
xa [ВАРИАНТ] ... ФАЙЛОВ
ОПИСАНИЕ
xa представляет собой многопроходный кросс-ассемблер для 8-битных процессоров серии 6502 (таких как
6502, 65C02, 6504, 6507, 6510, 7501, 8500, 8501 и 8502), Rockwell R65C02 и
16-битный процессор 65816. Описание синтаксиса см. СБОРНИК СИНТАКСИС дальше в
эту страницу руководства.
ДОПОЛНИТЕЛЬНЫЕ ОПЦИИ
-v Подробный вывод.
-x Использовать старое поведение имени файла (переопределяет -o, -e и -l). Эта опция сейчас
устарело.
-C Нет кодов операций CMOS (по умолчанию разрешены коды операций R65C02)
-W Нет кодов операций 65816 (по умолчанию).
-w Разрешить 65816 кодов операций.
-B Показывать линии с блоком открыто / закрыто (см. ПСЕВДО-ОПС).
-c Создавать объектные файлы o65 вместо исполняемых файлов (связывание не выполняется); файлы
может содержать неопределенные ссылки.
-o имя файла
Задайте имя выходного файла. По умолчанию а.о65; используйте специальное имя файла - выводить на
стандартный вывод.
-e имя файла
Задайте имя файла журнала ошибок, по умолчанию нет.
-l имя файла
Задайте имя файла для ярлыка, по умолчанию нет. Это таблица символов, которую можно использовать
дизассемблерами, такими как дха(1) восстановить источник.
-r Добавить список перекрестных ссылок в лабелист (требуется -l).
-M Разрешить появление двоеточий в комментариях; для совместимости с MASM. Это не влияет
интерпретация толстой кишки в другом месте.
-R Запустить ассемблер в режиме перемещения.
-Этикетка
Определяет этикетка как абсолютный (но не определенный) ярлык даже при связывании.
-б? адр
Установить базу сегмента для сегмента ? по адресу адр. ? должно быть t, d, b или z для
text, data, bss или нулевые сегменты соответственно.
-A адр
Сделайте так, чтобы текстовый сегмент начинался с адреса, чтобы, когда файл начинался с адреса
адр, переезд не нужен. Отменяет -бт; другие сегменты все еще должны быть
позаботился о -b.
-G Скрыть список экспортируемых глобальных объектов.
-DDEF = ТЕКСТ
Определите макрос препроцессора в командной строке (см. ПРЕДПРОЦЕССОР).
-I директория Добавить каталог директория к пути включения (до XAINPUT; увидеть ОКРУЖАЮЩАЯ СРЕДА).
-O кодировок
Определите кодировку вывода для символьных строк. В настоящее время поддерживаются ASCII
(по умолчанию), PETSCII (Commodore ASCII), PETSCREEN (коды экрана Commodore) и HIGH
(установите высокий бит для всех символов).
-п? Установите альтернативный символ препроцессора на ?. Это полезно, когда вы хотите
использование CPP(1) и встроенный препроцессор одновременно (см. ПРЕДПРОЦЕССОР).
Для вашей оболочки может потребоваться цитирование символов (пример: -p '~' ).
--Помогите Показать сводку опций.
--версия
Показать версию программы.
СБОРНИК СИНТАКСИС
Введение в программирование на языке ассемблера 6502 и мнемонику выходит за рамки
эту страницу руководства. Мы приглашаем вас изучить любое количество отличных книг по
тема; одно полезное название - "Машинный язык для начинающих" Ричарда Мэнсфилда.
(COMPUTE!), Охватывающий 8-битные системы Atari, Commodore и Apple, и широко доступный
на рынке бывших в употреблении.
xa поддерживает как стандартные коды операций NMOS 6502, так и используемые коды операций Rockwell CMOS
в 65C02 (R65C02). С -w вариант, xa также принимает коды операций для 65816. NMOS
Недокументированные коды операций 6502 намеренно не поддерживаются и должны вводиться вручную.
используя .байт псевдооперация (см. ПСЕВДО-ОПС). Из-за конфликтов между R65C02 и 65816
наборы инструкций и недокументированные инструкции на NMOS 6502, их использование не рекомендуется.
В общем, xa принимает более или менее стандартный формат ассемблера 6502, популяризированный
MASM и TurboAssembler. Значения и адреса могут быть выражены как литералы или как
выражения; остроумие,
123 десятичное значение
$234 шестнадцатеричное значение
& 123 восьмеричный
% 010110 двоичный
* текущее значение программного счетчика
Значение ASCII любого символа в кавычках вставляется непосредственно в текст программы.
(пример: "А" вставляет байт «A» в выходной поток); см. также ПСЕВДО-ОПС
раздел. На это влияет текущий выбранный набор символов, если таковой имеется.
Метки определяют места в тексте программы, как и в других многопроходных ассемблерах. А
метка определяется всем, что не является кодом операции; например, строка, такая как
label1 Lda #0
определяет label1 быть текущим местоположением программного счетчика (таким образом, адрес
LDA код операции). Метку можно явно определить, присвоив ей значение выражения,
как
label2 = $ d000
который определяет label2 быть адресом $ d000, а именно началом регистра VIC-II
блок на компьютерах Commodore 64. Счетчик программ * считается особым видом
метки, и может быть назначен с такими операторами, как
* = $ c000
который устанавливает счетчик программ в десятичное положение 49152. За исключением
счетчик программы, метки нельзя назначать несколько раз. Чтобы явно объявить
переопределение метки, поставьте перед ней - (тире), например,
-метка2 = $ d020
который устанавливает label2 в регистр цвета границы Commodore 64. Объем этикетки
затронутый блоком, в котором он находится (см. ПСЕВДО-ОПС для инструкций блока). Этикетка
также может быть жестко задан с помощью -L командной строки.
Для тех инструкций, где аккумулятор является подразумеваемым аргументом (например, над уровнем моря и LSR;
вкл и декабрь на R65C02; и т. д.), идиома явного указания аккумулятора с a is
не требуется, поскольку правильная форма будет выбрана, если нет явного аргумента. По факту,
для согласованности с вручением этикеток, если есть этикетка с именем a, это на самом деле
генерировать код, ссылающийся на эту метку как на ячейку памяти, а не на аккумулятор.
Иначе ассемблер пожалуется.
Метки и коды операций могут принимать выражения в качестве аргументов, позволяющих вычислить значения, и
могут сами ссылаться на другие метки и / или счетчик программ. Такое выражение, как
lab1 + 1 (который работает с текущим значением метки lab1 и увеличивает его на единицу) может
используйте следующие операнды в порядке убывания приоритета:
* умножение (приоритет 10)
/ целочисленное деление (приоритет 10)
+ дополнение (приоритет 9)
- вычитание (9)
<< сдвиг влево (8)
>> сдвиг вправо (8)
>= => больше или равно (7)
< больше чем (7)
<= =< меньше или равно (7)
< меньше чем (7)
= равно (6)
<> >< не равно (6)
& побитовое И (5)
^ побитовое исключающее ИЛИ (4)
| побитовое ИЛИ (3)
&& логическое И (2)
|| логическое ИЛИ (1)
Скобки действительны. При переопределении метки, комбинируя арифметические или побитовые операторы
с оператором = (равно), например += и так далее, например,
-передемаркировка += (label12 / 4)
Как правило, xa пытается определить значение операнда и (при обращении к
место в памяти) используйте нулевую страницу, 16-битную или (для 65816) 24-битную адресацию, где это необходимо
и там, где это поддерживается конкретным кодом операции. Это генерирует меньший и более быстрый код, и
почти всегда предпочтительнее.
Тем не менее, вы можете использовать эти префиксные операторы для принудительного отрисовки определенного
операнд. Те, которые генерируют восьмибитный результат, также могут использоваться в 8-битной адресации.
режимы, такие как немедленная и нулевая страница.
< младший байт выражения, например, Lda #
> старший байт выражения
! в ситуациях, когда выражение может пониматься как абсолютное или
нулевое значение страницы, не пытайтесь оптимизировать аргумент нулевой страницы для тех
коды операций, которые его поддерживают (т.е. сохраняют как 16-битное слово)
@ отобразить как 24-битное количество для 65816 (необходимо указать -w параметр командной строки). Эти is
обязательный в указывать любой 24-бит количество!
` вызвать дальнейшую оптимизацию, даже если длина инструкции не может быть
достоверно определяется (см. ЗАМЕТКИ)
Выражения могут встречаться как аргументы кодов операций или внутри препроцессора (см. ПРЕДПРОЦЕССОР
для синтаксиса). Например,
Lda label2 + 1
принимает значение в label2 + 1 (используя значение нашей предыдущей метки, это будет $ d021), и
будут собраны как $ ad $21 $ d0 на диск. Сходным образом,
Lda #
займет младшие 8 бит label2 (т. е. 20 долларов) и назначить их аккумулятору
(собирая инструкцию как $ a9 $20 на диск).
Комментарии обозначаются точкой с запятой (;), например
;это is a комментарий
Их также можно указать в стиле языка C, используя /* */ и // которые являются
понял на ПРЕДПРОЦЕССОР уровень (см.).
Обычно двоеточие (:) разделяет операторы, например
label4 Lda # 0: штат $ d020
or
метка2: Lda #2
(обратите внимание на использование двоеточия для указания метки, как и в некоторых других ассемблерах, которые
xa также понимает с двоеточием или без него). Это также относится к комментариям с точкой с запятой,
такой, что
; a комментарий: lda #0
понимается как комментарий, за которым следует код операции. Чтобы победить это, используйте -M командной строки
возможность разрешить двоеточия в комментариях. Это не относится к /* */ и // Комментарии,
которые рассматриваются на уровне препроцессора (qv).
ПСЕВДО-ОПС
Псевдооперации - это ложные коды операций, используемые ассемблером для обозначения мета- или встроенных команд.
Как и большинство ассемблеров, xa имеет богатый набор.
.байт значение1, значение2, значение3, ...
Задает строку байтов, которая будет непосредственно помещена в собранный объект. В
аргументы могут быть выражениями. Можно указать любое количество байтов.
по возрастанию "текст 1" , "текст2", ...
Задает строку символов, которая будет вставлена в собранный объект.
Строки понимаются в соответствии с текущим заданным набором символов; для
Например, если указан ASCII, они будут отображаться как ASCII, а если PETSCII -
указанные, они будут переведены в эквивалентный эквивалент Commodore ASCII.
Другие нестандартные ASCII, такие как ATASCII для компьютеров Atari, должны использовать ASCII.
эквивалентные символы; должны быть указаны графические и управляющие символы
явно используя .байт для нужного вам персонажа. Обратите внимание, что при указании
аргумент кода операции, по возрастанию не обязательно; цитируемый символ может просто
быть вставленным (например, Lda # "А" ), а также зависит от текущего набора символов.
Можно указать любое количество символьных строк.
.байт и по возрастанию являются синонимами, поэтому вы можете смешивать такие вещи, как .байт $ 43, 22 году "a персонаж
нить" и получите ожидаемый результат. Строка подчиняется текущему набору символов,
но остальные байты вставляются без изменений.
.aasc "текст 1" , "текст2", ...
Задает символьную строку, которая всегда отображается в истинном ASCII независимо от
текущий набор символов. Нравиться по возрастанию, это синоним .байт.
.слово значение1, значение2, значение3 ...
Задает строку из 16-битных слов, которая будет помещена в собранный объект в 6502
формат с прямым порядком байтов (то есть младший / старший байт). Аргументы могут быть
выражения. Можно указать любое количество слов.
.dsb длина, fillbyte
Задает блок данных; в общей сложности повторения байт заполнения будет вставлен
в собранный объект. Например, .dsb 5, $ 10 вставит пять байтов, каждый
будучи десятичным числом 16, в объект. Аргументами могут быть выражения.
.bin смещение, длина, "имя файла"
Встраивает двоичный файл без дальнейшей интерпретации, указанной в имя файла от
смещение смещение по длине . Это позволяет вставлять такие данные, как
ранее собранный объектный файл или изображение или другая структура двоичных данных,
встроен непосредственно в объект этого файла. Если равна нулю, то длина
имя файлавместо смещения используется минус смещение. Аргументами могут быть выражения.
.( Открывает новый блок для определения объема. Внутри блока все определенные метки являются локальными по отношению к этому блоку.
блок и любые подблоки, и выходят из области видимости, как только включающий блок
закрытый (т. е. с лексической областью видимости). Все метки, определенные вне блока, по-прежнему
видимый внутри него. Чтобы явно объявить глобальную метку внутри блока, поставьте перед
пометить + или перед ним & объявить это только в пределах предыдущего уровня (или
глобально, если вы только на один уровень). Допускается шестнадцать уровней охвата.
.) Закрывает блок.
.как .al .xs .xl
Актуально только в режиме 65816 (с -w опция указана). Эти псевдооперации устанавливают
аккумулятор какого размера и регистр X / Y следует использовать для будущих инструкций; .как
и .xs установить 8-битные операнды для регистров аккумулятора и индекса соответственно,
и .al и .xl установить 16-битные операнды. Эти псевдооперации специально не
автоматически выдавать сентябрь и репутация инструкции по установке указанной ширины в CPU;
установите нужные биты процессора или подумайте о создании макроса. .al и .xl
генерировать ошибки, если -w не указано
Следующие псевдооперации применяются в первую очередь к перемещаемым объектам .o65. Полное обсуждение
перемещаемого формата выходит за рамки этой страницы руководства, так как в настоящее время это формат
в потоке. Документация по предлагаемому формату v1.2 находится в doc / fileformat.txt в xa
каталог установки.
.text .данные .bss .нуль
Эти псевдооперации переключаются между различными сегментами, причем .text является фактическим кодом.
section, .data - сегмент данных, .bss - неинициализированное пространство меток для
allocation и .zero - это неинициализированное пространство нулевой страницы для выделения. В .bss
и .zero оцениваются только метки. Эти псевдооперации действительны в относительных и
абсолютные режимы.
.выровнять ценностное
Выравнивает текущий сегмент по границе байта (2, 4 или 256), как указано ценностное
(и помещает его в заголовок, когда включен относительный режим). Другие ценности порождают
ошибка.
.fopt тип, значение1, значение2, значение3, ...
Действует как .byt / .asc за исключением того, что значения встраиваются в объектный файл как
параметры файла. Аргумент напишите используется для указания параметра файла, являющегося
упоминается. Таблица этих параметров находится в перемещаемом формате файла o65.
описание. Остальные параметры интерпретируются как значения для вставки. Любой
количество значений может быть указано, а также могут быть строками.
ПРЕДПРОЦЕССОР
xa реализует препроцессор, очень похожий на препроцессор языка C. CPP(1)
и много странностей применимо к обоим. Например, как и в C, использование /* */ для комментария
разделители также поддерживаются в xa, и комментарии с двойной косой чертой //,
препроцессор также поддерживает строки продолжения, т. е. строки, заканчивающиеся обратной косой чертой (\);
затем к нему добавляется следующая строка, как если бы не было разделительной новой строки. Это тоже
обрабатывается на уровне препроцессора.
По причинам памяти и сложности, весь спектр CPP(1) синтаксис не полностью
поддерживается. В частности, определения макросов не могут быть определены вперед (т. Е. Макрос
определение может ссылаться только на ранее определенное определение макроса), за исключением макроса
функции, в которых поддерживается рекурсивное вычисление; например, чтобы #define WW AA , AA must have
уже определено. Некоторые другие директивы не поддерживаются и не являются наиболее стандартными.
предопределенные макросы, и есть другие ограничения на оценку и длину строки. Поскольку
поддерживающие xa признать, что некоторые файлы потребуют более сложной предварительной обработки, чем
встроенный препроцессор может предоставить, препроцессор примет CPP(1) -стиль
строка / имя файла / вывод флагов. Когда эти строки видны во входном файле, xa будет лечить
их как cc будет, за исключением того, что флаги игнорируются. xa не принимает файлы по стандарту
ввод для синтаксического анализа, поэтому вы должны сбросить свой CPP(1) вывод на промежуточный
временный файл, например
cc -E тест.с > test.xa
xa test.xa
Никаких специальных аргументов не требуется xa; Наличие CPP(1) выход обнаружен
автоматически.
Обратите внимание, что передача вашего файла через CPP(1) может мешать xaсобственный препроцессор
директивы. В этом случае, чтобы замаскировать директивы из CPP(1) используйте -p возможность указать
альтернативный символ вместо #, например тильда (например, -p '~' ). С этой опцией и
указан аргумент, то вместо #включают, например, вы также можете использовать ~ включить и отправлять адресату
дополнение к #включают (который также будет принят xa препроцессор, предполагая
любой выжить CPP(1)). Можно использовать любой символ, хотя откровенно патологический выбор может
приводят к забавным и неприятным сбоям во время парсинга. Вы также можете использовать эту опцию, чтобы
отложить директивы препроцессора, которые CPP(1) может интерпретироваться слишком рано, пока файл на самом деле
добирается до xa сам для обработки.
Поддерживаются следующие директивы препроцессора.
#включают "имя файла"
Вставляет содержимое файла имя файла на этой позиции. Если файл не найден,
поиск выполняется по путям, указанным в -I параметр командной строки или
переменная среды XAINPUT (см.). При вставке файл также будет проанализирован
для директив препроцессора.
# эхо комментарий
Вставляет комментарий комментарий в файл журнала ошибок, указанный с помощью -e командной строки
опцию.
#Распечатать выражение
Вычисляет значение выражения выражение и распечатывает его в файле журнала ошибок.
#define ОПРЕДЕЛИТЬ текст
Приравнивает макрос ОПРЕДЕЛИТЬ с текстом текст такой, что где бы то ни было ОПРЕДЕЛИТЬ появляется в
источник сборки, текст заменяется на его место (точно так же, как CPP(1) подойдет). В
Кроме того, #define может указывать макрофункции, такие как CPP(1) такой, что директива
" У аборигенов #define mult (а, б) ((а) * (б)) сгенерирует ожидаемый результат везде, где
выражение формы mult (а, б) появляется в источнике. Это также можно указать
в командной строке с -D вариант. Аргументы макрос-функции могут быть
рекурсивно оценивается, в отличие от других #defines; препроцессор попытается повторно
оценить любой аргумент, ссылающийся на другое определение препроцессора, до десяти раз
прежде чем жаловаться.
Следующие директивы являются условными. Если условие не выполняется, то
исходный код между директивой и ее завершением #endif удалены, а не
собран. Поддерживается до пятнадцати уровней вложенности.
#endif Закрывает условный блок.
#еще Реализует альтернативный путь для условного блока.
#ифдеф ОПРЕДЕЛИТЬ
Верно, только если макрос ОПРЕДЕЛИТЬ определяется.
#ифндеф ОПРЕДЕЛИТЬ
Противоположный; истина, только если макрос ОПРЕДЕЛИТЬ ранее не было определено.
#если выражение
Истинно, если выражение выражение оценивается как ненулевое. выражение может ссылаться
другие макросы.
#ифлузед этикетка
Истинно, если метка этикетка был использован (но не обязательно создан со значением).
Эти работает on этикетки макросы!
#ифлдеф этикетка
Истинно, если метка этикетка определено и присвоено значение. Эти работает on этикетки
макросы!
Незакрытые условные блоки в конце включаемых файлов генерируют предупреждения; незакрытый
условные блоки в конце сборки генерируют ошибку.
#ифлузед и #ифлдеф полезны для создания библиотеки на основе этикеток. Например,
вы можете использовать что-то вроде этого в коде своей библиотеки:
#ифлузед этикетка
#ифлдеф этикетка
# эхо этикетка уже определены, библиотека функция этикетка не могу be вставленный
#еще
этикетка /* код */
#endif
#endif
ОКРУЖАЮЩАЯ СРЕДА
xa использует следующие переменные среды, если они существуют:
XAINPUT
Включите путь к файлу; компоненты должны быть разделены символом ",".
ХАВЫХОД
Путь к выходному файлу.
ЗАМЕТКИ
Инструкция R65C02 ина (часто отображается вкл a) и расширение DEA (декабрь a) должен отображаться как
голый вкл и декабрь инструкции соответственно.
Метки, определяемые вперед, то есть метки, которые определяются после текущей инструкции.
обрабатывается - не может быть оптимизирован в инструкции с нулевой страницей, даже если метка заканчивается
up определяется как местоположение нулевой страницы, потому что ассемблер не знает значение
метку заранее во время первого прохода, когда вычисляется длина инструкции.
На втором проходе будет выдано предупреждение, когда инструкция, которая могла быть
оптимизированный не может быть из-за этого ограничения. (Очевидно, это не относится к
инструкции ветвления или перехода, потому что они в любом случае не оптимизируются, а те
инструкции, которые могут Важно взять 8-битный параметр всегда будет преобразован в 8-битный
количество.) Если этикетка не может быть определена иным образом перед инструкцией,
префикс обратной кавычки ` может использоваться для дальнейшей оптимизации независимо от того, где находится метка
определяется до тех пор, пока инструкция поддерживает его. Без разбору принуждение к проблеме может быть
однако чреват опасностью и не рекомендуется; чтобы препятствовать этому, ассемблер
будет жаловаться на его использование в ситуациях режима адресации, где нет двусмысленности, например
как косвенное индексирование, ветвление и т. д.
Кроме того, как дальнейшее следствие способа управления оптимизацией, мы повторяем, что ВСЕ
24-битные количества и метки, которые ссылаются на 24-битные количества в режиме 65816, ранее
заявлено или иначе, ОБЯЗАТЕЛЬНО быть предваренным @ приставка. В противном случае ассемблер будет
попытаться оптимизировать до 16 бит, что может быть нежелательно.
Используйте xa в Интернете с помощью сервисов onworks.net