Альтернативный компилятор ассемблера х86. Программист онлайн

Все началось с того, что где-то в интернет-кафе за границей мне срочно понадобилось скомпилировать крохотный исходник. На общественном компьютере сильно не хотелось заморачиваться с установкой компилятора, поэтому я на удачу попробовал найти сервис, который скомпилировал бы исходник онлайн. И с этого момента началось.

Компилятор онлайн

Через пару минут я уже имел на руках скомпилированный бинарник. Помог сервис некоего турецкого программиста, который когда-то озадачился подобной проблемой и реализовал на своем сайте веб-интерфейс для доступа к компилятору. А чтобы пользоваться было еще удобнее, прикрутил компонент для редактирования кода. Подсветка синтаксиса, нумерация строк и даже автодополнения команд - почти маленькая IDE. Собирается в один исходник в один клик или по хоткею Ctrl-F7, после чего сервис отдает готовый бинарник. Если во время сборки произошли ошибки, то сообщения компилятора отобразятся в отдельной панели. Адрес для такого удачного сервиса на редкость странный:

cmpe150-1.cmpe.boun.edu.tr/phpccompiler/

login.php, причем сайт откроется только в Internet Explorer. Другое серьезное ограничение - отсутствие поддержки C++. А куда же сейчас без нее? Поэтому когда зашла речь о компиляции сорца С++, пришлось отыскать замену. К счастью, разработчики прогрессивного компилятора Comeau C/C++ на официальном сайте сделали фронтенд, который выполнен как раз в виде веб-приложения (www.comeaucomputing.com/tryitout).

Допускается выбор различных режимов компиляции, версии Comeau, а также любые другие параметры, которые ты мог передать сборщику через командную строку. Кстати говоря, последние релизы Comeau уже поддерживают большинство расширений C++0x (обновленный и модернизировнный стандарт С++), поддержка которого появилась сейчас в Visual Studio 2010.

«Зачем вообще привязываться к какому-то конкретному языку», - подумали ребята из ideone (ideone.com) и реализовали универсальный компилятор в 40 различных языков. Помимо С/C++ здесь поддерживаются еще и Java, C#, Pascal, Visual Basic .NET, все скриптовые языки, и даже ассемблер. Важно только уложиться в ограничения: 10 секунд на компиляцию, 5 секунд на выполнение, 256 мегабайт памяти. Помимо этого, программа не сможет обращаться в Сеть и работать с файлами. Некоторых ограничений удается избежать, собрав программу с помощью другой онлайт тулзы - codepad (codepad.org).

HEX и PE-редакторы

Теперь обратная ситуция - бинарник есть, а исходника нет. Как поправить в нем пару байтов? Честно говоря, толкового HEX-редактора в онлайне я в какой-то момент найти не смог и лишь потом случайно наткнулся на него на одном из форумов, где разработчик делился ссылкой на свой текущий проект и интересовался, а стоит ли ему вообще его продолжать. Беглого взгляда на HexPaste (hexpaste.com) было достаточно, чтобы закричать: «Стоит!».

Скажи, вот в каком оффлайн HEX-редакторе есть возможность коллективной работы нескольких людей? А здесь это возможно.

Онлайн, облако, IDE

В этот перечень я намеренно не стал включать инструменты для общения разработчиков внутри команды, а также планирования проектов. Их очень много, они разные и чаще всего платные. Я же уверен, что в большинстве случаев можно не строить умные диаграммы и графики, а воспользоваться простой системой для управления задачами вроде Teamer’а (www.teamer.ru). В любом случае у нас есть отдельный повод поговорить об инструментах планирования времени и управления задачами. Если тебе интересны способы увеличения эффективности, пиши нам! 🙂

Info

  • Эмуляция Pythonинтерпретатора, причем реализованная на Silverlight, доступна на сайте Try Python (www.trypython.org). А благодаря Utility Mill (utilitymill.com), из Python-скрипта можно легко сделать веб-сервис.
  • Зашить файлы на FTP-сервер также легко через веб. Для этого пригодится клиент net2ftp (www.net2ftp.com). Специально для PHP есть еще одна добротная IDE в бразуере - это phpAnyware ().

Среда поддерживает загрузку файлов FTP, имеет подсветку синтаксиса и в будущем обещает автодополнение команд.

Следуя пожеланиям читателей, мы будем вести разработку проектов в более современной и удобной программе: Atmel Studio 6.

