Как стать автором
Обновить

Комментарии 22

НЛО прилетело и опубликовало эту надпись здесь
Шутки-шутками, но лучший макроассемблер на практике получается из C++.
Уже в нескольких проектах использовал ассемблер, написанный на C++ в виде кодогенерирующих функций типа

  void mov(Register dst32, int imm32)     { emit8(0xb8 + dst32); emit32(imm32); }
  void mov(Register dst32, Address src32) { emit8(0x8b); emit_addr(src32, dst32); }
  void push(Register dst32)               { emit8(0x50 + dst32); }
  void call(Address dst32)                { emit8(0xff); emit_addr(dst32, 2); }
  void call(Label target)                 { emit8(0xe8); emit_label(rel32); }
  void build_frame(int size)              { push(epb); sub(esp, size); }
  и т.д.


В результате код на таком «ассемблере» выглядит примерно так:

  build_frame(32);
  Register osr_buf = eax;
  for (int i = 0; i < num_locks; i++) {
    int slot_offset = monitor_offset - i * 8;
    cmp(Address(osr_buf, slot_offset + 4), 0);
    jcc(eq, done);
    mov(ebx, Address(osr_buf, slot_offset));
    mov(address_of_lock(i), ebx);
  }
  bind(done);
А почему не на C или на чистом ASM (__asm{...})?
Что полезного дает такой подход?
Видно же что можно скажем в цикле генерировать код (развернутый цикл, и тп). Это DSL для генерации кода, не непосредственно сам код.
О! Да это дает потрясающие средства генерации машинного кода с использованием всех прелестей объектно-ориентированного подхода. Пожалуй, стоит отдельную статейку на эту тему написать. В рамки одного комментария я точно не уложусь :)
Вкратце: динамическая кодогенерация, использование особенностей аппаратной платформы, независимость от синтаксиса встроенного ассемблера, будь то GCC, MSVC или что еще, тесная интеграция с кодом на C/C++.
Не заметил, что это все кодогенерация, подумал, что это просто обычный цикл :)
Примерно так же выглядит JIT-компилятор HotSpot для Java.
Последний раз в институте писал на masm32, причем как раз под винду. Действительно очень похоже на C получается. Кстати, в качестве IDE могу посоветовать RadASM — довольно удобная штука.
Да, masm хорошая вещь. Но радасм мне не нравится… По факту я пишу в фаре, а вот IDE лучше winasm studio. Замечательная, быстроразвивающаяся и очень удобная.
читал похожие статьи на wasm.ru лет 7 назад когда писал на асме под Win32 :) а именно туториалы от Iczelion wasm.ru/publist.php?list=1
Да, в свое время тоже много читал. Iczelion был практически первым, что я читал по этому делу.
Да-да-да, книжка (в формате chm по-моему) от Iczelion до сих пор лежит в документации у меня на винте :)
Там все практически без макросов, чистый ассемблер. Некоторые вещи просто классные.
А какой смысл использовать устаревшего, в общем-то, монстра MASM — когда есть мощный, простой, и удобный fasm?
в принципе масм развивается и с каждой версией визуал студио приходит новая версия. Но в данном случае, посмотрите первую строчку «В далеком 2001-ом году я проводил»… Последнее время я редко занимаюсь ассемблером, только как хобби. Но фасм… Не знаю, на любителя.
Любите ассемблер? Велкам на микроконтроллеры. Там и ограничение ресурсов и низкое быстродействие. И оптимизация всего и вся. А для PC даже как хобби не актуально уже :) ИМХО.
Ну уж в крайности то кидаться не надо? Может тогда микрокалькуляторы программируемые? Там вообще от 98 до 105 шагов программы. Микроконтроллеры не так интересны, как хотелось бы. А вот по винду вполне себе интересно покопаться во внутренностях, чтобы понимать, как что устроено. Например была у меня программа, переделка одного раздела из статьи Рихтера по перехвату апи внутри программы… Вот лежит, думаю тоже сюда выложить. С Си переделал на ассемблер + полезная информация о строении исполняемых файлов + интересная отладка )
Почему в крайности? Очень перспективная и быстро развивающаяся ниша. И ковыряться в них и отлаживать не менее интересно, а с практической точки зрения так куда более полезно.
Может быть… Последний раз я сталкивался с микроконтроллерами лет 7-8 назад. Когда в принципе и прекратил свои изыски в ассемблере. Сейчас асп.нет + джаваскрипт.
Да что вы говорите? А ну ка все забудут ассемблер, дядя Вася будет компиляторы писать?
Такое не забывается. Ассемблер вне времени )
Совершенно согласен! И тем более, это до сих пор машинный код! :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации