Написание транслятора языка Ассемблера

Тема в разделе "WASM.ASSEMBLER", создана пользователем SeDoY, 2 фев 2005.

  1. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Прошу подсказать какую-нибудь информацию о написании простешего транслятора ассемблера( по типу того что встроен в debug.exe). Я, конечно, понимаю что принципы построения такого транслятора можно позаимствовать из книг по написанию компиляторов ЯВУ.. но(!) Первым делом, я начал читать книгу Ахо и Ульмана "Книга Дракона", но, к моему глубокому сожалению, вследсвие моего "не программерского" образования мне она показалась тяжеловата, читал всякие статейки, коими полон интернет,но в них ничего толкого, нужного мне не нашел :dntknw:. К тому же, компиляторы, которые описаны в таких доках генерируют ассемблерные листинги сомнительно качества, мне естественно нужны полноценные исполнимые файлы.

    Возможно, у вас есть какие-то свои наработки, которыми можете поделится, либо имеются лекции, лабораторные работы по данному вопросу.

    Проще говоря, все что можете посоветовать, чем можете поделится, всему буду благодарен.



    PS. конечно, вы можете поорать:"какой ты тупой, не можешь разобраться в такой фигне!", и т.п., но давайте побережем свои нервы и время, и будем давать советы конкретные.



    Заранее благодарен.
     
  2. Max

    Max Member

    Публикаций:
    0
    начал читать книгу Ахо и Ульмана "Книга Дракона"

    это ты молодца - лучше книги я еще не встречал!



    если надо для жирафов, то могу кинуть учебное пособие "Основы теории построения компиляторов", оглавление в аттаче, 100 стр., ~1.3Мб, пиши куда...



    з.ы. посмотри еще в разделе документы Assemblers and Loaders (ничего) и Linkers and Loaders (так себе)

    [​IMG] _1451004341__summ.doc
     
  3. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Max

    Кидай книжку, лишней не будет :), правда у меня у самого этого добра по ЯВУ накопилось %). SeDoYHg(собака)list.ru



    Хрен его знает, что я за животное :), скорее свинья, столько уже земли перерыл, в поисках вкусных и полезных корений :).
     
  4. ssx

    ssx Member

    Публикаций:
    0
    ты возьми исходники gas и медитируй над ними

    что-то мне подсказывает, что flex+bison тебе должно хватить для написания транслятора
     
  5. Max

    Max Member

    Публикаций:
    0
    SeDoY

    мыло ушло...
     
  6. slow

    slow New Member

    Публикаций:
    0
    Max киньте и мне пож если не трудно

    slowhand **at** list.ru
     
  7. Max

    Max Member

    Публикаций:
    0
    slow, only tomorrow, exactly today :)
maybe it'll be better to place it in doc section?
Volodya, what do you think about it?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    IMHO "Книга Драгона" полезна, но необязательна для написания ассемблера.

    Живой пример тому - RosAsm.



    традиционный ассемблер имеет довольно простой синтаксис, поэтому использование генераторов вроде flex+bison IMHO излишество, это быстрее кодится вручную.



    НО нужно различать ассемблер и макроассемблер. Во 2м случае нужен препроцессор, это по сути отдельный модуль.



    Хотя наиболее сложная, на мой взгляд, часть ассемблера - это сам кодогенератор x86. Проблема в том, что многие команды можно кодировать разным количеством байт, отсюда выбор: или будет простой неэффективный генератор, делающий все jump'ы near, или сложный многопроходный как в fasm.



    Поэтому важно сразу определиться с синтаксисом.

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

    Хотя остаются ещё команды вида add, sub, xor и т.п. особенно варианты вроде:
    Код (Text):
    1. foo:
    2.      add  edx, bar-foo
    3. bar:
    например, MASM не способен (!) эффективно ассемблировать такой код.



    Для простейшего транслятора как ы debug IMHO достаточно Opcodes Book by the Svin и мануалов от intel - там даже таблицу символов строить не нужно, кодировать команды только.
     
  9. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Max, кинь в мине тоже книгу. Не помешаит.

    адрисс: limon-5#yandex.ru.



    вМИСТО # -> @.
     
  10. Max

    Max Member

    Публикаций:
    0
    slow,MrHammer

    ушло



    S_T_A_S_

    НО нужно различать ассемблер и макроассемблер

    сама книга замечательна тем, что расписывает некоторые приемы оптимизации кода, что важно для макроассемблера (циклы, условия и т.п.)

    мне она даже больше понравилась как мануал по реинжинирингу - определение циклов, анализ графов и т.п.
     
  11. infern0

    infern0 New Member

    Публикаций:
    0
    Max

    может на васм закинешь, чтобы не плодить посты "и мне". Я бы тоже глянул тогда :)
     
  12. Max

    Max Member

    Публикаций:
    0
    infern0

    может на васм закинешь

    да я предлагал - maybe it'll be better to place it in doc section?
