Обновить
59.8

Assembler *

Язык программирования низкого уровня

Сначала показывать
Порог рейтинга
Уровень сложности

Реализация алгоритма PolyUnpack для распаковки вредоносного ПО

Время на прочтение9 мин
Охват и читатели519

Одним днём я читал отчёты по TI из различных источников. В одном из таких отчётов упоминался некий алгоритм для распаковки вредоносного ПО, под названием PolyUnpack. Мне стало интересно, и я решил изучить данную тему. Оказалось, что в Интернете очень мало информации по данному алгоритму. Из интересного я нашёл статью, в которой впервые был описан алгоритм и чью-то курсовую работу.

Я решил написать свою реализацию данного алгоритма, так как часто приходится иметь дело с запакованным ВПО. В этой статье я расскажу, в чём заключается алгоритм, как я его реализовал, с какими проблемами я столкнулся и какие есть альтернативы для распаковки вредоносов. В конце я оставил ссылку на GitHub.

Читать далее

Низкоуровневое программирование под 8086 для любопытных, часть 1

Уровень сложностиСредний
Время на прочтение27 мин
Охват и читатели8.7K

Вторая часть уже здесь.

В первой части мы:

посмотрим, как работать с памятью и регистрами 8086

узнаем, как написать простую программу на ассемблере прямо в отладчике

изучим работу механизма прерываний и сделаем демонстрационный пример

Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности.

Примеры в бинарном виде доступны по ссылке

Читать далее

RISC-V: векторное расширение и алгоритм Витерби

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели1.5K

Недавняя публикация о векторном расширении RISC-V архитектуры, подтолкнула меня к мысли написать небольшую заметку об использовании данного расширения в задаче, имеющей практическое применение. После появления векторного расширения, в сети начали публиковаться статьи о применении RISC-V ядер с данным расширением в задачах, ранее в которых безальтернативно использовались только процессоры ЦОС. В данной статье рассматривается тест, в котором используется алгоритм декодирования Витерби - задача, требующая значительных вычислительных ресурсов.

Читать далее

Упражнение на ассемблер 8051 для LLM — или «игра в испорченный компилятор»

Время на прочтение5 мин
Охват и читатели1.8K

В очередной дискуссии о вреде и пользе новомодных "искусственных интеллектов" (или как точнее их называют LLM) в программировании, пришёл на ум такой простой эксперимент, который я приглашаю повторить всех желающих с разными вариациями.

Возьмём очень простую задачу - скомпилировать код. Для наиболее однозначного соответствия я беру код на ассемблере - и хочу получить HEX-файл. Это задача которую можно выполнить на бумажке (имея под рукой список команд и помня формат файла) - да в древние времена кому-то и приходилось такую "ручную компиляцию" выполнять. А что нам ответит, например DeepSeek?

Цель не в том чтобы снова поиронизировать над пропонентами LLM, а просто показать как кажущаяся "логика умозаключений" LLM не выстраивается в цепочку, иными словами рвётся от утверждения к утверждению. Думал также, что пример также может служить подспорьем в общении с менеджерами требующими бурного внедрения ИИ в разработку - но возможно он слишком технический.

Итак, заработает ли сгенерённый код?

Метод Монте-Карло в алгоритме обратного распространения ошибок с параллельными вычислениями

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели5.6K

Был проведён эксперимент для проверки, можно ли существенно уменьшить объём вычислений в алгоритме обратного распространения ошибок с параллельными вычислениями за счёт использования на каждом шаге обучения только части обучающих образцов, выбранных случайным образом, а также определение того, какой выигрыш по времени даст использование языка Ассемблера в самых внутренних циклах (в программе, написанной на языке C++).

За основу был взят классический персептрон и алгоритм обратного распространения ошибок, основанный на методе градиента, который объяснялся на курсе Mashine Learning Стэнфордского университета. Он был доработан, чтобы можно было использовать параллельные вычисления. Была написана программа на языке C++ для Linux, её функции (создание, обучение нейронной сети, распознавание данных, закачка больших файлов на сервер и т. п.) вызываются из программ, написанных на любых языках программирования, по протоколу Socket.

Для параллельных вычислений создаётся ntheads объектов нейронной сети, где ntheads — количество потоков (процессоров), в которые записываются части большого массива обучающих образцов, и на каждом шаге алгоритма обратного распространения ошибок совершается прямое и обратное распространение для каждого образца, имеющегося у объекта нейронной сети. Вычисления для каждого объекта производятся в отдельном потоке. Результатом этих вычислений являются суммарные градиенты слоёв сети каждого объекта, они суммируются друг с другом, и полученные градиенты используются для модификации матриц весов нейронной сети, которые затем прописываются во все слои сети объектов нейронной сети.