У нее есть один существенный недостаток, который не позволяет воспользоваться этой программой на относительно слабых машинах. Это программа очень ресурсоемкая и она будет сильно тормозить на слабых компьютерах с двухъядерным процессором младших моделей и 2 гигабайтами ОЗУ. Сразу скажу, владельцы старых моделей компьютеров не будут забыты и для них будут выпущены обзоры по программам WinAVR и AVR Studio 4, чтобы они не чувствовали себя в чем-то ущемленными. Эти программы очень слабо нагружают процессор и требуют намного меньше памяти для работы.

Итак, перейдем к делу. Данная программа является полностью бесплатной и скачать её можно как с официального сайта Atmel, так и с торрент трекера, например Rutracker.org. После установки и запуска программы открывается окно приветствия и мастера создания проектов. Окно приветствия и мастер создания проектов мы закрываем. В работе эта функция совершенно бесполезна.

В результате остается одна рабочая область (кликните для увеличения картинки):


Для того, чтобы создать прошивку, то есть тот самый HEX файл, мы должны написать код, скомпилировать его и “собрать” проект. После этого у нас в папке с проектом, появится нужный нам файл с расширением *.HEX. Давайте разберем, как это делается на практике. Погнали!

Для создания проекта мы нажимаем в левом верхнем углу кнопки File => New => Project :


И видим следующее окно:


Здесь нам нужно выбрать СС++ и GCC C Executable Project:


Не спешите нажимать «ОК» и закрывать окно. В графе «Name» мы видим, что программа подставила нам имя проекта автоматом. В данном случае это GccApplication1. Также мы можем выбрать папку, в которую мы сохраняем проект:


Так как имя файла мне не нравится, то меняем его на Studio_6_Lesson_ 1. Путь для сохранения проекта я оставил по умолчанию. В данном случае в папке 6.2 у нас создастся папка с названием Studio_6_Lesson_ 1. В ней и будут находиться все необходимые нам файлы, имеющие отношение к нашему проекту:


Ну а теперь жмем ОК. Что мы видим дальше? А дальше открывается следующее окно:


Так как мы с вами договорились использовать МК Tiny 2313, то нам нужно выбрать именно эту модель. Для этого выбираем семейство Tiny, 8-bit.


Ну а потом выбираем наш МК Attiny 2313:


Здесь же можно вкратце ознакомиться с характеристиками на данную модель МК, узнать объем Flash памяти, ОЗУ, и EEPROM памяти. Также здесь можно скачать даташит на данную модель МК и ознакомиться со всеми характеристиками этого микроконтроллера.

После того как выбрали, жмем ОК. Перед нами открывается рабочее окно программы (для увеличения кликните мышкой)

А вот и самое главное окно:


Как мы видим, здесь уже автоматически что-то уже сгенерировалось. Перейдем непосредственно к коду.

Что же мы видим здесь?

Строки 1…6 — это у нас комментарии. Все комментарии бывают выделены зеленым цветом в отличие от кода программы, переменных, функций, и т. д. В комментариях мы видим название исходника на СИ нашего проекта: файл Studio_6_Lesson_ 1.с. В нем хранится наш код и его мы можем, если хотим, посмотреть и уточниться, чтобы не открывать каждый раз тяжелую для запуска студию. Открывать в том же блокноте Wordpad.

