Необходимо написать программу-транслятор (дизассемблер)
Необходимо написать программу-транслятор (дизассемблер), с
помощью которой можно преобразовывать машинный код (извлеченный из
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 days434 USD14 days434 USD
Good day .
There is experience in writing asseblers and diseblers for different architectures.
-
100 days8145 USD
221 6 1 100 days8145 USDМогу с большой вероятностью успеха реализовать под Win32/64 некий аналог отладчика (по подобию windbg/ollydbg ) но для имитации пошаговой отладки (установки регистров в надлежащие значения) в приложений формата elf для конкретного процессора семейства RISC.
Именно имитации, т.к приложение наверняка использует не просто арифметику процессора а и взаимодействует с периферией, и полноценной отладкой это назвать будет нельзя.
Сходу без вникания не вполне понятно что значит "код чистый и аккуратный" т.к (субъективно) код должен быть в точности как в исполняемом файле (заменён по однозначному соответствию машинного кода на буквенный эквивалент)
Сумма и сроки очень приблизительные исходя из понимания как вышеописано, которое не полное, требует уточнений, а может и неверное.
Current freelance projects in the category Desktop Apps
Modification in the emulator's operation
44 USD
Hello. I downloaded the Gaminator CF Final slot machine emulator from the Internet. I really liked it, but there are some issues. There is an admin panel, but it opens freely and cannot be closed at all. It only closes along with the application. Also, the data does not save… Desktop Apps ∙ 4 days 6 hours back ∙ 10 proposals |
Development of custom software (Android application + CMS) for SUNMI K2 self-service kiosks (Fast food)
22 USD
We are looking for an experienced team or a Middle/Senior Android developer (possibly with Full-stack skills) to create proprietary software for self-service kiosks for a fast food retail chain. Currently, our terminals operate on a ready-made cloud integrator, but we are… Content Management Systems, Desktop Apps ∙ 9 days 1 hour back ∙ 23 proposals |