Имитирующий код ARM

Я хотел бы имитировать код ARM. Например, я хочу запустить такой код:

MOV    R0, #5
ADD    R0, R0, #1
//somehow output R0

и он выведет 6 на некоторое программное обеспечение на моем Ubuntu. Возможно ли это?

10 ответов


Кейл МДК смогите быть использовано для того чтобы сымитировать коды рукоятки. Он обеспечивает Моделирования И Отладки перспектива которую можно использовать для того чтобы зондировать набор регистра руки, содержание памяти, ЕТК...

MDK-Lite оценочная версия доступна бесплатно для максимального размера кода 32KB.

Linux версия MDK недоступна. Но Keil MDK отлично работает над вина в Ubuntu.


установка Keil uVision MDK на Вино:

Шаг 1: Установите wine на Ubuntu

откройте терминал и введите:

sudo apt-get install wine

Шаг 2: Скачать Кейл МДК.

Шаг 3: Установите MDK

Правой Кнопкой Мыши на MDK исполняемый файл и выбираем " Открыть С Помощью Wine Windows Program Loader" выбор.

Шаг 4: вызовите Keil uVision MDK на Ubuntu

откройте терминал и введите:

wine ~/.wine/drive_c/Keil/UV4/Uv4.exe

Шаг 5: Установите Flash Magic (Необязательно)

Flash Magic-это инструмент, используемый для загрузки программного обеспечения для плат Keil. Скачать Flash Magic Software и установить его на вино (см. предыдущие шаги).

создайте ссылку COM1 на последовательный порт. Откройте терминал и тип:

ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1

создание и отладка проекта Keil uVision MDK:

Шаг 1: создайте проект Keil UVision для цели ARM7.

В Панели инструментов Keil UVision выберите Проект - > Новый Проект.

перейдите в папку, где вы хотите создать этот проект.

введите имя проекта и нажмите кнопку сохранить.

выберите ARM -- > ARM7(маленький С обратным порядком байтов) как устройство для мишени. нажимать OK.

Шаг 2: Создайте исходный файл сборки для целевой

В Панели инструментов Keil UVision выберите Файл --> Новая. Добавьте следующий код во вновь созданный файл:

    AREA text, code, readonly
    ENTRY

    MOV    R0, #5
    ADD    R0, R0, #1

    END

укажите tab-space перед каждым оператором сборки, как это сделано выше. Сохраните файл с помощью '.s' создать элемент или F7 для компиляции исходного файла.

Шаг 5: имитация / отладка приложения

В Панели инструментов Keil UVision выберите Debug--> Start / Stop Debug Session или Сочетание Клавиш Ctrl + Клавишу F5.

перспектива отладки открывается с видом регистра слева, видом кода в центре, видом памяти справа внизу, так далее...

enter image description here

используйте клавиши отладки для выполнения кода:

enter image description here

наблюдать вид регистра в конце выполнения программы:

enter image description here

В Панели инструментов Keil UVision выберите Debug--> Start / Stop Debug Session или Сочетание Клавиш Ctrl + Клавишу F5 выйти из перспективы отладки.


Если вы создадите его в фактический исполняемый файл, вы можете использовать QEMU эмулятор ARM для его запуска.


вы можете запустить код arm через QEMU, который является эмулятором, но я не думаю, что вы можете выводить непосредственно на другую часть программного обеспечения, потому что QEMU также является программным обеспечением, но вы можете использовать что-то вроде общей памяти или даже файла (предупреждение параллельный доступ к файлу может потребовать мьютекса) для передачи результатов из эмулятора в программное обеспечение хоста и обратно, даже если это может быть немного медленным


эта статья дает пошаговое введение в использование QEMU для моделирования кода baremetal ARM: http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/

конечно, вам не нужно заботиться о c вещи и может разместить сборку непосредственно в запуске.s


я думаю, что вы ищете способ printf значение, возвращаемое функцией сборки ARM из программы на языке C. Вы можете сделать это с помощью симулятора командной строки arm-elf-run доступно с arm-elf-gcc тулчейна. Вы можете скачать toolchain из http://www.gnuarm.com/bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4_x86-64.деготь.bz2. (Просто распакуйте архив в какую-нибудь папку и при необходимости добавьте <path>/gunarm-4.0.2/bin/ к вашей системе PATH переменная)

для начала вам нужно организовать свой код ARM в функцию сборки внутри сборки (.файл ы), скажем myasm.s. Теперь вам нужно написать тестовый код в C (test.c, например), чтобы вызвать функцию сборки и printf возвращаемое значение, используя наши знакомые printf(). Вы можете найти исходный код ниже:

myasm.s:

                .align
                .global myasmfunc       @ Required, so that this func can be 
                                        @ accessed from main() in test.c

                                        @ A sample asm function that 
                                        @ returns the value 6
myasmfunc:      MOV     R0, #5
                ADD     R0, R0, #1      @ Now R0 contains 6.
                                        @ By the default ARM calling convention, 
                                        @ R0 will be used to pass return values
                                        @ to the calling function

                MOV     PC, LR          @ Return from myasmfunc()

вы можете использовать код в этом репозитории git в качестве отправной точки:

https://github.iu.edu/geobrown/c335-assembly-examples

как упоминали другие, вам сначала нужно установить QEMU для эмуляции оборудования ARM, и вам нужно будет иметь какой-то способ компиляции вашего кода (я рекомендую CodeSourcery Lite Edition Toolchain). Затем отредактируйте TOOLROOT запись в Makefile.common файл, чтобы указать на место установки вашего toolchain и просто запустите команду make test после того, как вы написали свой код сборки и передали его в тестовый файл C.

код в этом репозитории предоставляет кучу примеров, которые вы можете адаптировать к своим собственным целям, и тестовые файлы C позволят вам вызвать код сборки и вывести результаты на свой терминал в Ubuntu. :)


Я всегда использую небольшой QEMU ARM VM для тестирования программ ARM.

вы можете скачать его с debian а затем запустите его с помощью: (более подробная информация)

qemu-system-arm  -localtime -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append "root=/dev/sda1" $@

поскольку он имитирует полную систему arm, вы можете написать на нем программы (например, с vim + gcc), а затем протестировать их там.


установите qemu, скомпилируйте его для arm, а затем используйте

qemu-system-arm ./a.out

в терминале


Не уверен, почему никто еще не упомянул об этом, но вы можете получить "реальная" и доступная платформа руки экспериментировать с, с малина pi.

Он не поставляется с Ubuntu по умолчанию,насколько мне известно, он поставляется с ремиксом Debian под названием Raspbian (но также может запускать Fedora, Arch или Debian plain).

когда дело доходит до поддержки этой платформы, есть - книги для этого и у него даже есть собственное сообщество Stack Exchange sub.


Если вы планируете написать эмулятор ARM в C, вы можете использовать код в этом репозитории в качестве отправной точки. https://github.com/omufeed/ARMAssemblyEmulatorWithC Он имеет трубопровод размера 4. Инструкции по обработке данных реализованы, и он обрабатывает переполнение и несут флаги. Также реализованы ветви и прерывания. Он принимает инструкцию по сборке в качестве входного сигнала и имитирует конечное состояние памяти после завершения инструкции. Есть некоторые примеры входов добавил в код комментарии. Подробнее вhttp://www.omidmufeed.com/arm-assembler-emulator-with-c/