Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.94.152] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Прикр. сообщ.
#1
,
|
|
|
Всем привет!
Тему создаю просто для отделения вопросов сабжа из темы "fasm синтаксис". Предыстория Цитата Jin X Вот захочу я свой асм создать (вернее, я уже хочу... начну, хотел сказать), а там такое будет! Тогда вообще непонятно станет, как дальше жать. |
Сообщ.
#1
,
|
|
|
JoeUser
Разработчики ассемблеров давно поняли что главное это мода. Поэтому у каждого свой синтаксис. Это только Зубов умудрился написать один код для 3-х ассемблеров TASM|MASM|NASM. Цитата Jin X @ Вот захочу я свой асм создать (вернее, я уже хочу... начну, хотел сказать), а там такое будет! Тогда вообще непонятно станет, как дальше жать. Вывод в IR LLVM он транслирует код под разные платформы. А что вас останавливает начать? Я вот к примеру начал и не только ассемблер. Это сообщение было перенесено сюда или объединено из темы "fasm синтаксис" |
Сообщ.
#2
,
|
|
|
Цитата 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 синтаксис" |
Сообщ.
#3
,
|
|
|
Хм-м-м... "if( x==y )" делаете, а "ax=bx" даже не написали! А ведь в С-- уже таковое было!!
|
Сообщ.
#4
,
|
|
|
Славян, тут основные идеи, вернее лишь часть. Все эти 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. Если нужно, конечно, по умолчанию выключено. |
Сообщ.
#5
,
|
|
|
Просто трудно представить себе плагин, кой '=' переопределяет/доопределяет. Покажете? Или у вас и для формата плагина будет некий свой язык?..
|
Сообщ.
#6
,
|
|
|
Славян, у меня нет пока ничего. Я ж говорю, что это всё нужно ещё проработать. Но этот вопрос решаемый. Навскидку, плагины могут содержать списки регулярных выражений (не обязательно стандартные RegExp, а свои), на соответствие которым будут проверяться выражения в исходнике. Возможно, это не самый лучший вариант, но один из возможных. Более оптимальные идеи могут прийти, если заняться изучением технологии парсинга исходных текстов и создания компиляторов, в которых я пока не шарю.
Я ж говорю, что одна из основных проблем – найти время на всё это. |
Сообщ.
#7
,
|
|
|
Я просто хочу сказать, что выбор основ (аксиом) крайне важен. Столько раз сталкивался с тем, что именно этот шаг самый трудный. Вон, Си-шники тоже, наверное, хотели рационально сделать "A = B+C" для матриц, но не смогли и пришлось целый почти новый язык сочинить для этой перегрузки оператора '+'; а вы тут так просто обмолвились про "ax=bx" (плагины!).
|
Сообщ.
#8
,
|
|
|
Вас послушать, так возникает вопрос "а нафига тогда C нужен?". Зачем вам ассемблер в таком случае?
|
Сообщ.
#9
,
|
|
|
Вот! Согласен с Qraizer'ом!
Суть то ассемблера всё же в том, что там каждая команда особенная, и является, по сути, аналогом машинной команды!!! Т.е. команду "ax=bx" можно сделать, а вот "ax=bx=cx" уже нежелательно, ибо у неё нет аналога. Так и с вашим, Jin X, вариантом: "if( x==y )" делать нельзя, ибо нет такой готовой. А вот "if( x==dx )" можно. В общем, трудная база ожидается... |
Сообщ.
#10
,
|
|
|
Цитата Славян @ Суть то ассемблера всё же в том, что там каждая команда особенная, и является, по сути, аналогом машинной команды!!! Давняя мудрость - "все хорошо вмеру" Есть вещи, которые реально удобны, и, самое главное, наглядны. Типа fasm'овский макро "proc/endp", например: proc WindowProc stdcall uses ebx esi edi,\ hwnd:DWORD,wmsg:DWORD,wparam:DWORD,lparam:DWORD Избавляет от предшествующих многочисленных push и последующих pop, видны используемые параметры. Ну супер же, не?!! А вот всякие там .if - это, ИМХО, от лукавого. Это точно уже путь в недо-Си. |
Сообщ.
#11
,
|
|
|
Цитата JoeUser Очень часто, конечно, супер. Но! Когда вызываемая функция берётся один-два раза, и первый аргумент с выходным значением вам насильно навязывают EAX, то это крайне редко, но всё же выглядит аки ядовитая кость в горле!!! видны используемые параметры. Ну супер же, не?!! Типа, за меня решили "что и куда пойдёт". Именно с этого места, как мне думается, (ну или близко к этому) начинается гибель/смерть ассемблера и уход к языкам более высокого уровня. Не могу такового простить! Уж сколько раз вижу, что EBX свободен, его используй, компилятор (Си'шный, имеется ввиду)! Ан нет, своё давит! Меняет, передвигает и ещё чёрт знает что делает, но чтобы в этот долбаный первый EAX засунуть. |
Сообщ.
#12
,
|
|
|
Цитата Славян @ Но! Когда вызываемая функция берётся один-два раза, и первый аргумент с выходным значением вам насильно навязывают EAX, то это крайне редко, но всё же выглядит аки ядовитая кость в горле!!! Упс ... не понял, а при чем тут макро proc? |
Сообщ.
#13
,
|
|
|
Цитата Славян @ ax=bx=cx вполне понятно как перевести в ассемблер:Т.е. команду "ax=bx" можно сделать, а вот "ax=bx=cx" уже нежелательно, ибо у неё нет аналога. 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 можно писать так:Именно с этого места, как мне думается, (ну или близко к этому) начинается гибель/смерть ассемблера и уход к языкам более высокого уровня. invoke MessageBox, 0, invoke GetCommandLineW, 'Command line', MB_OK |
Сообщ.
#14
,
|
|
|
Цитата JoeUser При том, что тоже есть жёсткая привязка к конкретным регистрам, а не к reg1, reg2, reg3.при чем тут макро proc? Цитата Jin X 1. В Си то строка "a=b" интерпретируется как "положить 'b' в 'a' и вернуть 'a'", т.е. "на Си" перевод формальный должен быть как:ax=bx=cx вполне понятно как перевести в ассемблер: mov bx, cx mov ax, bx Цитата Jin X Эх, опять! Тема не про макрокоманды, а про СВОЙ АССЕМБЛЕР! Плевать, что там можно насочинять в макросах, хоть "main={return 'Hello,world!';}", давайте обсудим же чистый свой асм!Цитата Славян Друг мой, это макрокоманда."if( x==y )" делать нельзя, ибо нет такой готовой. Цитата Jin X 1. Потому что fasm - не ассемблер, а компилятор оного. В том же fasm можно писать так: invoke MessageBox, 0, invoke GetCommandLineW, 'Command line', MB_OK 2. Потому что видел в Си-вижуалке (при включённых настройках в оптимизации, конечно), что он пихает часть аргументов в стэк, а меж ними ещё какие-то завершающие/(грядущие?) расчёты идут. И это - неспроста! Значит так быстрее будет. В этом же invoke (блин, опять про макросы!) будет чёткая последовательность push'иков, что слегонца, но губит чистый ассемблер. Добавлено Хм... пардон, вики пишет, что fasm как бы и сколько-то ассемблер, и компилятор. Всё же в 99%-смысле это компилятор, думается мне. |
Сообщ.
#15
,
|
|
|
Цитата Славян @ При том, что тоже есть жёсткая привязка к конкретным регистрам, а не к reg1, reg2, reg3. Откуда ты это взял??? Я полез смотреть макрос, не увидел такого. Или плохо смотрел ... Покажи где ты это увидел! Добавлено Цитата Славян @ Потому что fasm - не ассемблер, а компилятор оного. Вот это поворот! А разве есть Стандарт Ассебмблера? |