Читать далее

Термочувствительные кварцевые резонаторы: must have или must die?

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели3.8K


Парадоксально, но факт: у термочувствительного кварцевого резонатора РКТ-206 зарубежных аналогов можно считать, что не существует (даже буквы в наименовании кириллические). Западными (точнее восточными, так как речь идет про Seiko-Epson), как их модно стало называть, «партнерами» выпускались аналогичные термочувствительные кварцы, даже с похожим названием HTS-206. Но сейчас, как можете сами убедиться по этой ссылке, их выпуск прекращен «из-за уменьшения объема продаж». Изобилие, представленное на картинке (встреченной в английской Википедии), давно уже сошло на нет. Вроде бы кто-то из европейцев все еще выпускает термокварцы на частоты около 5 МГц, но на данный момент мне их разыскать не удалось.

В статье мы попробуем сначала разобраться, в чем достоинства и недостатки кварцевых датчиков температуры сравнительно с другими способами, а затем предпримем попытку построить датчик на основе термочувствительного кварца. Это все еще может быть практически целесообразным занятием, так как РКТ-206 легко приобрести и это не слишком дорого. По результатам сами можете прикинуть, насколько это целесообразно. Статья получилась неожиданно объемная, но без досконального копания в мелочах тему рассмотреть не получается.
Читать дальше →

Разгон Мандельброта: SIMD с бубнами, OpenMP и CUDA

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели2.4K

Построение множества Мандельброта — классический пример чрезвычайно параллельной задачи (embarrassingly parallel problem).

На первом курсе я впервые столкнулся с такой проблемой: тогда мы изучали SIMD-инструкции в курсе архитектур вычислительных систем. Эта тема сразу меня увлекла, и я захотел углубиться в дальнейшие оптимизации, но в течение семестра мне не хватало ни времени, ни знаний. Спустя год я решил восполнить этот пробел.

Вначале мы разберем наивную реализацию, поиграемся с интринсиками (intrinsics) и, не теряя переносимости, заставим компилятор генерировать нам SIMD-инструкции. Далее добавим многопоточность и в заключение обесценим все наши старания несколькими строчками на CUDA.

Возможно, эта статья поможет таким же, как я, впервые столкнувшимся с подобными задачами.

Читать далее

Векторизация в RISC-V. Основы

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели4K

Многие современные вычислительные задачи, в частности повсеместная обработка изображений и звука или работа с матрицами для ИИ, хорошо поддаются параллелизации на уровне данных.  Чтобы ускорить такие вычисления, производители процессоров добавили в архитектуры специальные SIMD инструкции, которые позволяют работать за одну инструкцию сразу с несколькими элементами.

В процессорах архитектуры x86 SIMD инструкции добавляются по принципу ad hoc. Из-за такого подхода, легаси и требований обратной совместимости в x86 накопилось много проблем.

Архитектура RISC-V относительно молодая, и при её разработке учтён прошлый опыт. В основе подхода к SIMD в RISC-V заложили идею чистого векторного процессора.

В этой статье рассмотрим основные принципы работы векторного процессора и базовые векторные операции с памятью и арифметикой.

Читать далее

Путь от Кода до Бинарного Файла

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели3K

Как же исходный код превращается в бинарный файл, который потом исполняется на компьютере? Не нашёл ни одной статьи, которая описывала бы полный процесс от начала до конца, поэтому я написал данный материал.

Читать далее

Как код С выполняется на процессоре ARM: разбор ассемблера

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели2.1K

При вызовах функций на языке С активно используется стек, который также именуется «стек вызовов». По мере того, как мы вызываем функции, они формируют так называемый «стек кадров». При каждом вызове функции образуется кадр, и эти кадры укладываются в стеке, где под них выделяется место. Далее в кадре из стека выделяется память под переменные и промежуточные значения. В кадре стека также содержится указатель на предыдущий кадр и значение счётчика команд. Та команда, которой оно соответствует, должна быть выполнена, как только кадр будет вытолкнут из стека. Далее давайте дизассемблируем вызовы функций в C, чтобы понять, как устроен стек кадров в ассемблере для ARM.

Читать далее

