Комментарии 22
Шутки-шутками, но лучший макроассемблер на практике получается из C++.
Уже в нескольких проектах использовал ассемблер, написанный на 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++.
Вкратце: динамическая кодогенерация, использование особенностей аппаратной платформы, независимость от синтаксиса встроенного ассемблера, будь то GCC, MSVC или что еще, тесная интеграция с кодом на C/C++.
Примерно так же выглядит JIT-компилятор HotSpot для Java.
Последний раз в институте писал на masm32, причем как раз под винду. Действительно очень похоже на C получается. Кстати, в качестве IDE могу посоветовать RadASM — довольно удобная штука.
читал похожие статьи на wasm.ru лет 7 назад когда писал на асме под Win32 :) а именно туториалы от Iczelion wasm.ru/publist.php?list=1
А какой смысл использовать устаревшего, в общем-то, монстра MASM — когда есть мощный, простой, и удобный fasm?
Любите ассемблер? Велкам на микроконтроллеры. Там и ограничение ресурсов и низкое быстродействие. И оптимизация всего и вся. А для PC даже как хобби не актуально уже :) ИМХО.
Ну уж в крайности то кидаться не надо? Может тогда микрокалькуляторы программируемые? Там вообще от 98 до 105 шагов программы. Микроконтроллеры не так интересны, как хотелось бы. А вот по винду вполне себе интересно покопаться во внутренностях, чтобы понимать, как что устроено. Например была у меня программа, переделка одного раздела из статьи Рихтера по перехвату апи внутри программы… Вот лежит, думаю тоже сюда выложить. С Си переделал на ассемблер + полезная информация о строении исполняемых файлов + интересная отладка )
Почему в крайности? Очень перспективная и быстро развивающаяся ниша. И ковыряться в них и отлаживать не менее интересно, а с практической точки зрения так куда более полезно.
Да что вы говорите? А ну ка все забудут ассемблер, дядя Вася будет компиляторы писать?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Использование макросов в MASM на примере создания окна