Итак, давайте разберем, что же обозначают все остальные строчки. Читаем комментарий, идущий после кода в каждой строчке. Комментарии у нас отделяются от кода, двумя символами знака деления(//). Правильно же это называется прямой двойной слэш.

Что же мы видим? Смотрим строку под номером 9. С нее начинается сама программа:

#include //Подключаем библиотеку аппаратных описаний МК

Эту строчка должна присутствовать абсолютно в любом проекте на любом МК AVR Mega и Tiny. Смысл этих команд я написал в комментариях, идущих после команды.


Здесь я хочу сделать небольшое отступление и разобрать отличия Atmel Studio 6.2 от той же WinAVR. В шестой студии есть очень удобная функция. Называется она автоподставления команд . Проявляется это в том, что как только мы начали набирать команду известную Студии, она сама предложит нам все возможные варианты команд на выбор, какие только есть в её памяти по нескольким первым буквам.

Нам достаточно нажать лишь клавиши ТАВ или ENTER и команда у нас подставится автоматически.

Разбираем строчку №10


Этой строчкой мы объявлем библиотеку задержек

#define F_CPU 8000000UL //Устанавливаем частоту для компилятора

Смысл, думаю, ясен из комментария. Этой командой мы выбираем на какой частоте у нас должен работать, условно говоря, проект, и какую частоту нам нужно выставить с помощью фьюзов для корректной работы прошивки.


#include //Подключаем библиотеку задержек

Этой командой мы “говорим” МК, что у нас в программе будет использоваться функция задержек работы микроконтроллера, или иначе говоря, режима холостой работы. В это время не будут выполняться никакие другие действия. На какое-то заданное время, МК, условно говоря, для нас как-бы зависнет.


После нее, собственно, и начинается наша основная программа. Мы видим в строке 14 фигурную скобку, открывающую место под программу, и такую же, только повернутую в другую сторону скобку, закрывающую место под программу уже в строке 19. Эти скобки предназначены для основного тела программы. Также мы видим соединяющую их вертикальную черту, показывающую нам, что они одно целое.

Также можно увидеть и фигурные скобки для while . Открывающая скобка находится в строке 16, а закрывающая в строке 18.

Давайте напишем программу для мигания одним светодиодом. Для этого добавляем строчки:


PORTB=0b0000000 0; //Притягиваем все 8 выводов порта В к 0

Восемь цифр означают, что у нас 8 выводов порта В. Крайний правый — это В0, крайний левый — В7. Это обозначение означает 8 нулей после 0b, что по умолчанию у нас на всех выводах-ножках порта В установлен логический ноль, или говоря по-другому, они притянуты к нулю. Если говорить очень упрощенно, то это все равно, что они внутри МК соединены с землей устройства.

DDRB=0b11111111 ; // Конфигурируем все выводы порта В на выход

Единички у нас после этой команды означают, что все ножки у нас работают на выход, а не на вход. Иначе говоря, в этом режиме с их помощью мы можем управлять чем-либо. Если бы там были нули, то мы напротив могли бы снимать информацию с них, например, опрашивая кнопку на нажатие.


PORTB=0b0000000 1; //Подаем на порт В0 логическую единицу (зажигаем светодиод)

Итак мы видим, что крайняя справа у нас стоит единичка. Как мы помним из выше сказанного, это значит что мы на порт В0 вывели 1, или по другому говоря, на этом выводе у нас сейчас +5 вольт.

Эта команда означает, что процессор должен крутить у нас холостой цикл, в течение пол секунды, или иначе говоря, как бы зависнуть на полсекунды для нас.

Что означают ниже приведенные две строчки кода, вы наверное уже догадались сами:

PORTB=0b0000000 0; //Подаем на порт В0 логический ноль (гасим светодиод)

_delay_ms(500); //Ждем 500 миллисекунд (0.5 секунды) Мы подаем ноль на ножку В0 и затем ждем пол секунды.

Но такая программа у нас длилась бы всего секунду, а что потом? А потом нам нужно вернуться к началу нашего бесконечного цикла, который мы объявляем командой While:


while(1) //Начинаем бесконечный цикл

Единица в скобках как раз и означает, что мы будем крутить этот цикл бесконечно. Другими словами, мы повторяем программу, заключенную между фигурными скобками While бесконечное количество раз.

И наконец, в конце нашей программы мы видим две фигурные скобки, по одной на каждый цикл программы, основной и бесконечный через While, читаем комментарий к последней скобке:

} //Возвращаемся к началу выполняемого тела программы, к строке 13

Уфф))… программа вроде бы написана, но как скормить этот код микроконтроллеру? Он же не понимает код, написанный в понятных нам словах и командах? А для этого нам нужно сначала скомпилировать прошивку. Делается это следующим образом.
Кликаем Build=>Compile и прошивка у нас будет скомпилирована.


Жмем Build=>Build Studio_6_Lesson_ 1 и считаем количество ошибок)), а они при самостоятельном написании первой программы скорее всего будут у начинающих кодеров.


Внизу под окном для написания кода есть окошко. В нем бегут какие-то непонятные для вас слова и строчки. В данный момент нам это не так важно. Важна только последняя итоговая строчка:


Она означает, что в нашем проекте Студия ошибок не сумела найти. Но это не означает, что ваша прошивка автоматом будет работать, как вы рассчитывали, Студия просто проверила код на соответствие основным правилам написания кода и чем смогла — помогла.

Итак где же — где же наш долгожданный HEX файл, который нам уже не терпится прошить в наш микроконтроллер)? Проще всего открыть папку с нашим проектом, в которой и будет находиться наша прошивка. Жмем File=>Open=>File и попадаем в папку с нашим проектом.