Сборка компьютера sap-1 (компьютер Бена Итера) в игре Turing Complete

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели3.2K

Здравствуйте, меня зовут Дмитрий. Сегодня я хотел бы рассказать вам про очень интересную игру Turing Complete. Я назвал бы её симулятор разработчика компьютеров. А также мы прямо в этой игре соберем компьютер SAP-1 более известный как компьютер Бена Итера.

Сразу скажу что мне игра очень понравилась. Ну вот знаете иногда про игру все говорят какая крутая игра, а ты в неё поиграешь и думаешь. Ну игра ничего особенного. А иногда встречаются игры про которые никто не говорит особо, но стоит в неё начать играть, как обнаруживаешь что ты просто не можешь от неё оторваться. Как раз эта игра относится ко второму типу. У меня такое было c Factorio я в неё тоже долго не мог перестать играть. Так что возможно я буду чуть-чуть предвзятым.

Читать далее

Реверс-инжиниринг 128-битного дракона

Время на прочтение12 мин
Охват и читатели5.2K


КДПВ для этой статьи сгенерировала программа размером всего в 16 байт. Под катом разберёмся в том, как в столь скромном объёме сумел спрятаться дракон и какие силы поддерживают его жизнь. Для лучшего понимания происходящего мы портируем эту красоту на JavaScript.

Читать дальше →

Маленький bool Дума

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели3.6K

Должен признать, у меня есть некая особая любовь к классическому DOOM. Несмотря на то, что игре уже 31 год, в нее все еще весело играть самому (хотя и выходит у меня так себе) или просто смотреть на то, как другие в нее играют (вот в этом я показываю себя лучше); и поскольку исходный код игры открыт, ей можно наслаждаться на любой современной платформе — ПК, смартфон, камера, осциллоскоп — да и вообще на любой вещи, которая придет вам в голову. В результате чего, благодаря ряду обстоятельств, я оказался меинтейнером нескольких связанных с DOOM пакетов в Fedora Linux.

Итак, за несколько месяцев до нового релиза, проект Fedora Linux осуществляет массовую сборку всех пакетов. Это имеет несколько преимуществ — позволяет убедиться в совместимости ABI, обновить статически линкуемые зависимости, использовать новые оптимизации компилятора и так далее. Как бы то ни было, с приближением релиза Fedora Linux 42 в середине апреля, пришло время для массовой пересборки, и как часто бывает, не все пакеты выжили. Одним из пакетов, которые не удалось собрать оказался chocolate-doom.

Читать далее

Ближайшие события

Опыт написания компилятора вручную

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.3K

Компилятор и главный репозиторий: GitHub

Здесь я напишу о своём личном проекте — компиляторе к C-подобному языку. Я не являюсь профессиональным разработчиком, изучал эту тему почти самостоятельно и не читал никакие книги по написанию компиляторов (но читал по операционным системам).

Читать далее

Самый странный лексический синтаксис, который я обнаружила, исследовав 42 языка программирования

Время на прочтение13 мин
Охват и читатели19K

Программирование — это не только алгоритмы и логика, но и удивительное разнообразие синтаксиса языков. Работая над новым средством подсветки синтаксиса для llamafile, разработчик Justine Tunney* исследовала 42 языка программирования — от классического C и экзотического Tcl до мощного Ruby. 

Justine делится своими открытиями о том, насколько причудливым и непредсказуемым может быть лексический синтаксис. Например, триграфы в C — устаревший инструмент для поддержки клавиатур с ограниченными символами, фиксированные длины строк в FORTRAN, вложенные комментарии в Haskell или строки с двойными квадратными скобками в Lua. Ruby вообще оказался чуть ли не самым сложным языком для подсветки из-за его контекстно-зависимого синтаксиса.

Под катом вы найдете описание разработки инструмента подсветки и исследование того, как языки программирования решают одни и те же задачи по-разному. Если вам интересны синтаксис, языковые особенности и сложности лексического анализа – эта статья для вас.

*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис

Читать далее

sincerely yours

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели681

Устало опускаю продолжение своего текста на Хабре “Остаюсь искренне ваш старпер и startuper" . Многие печали случились за прошедшие три года. На их фоне досада о зависших $20 членского взноса (я успел только взглянуть на dev console) в Google Play Market - шкурный, где-то даже непорядочный, пустячок. О котором нет-нет вспоминается только в дни, когда и десятая его часть, деликатно выражаясь, могла бы согреть кринжу не только душу.. Но “забыть, наплевать, растереть”!

