![](https://webcf.waybackmachine.org/web/20230428105316im_/https://habrastorage.org/r/w780/getpro/habr/upload_files/931/05d/4de/93105d4de133bb46604be6ca4b22f65d.jpg)
Вот уже 10 лет прошло, как я переводил свои средства программирования в среду x86-64 для Windows 7. А как будто вчера было! Поскольку тогда многие особенности этой среды были для меня внове, они вызывали недоумение. Вот типичный пример.
Язык программирования низкого уровня
Вот уже 10 лет прошло, как я переводил свои средства программирования в среду x86-64 для Windows 7. А как будто вчера было! Поскольку тогда многие особенности этой среды были для меня внове, они вызывали недоумение. Вот типичный пример.
Речь пойдет о безымянных константах в программе, которые часто называют литералами. Если такой литерал нельзя использовать как непосредственный операнд в машинной команде, компилятору приходится выделять – а куда деваться! – этому литералу собственную память и далее оперировать адресом этой памяти.
Разумеется, всякий уважающий себя компилятор проверяет, а не было ли уже точно такого же литерала ранее, и тогда использует уже имеющуюся ссылку, не выделяя заново памяти.
Мне понадобился простой программируемый таймер, он же реле времени. Простая штуковина, которая в указанное время замыкает контакты. Одним словом, ничего сложного.
Вот только с началом санкций даже такое простое лабораторное оборудование купить стало невозможно. Вот хороший пример: http://www.optimum-lab.ru/product/tajmer-laboratornyj/. Отличное лабораторное устройство, но как почти прямо пишет продавец - купить его сейчас не так и просто. Другой случай: https://www.chipdip.ru/product/at8n-24-240v-ac-dc. Не такая удобная и привлекательная разработка как предыдущий вариант, зато в наличии. Но стоит почему-то непотребно много, когда для такой задачи достаточно обычного реле и таймера. А этот вариант: https://www.chipdip.ru/product0/8002563209 совмещает нездоровую цену и нездоровые сроки поставки.
Какой компьютер без демосцены? Обратимся к классике от @Manwe_SandS@frog:
До моего визита на Assembly'99 я каждый pаз удивлялся pезультатам голосования на заpубежных demo party. Мне было непонятно, как столько людей могут отдавать голоса за pаботы состоящие из тупой (я пpошу пpощения, но это именно так) последовательности эффектов - плазмы, туннеля, огня, вpащающегося куба (тоpа) и пpочих подобных вещей, не объединенных никаким сюжетом, не несущими никакой идеи.
То что нужно! Возьмём первый попавшийся релейный компьютер и понаделаем эффектов.
Скомпилированное приложение является «чёрным ящиком». Чтобы туда заглянуть, восстановить алгоритм работы применяется реверс‑инжиниринг. Это непростой навык с высоким порогом входа. В статье мы попробуем взять дизассемблер, несложную задачку и пойдём в бой. Материал будет полезен тем, кому хочется с чего-то начать и погрузиться в тему реверса.
В ходе нашего погружения разберем, какие инструменты использовать, с какой стороны подходить к решению подобных задач, разберём различные теоретические моменты. Для углублённого изучения будут ссылки на дополнительную литературу.
Разрабатывая код для очень узких мест, привычного стандартного набора средств и отладчиков зачастую не хватает, когда нам требуется отладить фрагмент алгоритма именно в конкретном случае, в конкретном состоянии окружения и массивов данных.
Требуется вручную в конкретных точках во время пошаговой отладки выставлять все необходимые специфические значения по нужным регистрам, чтобы отследить реакцию кода в исключительно данном моменте и стараясь не упустить ни бита из внимания.
Подавляющее большинство средств отладки не имеют функции отката во времени, что могло бы гораздо упростить отладку в случаях проскока критически важных команд, где значения регистров были очень показательны, но утерялись в данной итерации.
В таких случаях удобно было бы использовать не классическую пошаговую эмуляцию, а более‑менее точную симуляцию с исполнением кода в цикле парсинга инструкций и записью в журнал состояний всех регистров на отдельных операциях всех итераций.
Некоторое время я был занят написанием простенького редактора для языка ассемблер под ARM Cortex семейства микроконтроллеров (подробности в моих статьях), и вот сейчас, поднакопив некоторый опыт как в части самого ассемблера так и способов написания программ в них решился на написание нового редактора.
Плюс еще подоспел интерес к RISC‑V архитектуре и было принято решением делать редактор который смог бы редактировать программы на ассемблере для различных архитектур (в том числе может быть и с лагеря AVR кто нить захочет присоединиться).
В общем подумалось: а что если попытаться создать asm‑base'д язык программирования который при выборе архитектуры просто бы транслировался автоматически в асм инструкции выбранной платформы?
В первой части были обзорно описаны многие разные процессоры до середины 90-х. Во второй части был обзор процессоров мейнфреймов IBM. Недавно мне предоставилась возможность немного попрограммировать для PowerPC, на основе чего появилась возможность добавить ещё одну часть к этим обзорам.
Игры не использующие мапперы в NES ограничены, 16 кб PRG ROM (хранилище программного кода) и 8 кб CHR ROM (хранилище графики). С развитием разработки игр на NES, встал вопрос, а как увеличить данные ограничения и на помощь пришли микросхемы мапперы. Что же такое мапперы мы и разберем сегодня и как их использовать в своем коде.
Для более глубокого понимания как происходит ветвление в программах написанных на ассемблере 6502 необходимо углубиться в флаги и понять какие команды влияют на тот или иной флаг. Это поможет избежать множество ошибок связанных с не очевидностью ветвления вашей программы.
Привет, Хабр!
В прошлой статье я рассказывал об ускорении копирования элементов одного слайса в другой с помощью средств Go. В этот раз я решил пойти дальше и посмотреть, что можно достичь, начав разговаривать с процессором на его языке. Я выбрал одну из оптимизированных версий функции Copy
в качестве объекта исследования из решения задачи VK Cup'22/23, которая копирует только синий компонент RGBA в Paletted картинку. Если интересно узнать как её ускорить почти в 10 раз, прошу под кат.
Ранее я уже писал статью о выводе спрайтовой графики на экрана с использованием регистра OAMDATA ($2004), но это подходит лишь для экспериментов и вывода некой статической картинки. Но движение либо анимация будет приводить к появлению различных артефактов наслоению спрайтов, моргание кадра, и так далее. Что бы этого избежать следует сформировать для каждого кадра буфер спрайтов и вывести на экран.
Векторы прерывания в формате программирование на ассемблере 6502, можно представить как всем хорошо известный патерн event-observer в высокоуровневых языках программирования. Конечно же можно реализовать данный патерн и на ассемблере но я его привел для большего понимания работы вектора прерывания...
Я несколько раз задавался вопросом а как сделать прокрутку фона как в марио или черном площе, и постепенно подобрался к выводу что надо перерисовать nametable динамически в момент аппаратной прокрутки. Объяснение и код как это сделано на ассемблере 6502 в данной статье.
В статье вы узнаете как сделать маленькие программы для MS-DOS на ассемблере, я покажу как рисовать 2D графику напрямую в видео-буфер. Может быть, вы даже вдохновитесь на создание собственного демо, которое будет ставить рекорды по размерам исполняемого файла.
Здорово, когда программы разрешают себя отлаживать: какие бы тайны ни скрывали, выдадут. Честным программам скрывать нечего, но встречаются и вредные: такие программы мешают себя изучать, а то и вовсе отказываются работать.
Отладчик поможет изучить зашифрованный код. Программа расшифровывает код перед выполнением: проще остановить программу отладчиком и исследовать, чем расшифровывать код самостоятельно. Программа сопротивляется отладке, когда хочет этому помешать.
Посмотрим, как справиться с противодействием отладке на примере 1337ReverseEngineer's The Junkrat https://crackmes.one/crackme/62dc0ecd33c5d44a934e9922 .
Ваш аккаунт