Как преобразовать ассемблерных код в объектный файл

Начнём с того что на эту тему есть вопрос, который был задан в сентябре прошлого года. Ответа я в этом вопросе не нашёл. Да я читал комментарии. Всё что я из них понял, так это то, что мне надо идти в ВУЗ(а я школу только заканчиваю).

Насчёт таблицы машинного кода я знаю. Но если посмотреть объектные файлы (через команду nm в Linux и dumpbin в Windows) то мы увидим некую структуру по которой расположены эти коды. Если я просто переведу весь ассемблерных код в эти команды, то такой структуры не будет.

Вопрос заключается в том, как добиться такой структуры, которая находится в объектном файле.

Ещё есть вопрос: может в объектном файле не машинный код, а микро код?


Ответы (2 шт):

Автор решения: Максим

Чтобы преобразовать ассемблерный код, используется nasm. Это такая утилита, позволяющая собрать код на ассемблере в объектный файл.

Например:

Файл Programm.asm, который надо преобразовать в файл:

section .data
    msg db 'Hello, World!', 0

section .text
    global _start

_start:
    ; write our string to stdout
    mov eax, 4          ; syscall number for sys_write
    mov ebx, 1          ; file descriptor 1 is stdout
    mov ecx, msg        ; pointer to our message
    mov edx, 13         ; length of our message
    int 0x80            ; call the kernel

    ; exit
    mov eax, 1          ; syscall number for sys_exit
    xor ebx, ebx        ; exit code 0
    int 0x80            ; call the kernel

И команда, которая выполнит "превращение" Programm.asm в Programm.o:

nasm -f elf64 program.asm -o program.o

Готово!!!

→ Ссылка
Автор решения: mrgervant

Возможно, ответ на Ваш вопрос был дан в enSO: How Do You Make An Assembler?

Раз Вас интересует этап ассемблирования и создания объектного файла, то четвертая и пятая ссылки англоязычной статьи ведут на спецификации объектных файлов. С ними придётся ознакомиться, так как объектные файлы содержат в себе не просто перевод ассемблерных команд в машинный код, но и другие метаданные, в том числе информацию об отладке, информацию о компоновке динамически подключаемых библиотек и сведения о том, как операционная система должна загружать различные разделы файла в память. Следовательно, совпасть простой перевод ассемблерного кода в машинные коды с реальным объектным файлом не может.

Первая ссылка ответа ведет на книгу про создание ассемблера - файл. Её же рекомендовали в схожем обсуждении. Можете посмотреть первую главу, в которой объясняются варианты разных ассемблеров, схемы их работы, а также построение объектных файлов.

Также существует проект The Assembler Developer's Kit - сайт с мануалами по созданию своего ассемблера. Возможно он будет более прикладным, чем книга выше.

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

→ Ссылка