Необходимо написать программу-транслятор (дизассемблер)
Необходимо написать программу-транслятор (дизассемблер), с
помощью которой можно преобразовывать машинный код (извлеченный из
elf-файла) в текст программы на языке ассемблера.
Код должен быть “чистый” и аккуратный.
Должен поддерживаться следующий набор команд RISC-V: RV32I,
RV32M. Подробнее (volume 1): https://riscv.org/technical/specifications/
Кодирование: little endian.
Вывод регистров: ABI. Регистр x8 выводится как s0.
Псевдонимы команд: псевдонимы команд парсить не нужно.
Обрабатывать нужно только секции .text, .symtab.
Для каждой строки кода указывается её адрес в hex формате.
Обозначение меток нужно найти в Symbol Table (.symtab). Если же
название метки там не найдено, то используется следующее обозначение:
L%i, например, L2, L34. Нумерация начинается с 0. Для каждой метки
перед названием указывается адрес (пример ниже).
Если встреченная инструкция не известна, то нужно вывести вместо
инструкции “invalid_instruction”.
Шаблон файла дизассемблера
Файл должен состоять из двух частей: .text и .symtab, отделенных
друг от друга одной пустой строкой. Сначала идет .text, затем .symtab.
Ниже приведены комментарии (строки, начинающиеся с 😉 и
форматы оформления. Формат строк указан по правилам printf (Си).
.text
; с меткой: "\n%08x \t<%s>\n", аргументы: адрес, метка
; без метки: адрес, hex код инструкции, инструкция, аргументы (ниже)
; инструкции с 3 аргументами: " %05x:\t%08x\t%7s\t%s, %s, %s\n"
; инструкции с 2 аргументами: " %05x:\t%08x\t%7s\t%s, %s\n"
; load/store/jalr инструкции: " %05x:\t%08x\t%7s\t%s, %d(%s)\n"
; J* инструкции с меткой: " %05x:\t%08x\t%7s\t%s, 0x%x <%s>\n"
; B* инструкции с меткой: " %05x:\t%08x\t%7s\t%s, 0x%x, <%s>\n"
; fence инструкции: " %05x:\t%08x\t%7s\t%s, %s\n"
; без аргументов: " %05x:\t%08x\t%7s\n"
; неизвестная: " %05x:\t%08x\t%-7s\n"
; immediate (константы): dec формат
; offset (в переходах J*, B*, в lui и auipc): hex формат
; пример ниже (отображение в ТЗ передаёт суть)
; пример в соответствии с форматом лежит в репозитории
; если формат в файле расходится с текущим условием, то
приоритетнее ; вывод в файле репозитория
00010074 <main>
10074: 00000013 addi zero, zero, 0
10078: 00100137 lui sp, 0x11
100a8: fcf42e23 sw a5, -36(s0)
; между секциями text и symtab 2 пустых строки
.symtab
; заголовок таблицы
; "\nSymbol Value Size Type Bind Vis Index Name\n"
; строки таблицы
; "[%4i] 0x%-15X %5i %-8s %-8s %-8s %6s %s\n"
; пример ниже (отображение в ТЗ передаёт суть), полный в репозитории
Symbol Value Size Type Bind Vis Index Name
[ 0] 0x0 0 NOTYPE LOCAL DEFAULT UNDEF
[ 1] 0x10074 0 SECTION LOCAL DEFAULT 1
[ 2] 0x112F8 0 SECTION LOCAL DEFAULT 2
[ 3] 0x0 0 SECTION LOCAL DEFAULT 3
[ 4] 0x0 0 SECTION LOCAL DEFAULT 4
[ 5] 0x0 0 FILE LOCAL DEFAULT ABS test.c
[ 6] 0x11AF8 0 NOTYPE GLOBAL DEFAULT ABS __global_pointer$
Про L метки: Когда в коде кто-то захочет перейти на определённый
адрес, у которого нет метки, то тогда ставим метку L%i. Рассмотрим
следующий случай:
100fc: fea794e3 bne a5,a0,100e4 <mmul+0x38>
В bne задан offset на адрес, для которого явно не определена метка.
Значит на 100e4 назначается метка (например, L0) и вашем коде дизасм
может выглядеть одним из следующих случаев (приведена часть строки):
bne a5, a0, 0x100e4, <L0>
Числа выводятся в следующем виде:
● отрицательные (пример для -3): dec: -3, hex (хранение в дополнении
до 2): 0xfffffffd
● положительные (пример для 11): dec: 11, hex (хранение в дополнении
до 2): 0xb
Fence: predecessor и successor выводится как буквы установленных
битов. Пример: fence rw, orw.
Аргументы программе передаются через командную строку:
<имя_входного_elf_файла> <имя_выходного_файла>
Также требуется:
1. Описание работы написанного кода: ЧТО БЫЛО РЕАЛИЗОВАНО
(32i, 32m, или всё из этого), и как вы реализовали (разбор elf файла,
парсинг команд). При описании работы написанного кода может
быть полезно приложить небольшие рисунки для иллюстрации
пояснений и ссылки на соответствующие документы.
2. Ссылки на используемые источники: по risc-v и elf.
Полезные ресурсы:
https://refspecs.linuxbase.org/elf/gabi4+/contents.html
https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.htm
-
14 дней19 515 UAH14 дней19 515 UAH
Добрый день.
Есть опыт написания ассеблеров и дизассеблеров для разных архитектур.
-
100 дней365 901 UAH
221 6 1 100 дней365 901 UAHМогу с большой вероятностью успеха реализовать под Win32/64 некий аналог отладчика (по подобию windbg/ollydbg ) но для имитации пошаговой отладки (установки регистров в надлежащие значения) в приложений формата elf для конкретного процессора семейства RISC.
Именно имитации, т.к приложение наверняка использует не просто арифметику процессора а и взаимодействует с периферией, и полноценной отладкой это назвать будет нельзя.
Сходу без вникания не вполне понятно что значит "код чистый и аккуратный" т.к (субъективно) код должен быть в точности как в исполняемом файле (заменён по однозначному соответствию машинного кода на буквенный эквивалент)
Сумма и сроки очень приблизительные исходя из понимания как вышеописано, которое не полное, требует уточнений, а может и неверное.
Актуальные фриланс-проекты в категории Веб-программирование
Разработка системы автоматизации публикации вакансий в Facebook-группах для кадрового агентстваИщу специалиста для создания и дальнейшего сопровождения системы публикации вакансий в Facebook-группах.О компании:Мы являемся кадровым агентством в Израиле и занимаемся подбором персонала для предприятий, заводов, складов, производственных компаний и других работодателей по… Веб-программирование, Разработка ботов ∙ 1 час 55 минут назад ∙ 10 ставок |
Верстальщик для multi-page advertorial сайта (Health Media) — вайб-кодинг, чистый код
6654 UAH
Нужно создать многостраничный сайт в стиле health media, по образцу healthinsider.news. Не просто лендинг — полноценный псевдо-редакционный сайт (advertorial), под который будет литься трафик с Meta Ads. ВАЖНО: задача делается через вайб-кодинг (AI-assisted coding / vibe… HTML и CSS верстка, Веб-программирование ∙ 4 часа 38 минут назад ∙ 40 ставок |
Необходимо сделать редизайн вебсайта и разработать функционал личного кабинета оптового покупателяТехническое заданиеПроектРедизайн корпоративного вебсайта и разработка личного кабинета оптового покупателя, направление - детская одежда.Цель проектаСоздать современную цифровую платформу для B2B и B2C клиентов компании с акцентом на улучшение пользовательского опыта, повышение… Веб-программирование ∙ 7 часов 42 минуты назад ∙ 32 ставки |
Pіm система
10 000 UAH
Необходимо создать PIM систему. Количество товаров — несколько миллионов. Есть несколько поставщиков, которые предоставляют данные в разных форматах: csv, xml, API. Данные ограничены, часто нужно находить характеристики товаров в других источниках и дополнять. Необходимо… Базы данных и SQL, Веб-программирование ∙ 9 часов 26 минут назад ∙ 33 ставки |
Ищем специалиста, который сделает XML/YML файл с товарами для маркетплейсов Rozetka и Kasta.Необходимо подготовить файл с товарами: название, описание, цена, остатки, фото, категории, характеристики, размеры/цвета. Важно: файл должен проходить валидацию Rozetka и корректно загружаться на Kasta. Товар у нас есть в CRM Ситникс и на сайте ХорошопТовара ориентировочно 80… Веб-программирование ∙ 12 часов 33 минуты назад ∙ 27 ставок |