На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Разработка своего ассемблера
    Всем привет!

    Тему создаю просто для отделения вопросов сабжа из темы "fasm синтаксис".

    Предыстория

    Цитата Jin X
    Вот захочу я свой асм создать (вернее, я уже хочу... начну, хотел сказать), а там такое будет! Тогда вообще непонятно станет, как дальше жать.
      JoeUser
      Разработчики ассемблеров давно поняли что главное это мода. Поэтому у каждого свой синтаксис. Это только Зубов умудрился написать один код для 3-х ассемблеров TASM|MASM|NASM.

      Цитата Jin X @
      Вот захочу я свой асм создать (вернее, я уже хочу... начну, хотел сказать), а там такое будет! Тогда вообще непонятно станет, как дальше жать.

      Вывод в IR LLVM он транслирует код под разные платформы.

      А что вас останавливает начать? Я вот к примеру начал и не только ассемблер.

      user posted image

      Это сообщение было перенесено сюда или объединено из темы "fasm синтаксис"
        Цитата Pavia @
        А что вас останавливает начать?
        1. Сначала нужно нормально проработать основные концептуальные особенности этого ассемблера. Делать "ещё один асм" смысла нет. Если уж делать, то так, чтобы он был лучше уже существующих решений по многим параметрам: давал больше возможностей, имел более удобный макродвижок, поддерживал множество выходных форматов файлов и платформ, имел обширную библиотеку функций (хотя бы на уровне masm32) и при этом работал быстро. Он должен вобрать в себя все самые интересные из существующих фишек (например, virtual, match и used из fasm – прекрасные штуки; макросы, которые могут возвращать значения в masm32 – тоже отлично) и иметь свои оригинальные фишки. Должна быть IDE.

        Я записываю идейки в "блокнотик", конечно, но всё это нужно более чётко проработать. По-хорошему, нужно создать форум, где можно было бы вести обсуждение идей, собирать идеи от людей, что-то выносить и на голосование.
        Вот к примеру, несколько из идей:
        а) Система плагинов, которая позволяет расширять ассемблер новыми инструкциями, форматами файлов (в fasmg это сделано через макросы, но всё это работает не очень быстро, и я не уверен, что это удобно разрабатывать), директивами-функциями, псевдоинструкциями (к примеру, реализация деления через умножение; те же .if-ы). Возможно, какие-то оптимизирующие модули (скажем, замена mov eax,0 на xor eax,eax – где это допустимо, т.е. тут нужен анализатор), возможность писать mov eax,[edx*3] с автозаменой его на mov eax,[edx*2+edx] и т.п.
        б) Макродвижок с возможностью использования Си-подобного синтаксиса, регулярных выражений, поддержкой if-ов на все случаи жизни (в т.ч. однострочные типа if (x==y) { mov ax,bx } else { mov cx,dx }), функций для работы со строками, возможности использования констант внутри строк (как в python/ruby), форматирования строк, удобного копирования участков кода из другого места, поддержкой длинных целых (хотя бы до 1024 бит), работой с числами с плавающей запятой (ни masm32, ни fasm, ни nasm не позволяют делать вычисления с вещественными числами в макросах).
        в) Области видимости переменных, процедур, меток, возможность их объявления в любом месте кода с фактическим их переносом в заданную область. Использование строк в коде (например, mov eax,&'Hello World' будет записывать строку в секцию данных, а в eax – адрес).
        г) Включение и выключение разных фишек (которые так же можно проверять через if-ы). Например, AT&T-формата, GAS-подобных указаний размерности (movl, addb), разного порядка байтов в строковых константах.
        д) Генератор чистого исходника (т.е. после препроцессора). Испорт и экспорт в/из других ассемблеров.
        е) Портал для хранения (и автоматической установки/загрузки) библиотек, include'ов, плагинов.
        И пр...

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

        Это сообщение было перенесено сюда или объединено из темы "fasm синтаксис"
          Хм-м-м... "if( x==y )" делаете, а "ax=bx" даже не написали! А ведь в С-- уже таковое было!! :P
            Славян, тут основные идеи, вернее лишь часть. Все эти ax=bx; mov eax,[edx*3]; add ax,cx+cf; add eax,edx*4+0x1000; .push eax,edx { ...code... } и пр. будут в отдельных плагинах, которые можно подключать при желании.
            Как в fasm/nasm сейчас? Если не указана разрядность, подразумевается 16 бит. Если не указана секция, подразумевается .code и т.д.
            И здесь, если не указана платформа, подразумевается полный набор x86-64 (и соответствующий плагин). Если не указан charset, подразумевается utf8. Не указан размер таба, подразумевается 4 (или 8).
            А так можно будет и выравнивание данных (по умолчанию, как в ЯВУ) указывать. И соглашение о вызовах (как в masm), и даже автоматически сохраняемые в процедурах регистры (всегда или если только они используются).
            И можно проверки включать и выключать. К примеру, используешь imul, а тип данных – беззнаковых, получи warning. Если нужно, конечно, по умолчанию выключено.
              Просто трудно представить себе плагин, кой '=' переопределяет/доопределяет. Покажете? Или у вас и для формата плагина будет некий свой язык?..
                Славян, у меня нет пока ничего. Я ж говорю, что это всё нужно ещё проработать. Но этот вопрос решаемый. Навскидку, плагины могут содержать списки регулярных выражений (не обязательно стандартные RegExp, а свои), на соответствие которым будут проверяться выражения в исходнике. Возможно, это не самый лучший вариант, но один из возможных. Более оптимальные идеи могут прийти, если заняться изучением технологии парсинга исходных текстов и создания компиляторов, в которых я пока не шарю.
                Я ж говорю, что одна из основных проблем – найти время на всё это.
                  Я просто хочу сказать, что выбор основ (аксиом) крайне важен. Столько раз сталкивался с тем, что именно этот шаг самый трудный. Вон, Си-шники тоже, наверное, хотели рационально сделать "A = B+C" для матриц, но не смогли и пришлось целый почти новый язык сочинить для этой перегрузки оператора '+'; а вы тут так просто обмолвились про "ax=bx" (плагины!). :blush:
                    Вас послушать, так возникает вопрос "а нафига тогда C нужен?". Зачем вам ассемблер в таком случае?
                      Вот! Согласен с Qraizer'ом!
                      Суть то ассемблера всё же в том, что там каждая команда особенная, и является, по сути, аналогом машинной команды!!!
                      Т.е. команду "ax=bx" можно сделать, а вот "ax=bx=cx" уже нежелательно, ибо у неё нет аналога.
                      Так и с вашим, Jin X, вариантом: "if( x==y )" делать нельзя, ибо нет такой готовой. А вот "if( x==dx )" можно. :)
                      В общем, трудная база ожидается...
                        Цитата Славян @
                        Суть то ассемблера всё же в том, что там каждая команда особенная, и является, по сути, аналогом машинной команды!!!

                        Давняя мудрость - "все хорошо вмеру" :lol:
                        Есть вещи, которые реально удобны, и, самое главное, наглядны. Типа fasm'овский макро "proc/endp", например:

                        ExpandedWrap disabled
                          proc WindowProc stdcall uses ebx esi edi,\
                                 hwnd:DWORD,wmsg:DWORD,wparam:DWORD,lparam:DWORD

                        Избавляет от предшествующих многочисленных push и последующих pop, видны используемые параметры. Ну супер же, не?!!

                        А вот всякие там .if - это, ИМХО, от лукавого. Это точно уже путь в недо-Си.
                          Цитата JoeUser
                          видны используемые параметры. Ну супер же, не?!!
                          Очень часто, конечно, супер. Но! Когда вызываемая функция берётся один-два раза, и первый аргумент с выходным значением вам насильно навязывают EAX, то это крайне редко, но всё же выглядит аки ядовитая кость в горле!!! >:(
                          Типа, за меня решили "что и куда пойдёт". Именно с этого места, как мне думается, (ну или близко к этому) начинается гибель/смерть ассемблера и уход к языкам более высокого уровня. Не могу такового простить! Уж сколько раз вижу, что EBX свободен, его используй, компилятор (Си'шный, имеется ввиду)! Ан нет, своё давит! Меняет, передвигает и ещё чёрт знает что делает, но чтобы в этот долбаный первый EAX засунуть.
                            Цитата Славян @
                            Но! Когда вызываемая функция берётся один-два раза, и первый аргумент с выходным значением вам насильно навязывают EAX, то это крайне редко, но всё же выглядит аки ядовитая кость в горле!!!

                            Упс ... не понял, а при чем тут макро proc? :-?
                              Цитата Славян @
                              Т.е. команду "ax=bx" можно сделать, а вот "ax=bx=cx" уже нежелательно, ибо у неё нет аналога.
                              ax=bx=cx вполне понятно как перевести в ассемблер:
                              ExpandedWrap disabled
                                mov bx,cx
                                mov ax,cx
                              По крайней мере, если описать, что это будет так (типа как в плюсах же есть чёткое описание каждой "запятой").
                              В любом случае, повторюсь, это всё расширения, которые плагинами реализуются. Никто не заставляет их использовать и даже включать плагин в исходник (через "use" или т.п. директиву).

                              Цитата Qraizer @
                              Зачем вам ассемблер в таком случае?
                              Ответ, в общем-то, тот же (хочешь – используй, не хочешь – нет). Не могу сказать, что ax=bx мне прям больше нравится, чем mov ax,bx. Но вероятно, просто из привычки. Если кому-то так будет удобнее, почему бы и нет? С другой стороны, это создаёт неоднозначность синтаксиса, что не есть хорошо (типа как в masm: хочешь пиши mov ax,msg, хочешь mov ax,[msg]). Вероятно, при использовании плагинов расширения синтаксиса нужно делать отдельный суб-язык со своим расширением имени файла, чтобы не смешивать пиво с белым вином. С другой стороны, в некоторых ассемблерах есть расширения типа .if/.else/.endif, .while и т.п. И люди этим даже пользуются! В общем, надо думать. Наверное, некоторые расширения (типа .if, .while, .push и т.п. можно разрешить в основном асме, остальные же – выносить в отдельный а-ля .asmx).

                              Цитата Славян @
                              Так и с вашим, Jin X, вариантом: "if( x==y )" делать нельзя, ибо нет такой готовой.
                              Друг мой, это макрокоманда.

                              Цитата Славян @
                              Именно с этого места, как мне думается, (ну или близко к этому) начинается гибель/смерть ассемблера и уход к языкам более высокого уровня.
                              В том же fasm можно писать так:
                              ExpandedWrap disabled
                                invoke  MessageBox, 0, invoke GetCommandLineW, 'Command line', MB_OK
                              Почему бы и нет? :)
                                Цитата JoeUser
                                при чем тут макро proc?
                                При том, что тоже есть жёсткая привязка к конкретным регистрам, а не к reg1, reg2, reg3.

                                Цитата Jin X
                                ax=bx=cx вполне понятно как перевести в ассемблер:
                                1. В Си то строка "a=b" интерпретируется как "положить 'b' в 'a' и вернуть 'a'", т.е. "на Си" перевод формальный должен быть как:
                                ExpandedWrap disabled
                                  mov bx, cx
                                  mov ax, bx
                                2. Да, ваш то перевод был быстрее для работы (двойное чтение готового), но всё же это уже оптимизация какая-то. Да и, повторюсь, это набор команд, а не одна готовая, из чего ассемблер состоит!

                                Цитата Jin X
                                Цитата Славян
                                "if( x==y )" делать нельзя, ибо нет такой готовой.
                                Друг мой, это макрокоманда.
                                Эх, опять! Тема не про макрокоманды, а про СВОЙ АССЕМБЛЕР! Плевать, что там можно насочинять в макросах, хоть "main={return 'Hello,world!';}", давайте обсудим же чистый свой асм!

                                Цитата Jin X
                                В том же fasm можно писать так:
                                ExpandedWrap disabled
                                  invoke  MessageBox, 0, invoke GetCommandLineW, 'Command line', MB_OK
                                Почему бы и нет?
                                1. Потому что fasm - не ассемблер, а компилятор оного. :wall:
                                2. Потому что видел в Си-вижуалке (при включённых настройках в оптимизации, конечно), что он пихает часть аргументов в стэк, а меж ними ещё какие-то завершающие/(грядущие?) расчёты идут. И это - неспроста! Значит так быстрее будет. В этом же invoke (блин, опять про макросы!) будет чёткая последовательность push'иков, что слегонца, но губит чистый ассемблер.

                                Добавлено
                                Хм... пардон, вики пишет, что fasm как бы и сколько-то ассемблер, и компилятор. Всё же в 99%-смысле это компилятор, думается мне. :blush:
                                  Цитата Славян @
                                  При том, что тоже есть жёсткая привязка к конкретным регистрам, а не к reg1, reg2, reg3.

                                  Откуда ты это взял??? :blink: Я полез смотреть макрос, не увидел такого. Или плохо смотрел ... Покажи где ты это увидел!

                                  Добавлено
                                  Цитата Славян @
                                  Потому что fasm - не ассемблер, а компилятор оного.

                                  Вот это поворот! :) А разве есть Стандарт Ассебмблера?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) [1] 2 3  все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0546 ]   [ 18 queries used ]   [ Generated: 29.03.24, 04:37 GMT ]