Arm assembler mac os
Assembler on a Mac? Yes We Can!
A list of sample Assembly programs that demonstrate how to program using machine code instructions. Each program in this project is well self documented. Use this README.md to get started, then jump to ASSEMBLER.md to go further.
Program | Description |
---|---|
hello.s | Have a look at this first Hello World assembly code |
formatstring.s | Display a formatted string on screen |
parameters.s | It shows usage of parameters when calling a program or function |
operations.s | Sample program to debug of common instructions |
registers.s | Assembly program to show addressing of registers |
Please note that you need to have the unix as (Assembler) and ld (Linker) utilities to use the sample programs included in this project. These utilities are automatically installed via the command line developers tools included in Xcode. The easiest way to install them is to open terminal and run the ld command, if you don’t have them you should get a prompt to start install.
Use the included shell script utility asm.sh to compile, link and run assembly code. Format is:
This utility will automatically call as to compile an assembly source code into an object code program (.o). It will then call the linker ld to create an executable from the object code. As an example the following command will compile, link and run hello.s assembly code:
This will produce hello.o object code and hello executable. This last one can also be directly started from the command line:
Important Note
You may need to specify which version of Mac OS X you are using in asm.sh script :
Debug assembly code
You can use lldb to debug an executable program. For example the following command will start a debug session:
Debug Command | Description |
---|---|
b main | Set a breakpoint at the start symbol (main) of a program |
run | Run code till a breakpoint is found |
run par1 par2 | Run code using input parameters |
b 0x1f8d | Set breakpoint at line number 0x1f8d |
s | Step into instruction (i.e. step into a call statement) |
n | Step over instruction (i.e. step over a call statement) |
c | continue execution till a breakpoint is found |
q | Terminate execution and exit lldb |
register read | Show content of main registers (abbreviated re r ) |
re read esp eat | Show content of esp and tax register |
re write eax 0xF12F | Write content to tax register |
memory read 0xbffffb8c | Read content of memory address |
x 0xbffffb8c | Same as memory read , abbreviated form |
x —count 100 0xbffffb8c | Read 100 bytes from memory address 0xbffffb8c |
watch set e 0x1f67 | watch changes at memory address (breakpoint) |
gui | When entered after run show debugger in a GUI |
TIP: After entering a run command in lldb try using the gui command as well. :
Some handy shell commands
Command | Description |
---|---|
hexdump -C FileName | Hexadecimal dump of FileName. Tip: pipe using head -n10 |
gcc -S prg.c -m32 -Os | Generate assembly code from a C program |
lldb Program | Debug an executable program |
Dive deeper in Assembler by reading ASSEMBLER.md.
A continuos learning path where passion is the drive.
About
Assembler on your Mac? Yes We Can ! A quick tutorial together with a bunch of sample assembler programs for the Mac.
Источник
ARM аccемблер
Введение
Итак, для начала разберёмся что же такое ARM. Википедия дает такое определение:
Архитектура ARM (Advanced RISC Machine, Acorn RISC Machine, усовершенствованная RISC-машина) — семейство лицензируемых 32-битных и 64-битных микропроцессорных ядер разработки компании ARM Limited. Компания занимается исключительно разработкой ядер и инструментов для них (компиляторы, средства отладки и т. п.), зарабатывая на лицензировании архитектуры сторонним производителям.
Если кто не знает, сейчас большая часть мобильных устройств, планшетов разработаны именно на этой архитектуре процессоров. Основным преимуществом данного семейства является низкое энергопотребление, благодаря чему он часто используется в различных встроенных системах. Архитектура развивалась с течением времени, и начиная с ARMv7 были определены 3 профиля: ‘A’(application) — приложения, ‘R’(real time) — в реальном времени,’M’(microcontroller) — микроконтроллер. Историю разработки этой технологии и другие интересный данные вы можете прочитать в Википедии или погуглив в интернете. ARM поддерживает разные режимы работы (Thumb и ARM, кроме того в последние время появился Thumb-2, являющийся смесью ARM и Thumb). В данной статье рассмотрим собственно режим ARM, в котором исполняется 32-битный набор команд.
Каждый ARM процессор создан из следующих блоков:
- 37 регистров (из которых видимых при разработке только 17)
- Арифметико-логи́ческое устройство (АЛУ) — выполняет арифметические и логические задачи
- Barrel shifter — устройство, созданное для перемещения блоков данных на определенное количество бит
- The CP15 — специальная система, контроллирующая ARM сопроцессоры
- Декодер инструкций — занимается преобразованием инструкции в последовательность микроопераций
Это не все составляющие ARM, но углубление в дебри построения процессоров не входит в тему данной статьи.
Конвейерное исполнение (Pipeline execution)
В ARM процессорах используется 3-стадийный конвейер (начиная с ARM8 был реализова 5-стадийный конвейер). Рассмотрим простой конвейер на примере процессора ARM7TDMI. Исполнение каждой инструкции состоит из трёх ступеней:
1. Этап выборки (F)
На этом этапе инструкции поступают из ОЗУ в конвейер процессора.
2. Этап декодирования (D)
Инструкции декодируются и распознаётся их тип.
3. Этап исполнения (E)
Данные поступают в ALU и исполняются и полученное значение записывается в заданный регистр.
Но при разработке надо учитывать, что, есть инструкции, которые используют несколько циклов исполнения, например, load(LDR) или store. В таком случае этап исполнения (E) разделяется на этапы (E1, E2, E3. ).
Условное выполнение
Основы синтаксиса ARM ассемблера
Имена регистров
Разрешены следующие имена регистров:
1.r0-r15
3.v1-v8 (переменные регистры, с r4 по r11)
4.sb and SB (статический регистр, r9)
10.pc and PC (программный счетчик, r15).
Переменные и костанты
В ARM ассемблере, как и любом (практически) другом языке программирования могут использоваться переменные и константы. Они разделяются на такие типы:
- Числовые
- Логические
- Строковые
Числовые переменные инициализируются так:
a SETA 100; создается числовая переменная «a» с значением 100.
Строковые переменные:
improb SETS «literal»; создается переменная improb с значение «literal». ВНИМАНИЕ! Значение переменной не может превышать 5120 символов.
В логических переменных соответственно используются значения TRUE и FALSE.
Примеры инструкций ARM ассемблера
В данной таблице я собрал основные инструкции, которая потребуется для дальнейшей разработки (на самом базовом этапе:):
Название | Синтаксис | Применение |
ADD (добавление) | ADD r0, r1, r2 | r0 = r1 + r2 |
SUB (вычитание) | SUB r0, r1, r2 | r0 = r1 — r2 |
RSB (обратное вычитание) | RSB r0, r1, #10 | r0 = 10 — r1 |
MUL (умножение) | MUL r0, r1, r2 | r0 = r1 * r2 |
MOV | MOV r0, r1 | r0 = r1 |
ORR( логическая операция) | ORR r0, r1, r2 | r0 = r1 | r2 |
TEQ | TEQ r0, r1 | r0 == r1 |
LDR (загрузка) | LDR r4, [r5] | r4 = *r5 |
STR | STR r4, [r5] | *r5 = r4 |
ADR | ADR r3, a | a — переменная. r3 = &a |
Чтобы закрепить использование основных инструкций давайте напишем несколько простых примеров, но сначала нам понадобится arm toolchain. Я работаю в Linux поэтому выбрал: frank.harvard.edu/
coldwell/toolchain (arm-unknown-linux-gnu toolchain). Ставится он проще простого, как и любая другая программа на Linux. В моем случае (Russian Fedora) понадобилось только установить rpm пакеты с сайта.
Теперь пришло время написать простейший пример. Программа будет абсолютно бесполезной, но главное, что будет работать:) Вот код, который я вам предлагаю:
Компилируем программу до получения .bin файла:
(код в файле arm.s, а toolchain в моем случае лежит в директории /usr/arm/bin/)
Если все прошло успешно, у вас будет 3 файла: arm.s (собственно код), arm.o, arm.elf, arm.bin (собственно исполняемая программа). Для того, чтобы проверить работу программы не обязательно иметь собственное arm устройство. Достаточно установить QEMU. Для справки:
QEMU — свободная программа с открытым исходным кодом для эмуляции аппаратного обеспечения различных платформ.
Включает в себя эмуляцию процессоров Intel x86 и устройств ввода-вывода. Может эмулировать 80386, 80486, Pentium, Pentium Pro, AMD64 и другие x86-совместимые процессоры; PowerPC, ARM, MIPS, SPARC, SPARC64, m68k — лишь частично.
Работает на Syllable, FreeBSD, FreeDOS, Linux, Windows 9x, Windows 2000, Mac OS X, QNX, Android и др.
Итак, для эмуляции arm понадобится qemu-system-arm. Этот пакет есть в yum, так что тем, у кого Fedora, можно не заморачиваться и просто выполнить комманду:
yum install qemu-system-arm
Далее надо запустить эмулятор ARM, так, чтобы он выполнил нашу программу arm.bin. Для этого создадим файл flash.bin, который будет флэш памятью для QEMU. Сделать это очень просто:
Теперь грузим QEMU с полученой flash памятью:
Источник
Редактор ассемблера для ARM микроконтроллеров для компилятора gnu as. Старт
Итак, ассемблер вас все таки заинтересовал, может быть для написания каких то программ для cortex-m0 с целью уместить побольше, а может быть для написания каких то модулей для программ на другом языке, вариантов где это можно сделать у вас будет просто огромное количество — все известные среды поддерживают такую возможность.
Правда спустя какое-то время, вы поймете всю сложность написания кода в таких редакторах, просто потому что ничего более подсветки команд такие редакторы как правило не предлагают, ну еще возможно подсказки текстовые при вводе, причем подсказки именно из набираемого текста, чаще вообще бесполезные, потому как не учитывают контекст совершенно, плюсом идет сложность работы если проект подразумевает еще и несколько файлов — вот тогда и приходит понимание того что редактор для ассемблера должен быть все таки другим.
Если у вас такой опыт был — то вы уже понимаете о чем я пишу и что меня в итоге побудило к написанию редактора более приспособленного к реальным нуждам.
добавлено по пожеланиям из комментариев: платформа запуска приложения Windows
Итак, сразу закрепим:
то что я написал является редактором для себя, и реализовывалась та или иная функциональность именно из тех идей которые я для себя выделил
я с удовольствием буду писать на ассемблере в любом другом редакторе, как только его найду, если он будет иметь большую чем в реализованном мной редакторе функциональность
поскольку редактор написан самостоятельно, то эту самую функциональность я еще дополняю, расширяю, изменяю, и даже удаляю
проект не является закрытым, поэтому буду рад если кто то ко мне присоединится, интересны как люди могущие предложить какую то новую функциональность, так и могущих помогать мне дополнять, если у кого есть соображения по дизайну (и кто то знает больше чем просто слова дизайн и юзабилити) и имеет желание изменить что то к лучшему — то тоже буду рад, и так далее. видео например не умею делать красивое 🙂 и это тоже иногда хочется, но кроме записи с экрана пока ничего нет.
Итак, немного о возможностях редактора:
подсветка вводимого кода, и когда я говорю подсветка — я имею ввиду подсветку команд ассемблера с полным разбором текста команды, теперь вы сможете еще на этапе ввода команды увидеть грубые ошибки, я не видел ни одного редактора из обычно используемых где это было бы реализовано, например вы просто не сможете ввести аргументы команды если такой формат не предусмотрен, здесь ошибки нет
а вот здесь написана какая то чушь
работа с символами проекта
редактор обрабатывает проект целиком, таким образом вы всегда можете выбрать (или просто посмотреть) доступные символы объявленные глобально, в текущем или включаемом файле, если использованы библиотечные файлы определений (либо вы придерживаетесь определенных правил) — то символы могут быть сгруппированы в виде дерева
Причем вы будете видеть именно те символы которые доступны из текущего местоположения, а не все подряд, ну за некоторым исключением (например не обрабатываются пока символы из файла сборки)
возможность задавать варианты значений для того или иного объявленного символа
это удобно при использовании каких то библиотек, да и при написании собственного кода когда надо заранее определить возможные значения
например уже сейчас вы можете включать или выключать необходимые GPIO в модуле rcc_ahb1enr_gpio_set
по нажатию кнопки «F4 Изменить», или из контекстного меню
и видим все возможные варианты значений настройки
Да, да, уже слышу из комментов: да поставить 1 или 0 вообще то руками проще, согласен, но возможны ведь не только 1 или ноль, но и более сложные варианты, например настраиваем пин GPIO, и нужно поменять MODER пина, что мы делаем в этом случае — ну хорошо конечно если мы уже знаем все варианты настроек, а если нет ? тогда открываем определение MODER и смотрим все варианты значений. потом копируем нужное, и вернувшись назад вставляем новое значение, так ?
Меня это не устроило, так что опять «F4 Изменить» или из контекстного меню:
По-моему это удобно, редактирование может и не такое как в уже ставшим привычным кубе, с другой стороны много удобнее чем переходить из файла в файл чтобы найти нужное значение для обычных редакторов или выбор их всех возможных текстовых строк при наборе:
возможность задания описания для модулей или подпрограмм
опять сделано для того чтобы экономить время,
простое добавление необходимых файлов и модулей в ваш проект
Естественно вы можете добавлять и свой код в библиотеку, мне это показалось важным, так как надоело собирать нужные части по разным программам в исходниках, неудобно, да и зачастую код при использовании изменяешь, поэтому теперь можно добавить какую то базу и потом при необходимости ее править в своем проекте
реализована компиляция проекта прямо из среды
Особых изысков нет, просто компиляция, сборка, и генерация служебных файлов
реализована прошивка вашего устройства при помощи ST-Link или J-Link (у меня китайцы, второй это перепрошитый ST-Link V2)
J-Link через OpenOCD сервер, к сожалению пока реализовано только с учетом замены нативной dll от segger
отладка при помощи OpenOCD
Писать программу на любом языке и не иметь возможности ее исполнять в режиме отладки очень неудобно, поэтому сделал небольшую функциональность и для этого, это достаточно новая функциональность поэтому реализованы еще не все задумки.
Исполняемый код подсвечивается и в скомпилированном тексте программы:
Можно устанавливать точки останова, исполнять по шагам, есть исполнение подпрограмм за один шаг:
Есть возможность просматривать регистры настройки устройств:
Работа над wathpoint пока отложена, тоже буду делать:
реализован импорт шрифта из MCU Font Generator, вернее из файлов которые он генерит для AVR преобразовываю в стандарт gnu as, ну и формат упрощаю
ну и заодно сделан импорт бинарных файлов в прошивку, есть много способов добавить, это просто один из.
В общем функциональность зачастую добавляется когда в ней возникает необходимость.
В редакторе реализован простейший форматер текста:
Работает не идеально в автоматическом режиме, но готовый текст форматирует приводя более менее к приличному виду.
Обсуждать, предлагать, сообщать о глюках, и прочее в группе ВКонтакте или в Телеграмм. Там же можно скачать архив с редактором, он находится в закрепленном сообщении.
Пока в редакторе активно описывается STM32F4, но планируется описание и других микроконтроллеров (как только найдутся те кто их использует и готов помочь с описанием периферии).
Ну и на ютуб канале (плейлист GNU ARM ASM EDITOR) можно посмотреть видео о той или иной функциональности редактора, правда там пока обучающих видео нет, хотя планируется.
Если вам все еще интересно подписывайтесь, дальше пойдут статьи о том с чего начать создание проекта, помнится раньше писали мигалку в блокноте, теперь напишем ее в редакторе.
Источник