Сообщение Запуск нейтивного ассемблера из C# на лету от 31.01.2022 5:08
Изменено 31.01.2022 5:10 Shmj
Запуск нейтивного ассемблера из C# на лету
Интересная, оказывается, есть возможность почти прямо из коробки.
Пример: https://github.com/WhiteBlackGoose/AsmToDelegate
С помощью https://github.com/icedland/iced из ассемблерных инструкций делается массив байт машинных инструкций — внутри C# проекта прямо. На лету. Получается просто массив двоичных данных. Потом этот массив записывается в память и с помощью такой магии:
— получаем делегат. Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме
Пример: https://github.com/WhiteBlackGoose/AsmToDelegate
С помощью https://github.com/icedland/iced из ассемблерных инструкций делается массив байт машинных инструкций — внутри C# проекта прямо. На лету. Получается просто массив двоичных данных. Потом этот массив записывается в память и с помощью такой магии:
(delegate* unmanaged[Cdecl]<TIn1, TIn2, TIn3, TOut>)s.Pointer;
— получаем делегат. Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме
Запуск нейтивного ассемблера из C# на лету
Интересная, оказывается, есть возможность почти прямо из коробки.
Пример: https://github.com/WhiteBlackGoose/AsmToDelegate
С помощью https://github.com/icedland/iced из ассемблерных инструкций делается массив байт машинных инструкций — внутри C# проекта прямо. На лету. Получается просто массив двоичных данных. Потом этот массив записывается в память и с помощью такой магии:
— получаем делегат. Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме
P.S.
А вот из C++ x64 теперь нельзя вызвать __asm инструкцию — MS данную возможность отключила: https://rsdn.org/forum/cpp/4585123.all
Пример: https://github.com/WhiteBlackGoose/AsmToDelegate
С помощью https://github.com/icedland/iced из ассемблерных инструкций делается массив байт машинных инструкций — внутри C# проекта прямо. На лету. Получается просто массив двоичных данных. Потом этот массив записывается в память и с помощью такой магии:
(delegate* unmanaged[Cdecl]<TIn1, TIn2, TIn3, TOut>)s.Pointer;
— получаем делегат. Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме
P.S.
А вот из C++ x64 теперь нельзя вызвать __asm инструкцию — MS данную возможность отключила: https://rsdn.org/forum/cpp/4585123.all
Автор: SWW
Дата: 21.01.12
Дата: 21.01.12