В той папке, где лежит проект, у нас находится исходник на СИ


Все, теперь этот файл можно скармливать как любому программатору для МК AVR, так и программе Proteus, если вы вдруг захотите перед сборкой конкретного устройства посмотреть, как это будет выглядеть в эмуляторе. Работу в эмуляторе Proteus можно прочитать в этой статье.

2

Я пытаюсь понять файл HEX, который я скомпилировал с помощью Microchip MPLAB X IDE , используя Microchip MPLAB XC16 Compiler .

Что касается MCU, я нацелен на PIC24EP512GU814. Однако сфера применения этого вопроса должна, по крайней мере, применяться ко всем микроконтроллерам PIC24.

Для компиляции примера HEX ниже, во время работы мастера "New Project", я выбрал Образцы> Microchip закладные> PIC24 C Шаблон и выбрал конфигурацию XC16_24EP512GU814 .

1. :02 0000 04 0000 fa 2. :08 0000 00 0002040000000000 f2 3. :02 0000 04 0000 fa 4. :10 0008 00 92 5. :10 0018 00 42

Рассмотрим линии 4 и 5. Первое поле правильно подсчитывает 0х10 (16) байт в поле данных. Однако второе поле, которое обозначает местоположение в памяти, перескакивает от 0x0008 до 0x0018 или 0x0010 (16) позиций.

Из моей интерпретации это означает, что этот конкретный HEX-файл является 8-битным, а не 16-битным, поскольку каждая позиция занята одним байтом.

  • Есть ли способ сделать вывод компилятора 16-битным файлом?
  • Этот файл еще действителен для 16-битного MCU? Как я могу интерпретировать файл HEX, чтобы я мог вручную запустить MCU?
  • 3 ответа
  • Сортировка:

    Активность

2

Файлы Intel HEX всегда обращаются к байтам. Это не означает, что они не могут обрабатывать информацию для других размеров слов, только чтобы существовало соглашение о том, как эти слова сопоставляются с байтами файла HEX.

Как и со всеми другими адресами, не адресованными байту (PIC 10, 12 и 16), адреса удваиваются в HEX-файле. Программное обеспечение программиста PIC знает это и соответственно интерпретирует адреса файлов HEX. Это, конечно, все хорошо задокументировано в спецификации программирования для любой части, которую вы хотите запрограммировать.

Вы говорите, что хотите создать своего собственного программиста. Это прекрасно, если вы понимаете, что это займет пути больше времени и разочарования, чем просто получение известного рабочего. Если точка - это опыт и обучение созданию собственного, то хорошо, но в противном случае пойти купить его.

Если вы действительно хотите сделать свой собственный, вы должны посмотреть на код для моих программистов PIC. Все хост-код и прошивка открыты и доступны в выпуске программного обеспечения для разработки по адресу http://www.embedinc.com/picprg/sw.htm .Просмотрев исходный код хоста, вы можете увидеть, как существуют флажки, указывающие, удваиваются ли адреса файлов HEX для разных частей памяти ПИК.

Если вы хотите, чтобы ваш программист был совместим с моим PIC programmers protocol , вы можете использовать все мои инструменты на стороне хоста. Это может быть очень полезно при создании вашей системы, так как вы знаете рабочий код с другой стороны. Спецификация протокола может сначала выглядеть пугающе, но внимательно посмотрите, и вы увидите, что многое из этого необязательно, особенно если вы планируете поддерживать только один ПОС.

0

Я подошел близко к покупке Пикета. Однако я не хочу привязываться к одному производителю. У меня есть другие проекты, которые могут или не могут использовать чипы Atmel. Вместо того, чтобы покупать нового программиста для каждого производителя, я мог бы также научиться самому это делать. Я также считаю это обогатительным опытом. - Daniel 10 ноя. 12 2012-11-10 15:02:17

3

Файлы Intel HEX всегда определяют байты, а адреса в файле измеряются в байтах. Это просто удобный формат, используемый для передачи двоичных данных между вашим компоновщиком и вашим программным обеспечением. Это зависит от программного обеспечения, которое вы используете для интерпретации данных и его адресов, и корректно вставляете их в ПИК.

0