Volodya, what do you think about it?

    (инглиш, т.к. писал с мобилы)



    Я бы тоже глянул тогда :)

    пиши куда, я кину...
     
  13. const

    const New Member

    Публикаций:
    0
    2 SeDoY

    Есть 5-метровый архив на эту тему (там все перемешано, но м.б. что-то пригодицца). Порезать или так и отправить?
     
  14. SeDoY

    SeDoY New Member

    Публикаций:
    0
    const

    Кидай все :), ящик то безразмерный =). Почитаю на досуге.



    Max

    Спасибо за книжку, буду читать.



    S_T_A_S_



    Согласен полностью, что самая важная часть (не знаю как точнее сказать) в асссемблере это именно генератор кода. Ибо каким бы не был крутом препроцессор, если код выходит кривой то грошь цена такому ассемблеру. дебаг я привел как самый примитивный вариант и первый шаг на пути к полноценному транслятору =).

    Вспомнилось вдруг ;), переписывал я примеры с ТАСМА на ФАСМ, какого же было моё удивление, когда я сравнил два экзешника , сделанные ТАСМомо и ФАСМом(по одному исходнику) . То что выплюнул ТАСМ меня просто поразило (на повал), откуда-то появилась куча нопов (именно КУЧА!!!), про друкие аспекты "оптимизации" можно и не говорить %). Так что кодогенерация самый важный и ответсвенный момент ( ИМХО самый важный).



    PS и сгинет всяка нечесть комерционная(мелкософто турболетная =), и приде век чистого и открытого для всех великого Языка =)
     
  15. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Хм, странно немного :), рассчитывал, что будут хоть какие-нибудь исходники и информация именно по ассемблеру, все таки, я думал, что этим заморачивались многие, ну да ладно, на нет... будем сами кумекать. Спасибо всем кто откликнулся, тема не закрыта, думаю, вопросы у меня еще возникнут, есть кому на них ответить =)? (вопрос все таки риторический, наверно)
     
  16. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    А что ты хотел ? =)

    Давай посчитаем известные opensource проекты.

    на асме написаны fasm & rosasm. из них 2й не оптимизирует размер команд.

    gas и nasm написаны на Си и, при этом, как я понял, имеют теже недостатки, что и rosasm.

    Остаётся один ассемблер !!!!!

    Это выглядит довольно странно на фоне высказываний Хайда, что генерация кода - пара пустякофф.

    почему-то многие компиляторы при этом являются fron-end для fasm.



    НаписАть функцию генерирующую опкод из мнемоники - не слишком большая проблема:

    делаем табличку, где каждой мнемонике соответствует адрес ф-ции обработчика.

    Мнемоники можно сгрупировать.

    например, однобайтные будут обрабатываться одной и той же ф-цией, но тогда в табличку нужно будет добавить ещё параметр для неё - сам опкод.

    2я группа - команды требующие один операнд: div, mul, neg, not, idiv. первый байт у них одинаков 0xF7/0xF6, в таблице хранить ModR/M биты (6, 4, 3, 2, 7 соответственно) остальные биты 2го байта и младший бит 1го вычислять исходя из операнда.

    таким образом можно разделить на группы почти все инструкции.



    Сложность в том, что размер опкода x86 может быть различен для одной мнемоники.

    Причём его размер зависит не только от самой этой мнемоники, но и от тех мнемоник, которые вокруг!

    Практически все реализации (кроме fasm) закрывают глаза на этот факт.

    fasm решает эту проблему за счёт множества проходов. я думаю дроугого пути нет - backpatсhing здесь мало поможет.



    Однако, существуют ситуации, когда минимальный размер опкода не является оптимальным. Вот как быть здесь? AFAIK это ещё никто не решил :-(
     
  17. SeDoY

    SeDoY New Member

    Публикаций:
    0




    Я много чего хотел :).

    А если серьезно, то думал "позаимствовать" из путевых исходников анализ (хотя копаясь в исходниках ФАСМА понял, что гиблое это дело, без комментраиев тяжко будет понять что к чему)и занятся более основательно генерацией кода, так как для меня это более интересное и важное занятие. Ну да ладно, "сами с усами" =).



    Ктсати, Юров в своем практикуме(у меня первое издание) описывает создание препроцессора для поддержки ХММ-команд, но что то я его не нашел, ни на дискете ни на сайте издателя :dntknw:, хотя в книге написано, что он есть. Видать дюже секретный сырец :).
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Ну дык возьми и пиши кодогенератор сразу.

    Без предварительной обработки текста это вполне можно сделать приняв несколько упрощений.

    Например, фиксированный формат строки, т.е. мнемоника располагается строго в начале строки, далее через один пробел операнд (если он есть), потом второй.

    Ошибки синтаксиса не обрабатывай.

    ещё больше можно упростить, отказавшись от операторов размерности dword, byte и т.п. объединив их с мнемоникой например так:



    MOV1 [0],0 ; это аналог mov byte[0], 0

    MOV4 [0],0 ; это аналог mov dword[0], 0



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

    по ходу дела начнут появляться вопросы, а на них ответы получить будет проще, чем на общие.



    >




    Может он его вообще не писАл?

    А что, imho вполне реально :-/
     
  19. SeDoY

    SeDoY New Member

    Публикаций:
    0




    Была такая мысль, но она показалась мне кощунсвенной, но, видимо, это для меня будет оптимальным решением...







    цитата из практикума:

    Его (препроцессор, мое прим.:) описание содержит множество технических подорбностей, не относящихся к предмету книги. По этой причине программа-препроцессор с соответсвующими пояснениями деталей реализации вынесена на дискету, прилагаемую к книге.

    Вот так вот :dntknw:...
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    SeDoY >




    Почему, потом можно будет немного модифицировать и подавать на вход то, что выдаёт препроцессор + парсер.

    конечно, хорошо сначала досконально разобраться в теории, всё спланировать, но на это может уйти сверхмного времени.

    зачем делать препроцессор который будет выкидывать лишние пробелы, если это не
    , его можно будет реализовать и потом.



    >




    У меня есть книга + дискета, и я читал это перед своим постом.

    Просто какой ему смысл что-то кодить, когда можно и не делать этого, я вот например только что с твоих слов об этом узнал =)