Я - живой. “ «Хорошая жена, хороший дом – что еще надо человеку, чтобы встретить старость.”?! Да самую малость.

“Закрыть..” Слово “гештальт” мне не нравится. Есть в нём что-то опереточно “великосветское”, неизвестное и чуждое в уездном уральском городке.

“Закрыться”. Лучше, но всё ещё не то...

“Отпустить”. С любовью и благодарностью. Вот. Годится..

Существует легенда, авторство которой я так и не смог нагуглить.(Уж не сам ли я её, чего доброго, придумал?) Эта легенда гласит о том, что, якобы, в 1991-ом году в московскую компанию ДОКА обратился некий заграничный аноним (из Европы или США) с техзаданием на разработку игры “в железную дорогу”.

Игра получилась и хорошо разошлась на bbs и дискетах. Мне она попалась десятью годами позже в версии 2.0 о чём, более чем излишне подробно в ВК здесь.

По индустриальным меркам геймплей игры тянет разве что на “удовлетворительно”. Рядовая игрушка “на щелбаны”. Но “святые угодники”! Как красиво (v.1.5), грамотно (v 2.0) сделано внутри! И если от “акробатических этюдов” А.Снегова захватывает дух, а аккуратность А.Ефремова вызывает почтение, то КАК? Кааак!? Как вряд ли когда-либо толкавшая пальцем обесточенные паровозики Людмила Чуринова вышла на artwork в стиле ДетГиз лубка?! Потрясающее попадание в эпоху и возраст самодельных проволочных телефонов, телеграфов Морзе и проносящихся мимо в клубах паровозного дыма литерных поездов!

Читать далее

Решаем тесты безупречно в MyTestX

Время на прочтение4 мин
Охват и читатели7.8K

Мы сидели с друзьями на зимней сессии и готовились к экзамену по основам алгоритмизации и программирования. Экзамен состоял из двух частей: тестовая часть и практика. Тестирование у нас обычно проводится с использованием MyTestX. Это примитивное ПО для проведения компьютерного тестирования. Тем не менее почти на любом экзамене или зачете у нас используется именно эта программа.

И тут один из моих друзей говорит: "А давай взломаем MyTest". Мысли о взломе различного ПО у нас возникали часто, но обычно в виде шутки. Но в данном случае я подумал, а почему бы и нет? Вряд ли разработчик при создании своего творения озаботился о безопасности или обфусцировал свой код. Под взломом я подразумеваю изменение некоторых байтиков в программе, чтобы проходить тесты на высокие баллы. Как окажется в дальнейшем, я был прав, и мне удастся довольно просто сделать так, чтобы результаты моих тестов были безупречными.

Читать далее

Упрощаем «простой» ELF

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели4.8K

Давайте-ка напишем простую программу для Linux. Насколько трудной она может быть? Только тут надо учесть, что простота противоположна сложности, но не трудности*, и создать нечто простое на удивление трудно. А что останется, если избавиться от сложности стандартной библиотеки, всех современных средств безопасности, отладочной информации и механизмов обработки ошибок?
Читать дальше →

256 байт веселья, или как развлечь себя Ассемблером когда скучно

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели19K

Это еще одна статья про демосцену, сайзкодинг, ассемблер, MS‑DOS и ретрокодинг. То есть, о том, как ночами напролет добровольно и бесплатно писать бесполезный и очень трудоемкий код, и получать от этого массу удовольствия (и седую бороду). Даже если вы уже пробовали и вам не понравилось, вам все равно стоит почитать. Возможно, вы что‑то делали не так. Например, использовали не те буквы и цифры. А еще тут есть подборка «демок» размером в 256 байт!

Читать далее

Стековая виртуальная машина на языке Си

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели7.1K

Разработка виртуальных машин может быть не только интересным занятием на вечер, но также и полезным приложением при обучении студентов языку ассемблера на предметах ОАиП (основы алгоритмизации и программирования) и ААС (архитектура аппаратных средств). Целью данной статьи станет создание простой стековой виртуальной машины с собственным языком ассемблера, способным выполнять операции условного и безусловного переходов, инкрементирования и декрементирования чисел, загрузки и выгрузки значений в стек. Машина получится минималистичной и будет обладать лишь 10-ью инструкциями, на основе которых можно будет далее вполне корректно создать собственный высокоуровневый язык программирования.

Читать далее