Я понимаю, что программное обеспечение для программирования должно интерпретировать файл HEX, однако, мой текущий проект, чтобы сделать свое собственное программное обеспечение для программирования. Я использую Arduino для взаимодействия с MCU. Пока у меня есть прошивка Arduino и графическая оболочка. Все, что мне сейчас не хватает, это интерпретировать HEX-файл, чтобы я мог отправить правильную информацию в Arduino. Я знаю о других проектах Arduino-> PIC, но ни один из них не совместим с PIC24. -

Альтернативный компилятор ассемблера для х86. Ассемблер написан сам на себе имеет очень простой синтаксис. Позволяет создавать.com файл для ДОС. Поддерживает 32 разрядные режимы адресации и данных. Доступен вместе с исходным кодом.

Описание ассемблера.

  • Ассемблер работает из командной строки. Входной файл должен иметь любое имя с расширением:
    • .xxx или любым другим - значения не имеет, главное чтобы оно было

    Запуск на компиляцию:asm filename.ext. Результат - сообщение об ошибке в строке с № или filename.com / filename.obj

  • Ассемблер создает только*.com файлы, *.exe не созжаются. Конечно.com файл имеет ограничение 64 кб. кода, однако вряд ли кто-нибудь напишет на ассемблере больше. Т.к. создаются только*.com файлы не надо думать о сегментах. Нет у ассемблера и компоновщика. Он просто не нужен.
  • Ассемблер позволяет создавать модули*.obj , которые потом можно внедрять в код программ, как внешние подключаемые модули – подпрограммы.
  • Команды можно записывать в строчку разделяя их";"
  • Разделительные пробелы между командами и операндами вставлятьНЕ обязательно. Система команд х86 позволяет интерпретировать их и без пробелов.
  • Поскольку командаMOV встречается в программах на ассемблере наиболее часто ее имя писать не обязательно.
  • Регистр не имеет значения. Компилятор одинаково интерпретирует строки

    MOV AH,09
    movah,9
    aH,9

  • Ассемблер понимает 32 битные режимы адресации и автоматически вставляет префискы 32 битного адреса и данных, 66 и 67, когда это необходимо
  • Cистемa сообщения об ошибках довольно слабая. Сообщениеошибка в строке N следует понимать, какошибка в строке N +/- 1.
  • Команды математического сопроцессораНЕ поддерживаются .
  • * Коментарии вставляются между парными*
  • Основными синтаксическими элементами являются символы"=" и " () "
    • =Label= Вводит меку адреса.
    • (Label) вставляет значение адреса в код.

    Метки чувствительны к регистру.

Дальше рассмотрим пример HelloWorld .

* Кстати комментарии вставляются между парными звездочками
Пример1 "Hello World" выводит на экран надпись.*

JMPS(S)
=A1= "Hello World !"
=A2= 0A
=S= AX,B800;ES,AX;AX,3;INT10
CX,(A2-A1);SI,(A1);DI,500
AH,[(A2)]
=L= LODSB;STOSW;LOOP(L)
RET

Первая строка - это короткий переход к началу программы. Ассемблер располагает код и данные именно в том порядке, в котором вы их расположили в тексте.

JMP - кодирует длинный переход в пределах сегмента.
JMPS - короткий +/- 127 байт.
Со второй строкой все понятно. Третья строка:
По адресу (А2) в памяти ЭВМ размещается байт равный 0А.
Т.е.
Хотите зарезервировать в памяти байт - пищите так:
=vmode= 00 или =adr= 12
Надо выделить два байта пишите:
=X= 0000 или wo0
или
=Y=
wo something for example rd ptr 1234

Есть три ключевых слова определяющих размер.

  • by- BYTE (8)
  • wo - WORD (16)
  • dw - DWORD (32)

ассемблер проигнорирует все что встретит между этими буквами и первой цифрой.
Нужен массив из двойных слов - пожалуйста:
=array= dw0;12345678;01234;dw12;...
Желаете иметь таблицу адресов чего-нибудь - no problem:
=mytable= (adr1);(adr2);(adr3);dword(adr4)...
C адресами возможны следующие манипуляции:
CX,(A2-A1) * В CX получается длина строки(см пример)*
jmps (adr)+2;
mov ,(adr3-adr4)-5
В 386 процессоре появились команды длинного условного перехода. Отличаются они от коротких так:
JZ (adr) - короткий
JZ
_N (adr) - длинный.
Префиксы "66" и "67" вставляются автоматически.
Префиксы сегментов надо использовать в следующем виде:
ES:
LODSB
или
ES:;LODSB
SS:;MOVAX,}