Обновить
49.67

Assembler *

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

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

Ретро-разработка для первой портативной консоли из далекого 1979 года

Время на прочтение11 мин
Количество просмотров15K


В 1974 году Texas Instruments выпускает первые 4-битные микроконтроллеры семейства TMS1000, а Intel в 1976 начинает производство 8-битных микроконтроллеров своей известной серии MCS-48. И тут началось.

Создание эмулятора аркадного автомата. Часть 3

Время на прочтение19 мин
Количество просмотров5.6K
image

Части первая и вторая.

Эмулятор процессора 8080


Оболочка эмулятора


Теперь у вас должны быть все необходимые знания, чтобы приступить к созданию эмулятора процессора 8080.

Я постараюсь, чтобы мой код был как можно более понятным, каждый опкод реализован отдельно. Когда вы освоитесь с ним, то, возможно, захотите переписать его для оптимизации производительности или повторного использования кода.

Для начала я создам структуру памяти, которая будет содержать поля для всего, что показалось мне необходимым при написании дизассемблера. Также там будет место для буфера памяти, который будет представлять собой ОЗУ.
Читать дальше →

Создание эмулятора аркадного автомата. Часть 2

Время на прочтение12 мин
Количество просмотров4.8K
image

Первая часть здесь.

Дизассемблер процессора 8080


Знакомство


Нам понадобится информация об опкодах и соответствующих им командах. Когда вы будете искать информацию в Интернете, то заметите, что есть много перемешанных сведений о 8080 и Z80. Процессор Z80 был последователем 8080 — он выполняет все инструкции 8080 с теми же hex-кодами, но также имеет и дополнительные инструкции. Думаю, пока вам стоит избегать информации о Z80, чтобы не запутаться. Я создал таблицу опкодов для нашей работы, она находится здесь.

У каждого процессора есть написанное изготовителем справочное руководство. Обычно оно называется как-то наподобие «Programmer's Environment Manual». Руководство для 8080 называется «Intel 8080 Microcomputer Systems User's Manual». Его всегда называли «справочником» («data book»), поэтому я тоже буду так его называть. Мне удалось скачать справочник по 8080 с http://www.datasheetarchive.com/. Эта PDF представляет собой некачественный скан, так что если найдёте версию получше, то используйте её.
Читать дальше →

Создание эмулятора аркадного автомата. Часть 1

Время на прочтение11 мин
Количество просмотров6.5K
image

Написание эмулятора аркадного автомата — это замечательный учебный проект, и в этом туториале мы очень подробно рассмотрим весь процесс разработки. Хотите по-настоящему разобраться в работе процессора? Тогда создание эмулятора — наилучший способ его изучения.

Вам потребуется знание C, а также пригодится знание ассемблера. Если вы не знаете язык ассемблера, то написание эмулятора — лучший способ освоить его. Также вам нужно будет освоить шестнадцатеричную математику (также известную как base 16 или просто «hex»). Я расскажу и об этой теме.

Я решил выбрать эмулятор автомата Space Invaders, в котором используется процессор 8080. Эта игра и этот процессор очень популярны, потому в Интернете можно найти о них кучу информации. Для завершения проекта она вам понадобится.

Весь исходный код туториала выложен на github. Если вы не освоили работу с git, то на странице github есть кнопка «Download ZIP», позволяющая скачать архив со всем кодом.
Читать дальше →

Как сжать загрузчик для STM8 до размера 8 байт в памяти FLASH

Время на прочтение16 мин
Количество просмотров5.6K
Со времени написания предыдущей статьи ” Как сжать загрузчик для STM8 до размера 18 байт в памяти FLASH” появились две версии загрузчика STM8uLoader . Загрузчик STM8uLoader версии $36 научился передавать управление прикладной программе по любому адресу в памяти RAM без участия хост-программы. Размер 18 байт загрузчика в памяти FLASH не изменился, в области OPTION Bytes размер увеличился до 53 байта (занял все доступное пространство).

В отдельную ветку выделилась версия $0D загрузчика. Основное требование к этой версии: максимально сжать код. На сегодняшний день размер кода во FLASH памяти 8 байт в EEPROM памяти 35 байт.
Читать дальше →

Почти все, что вы хотели знать про плавающую точку в ARM, но боялись спросить

Время на прочтение10 мин
Количество просмотров29K
Привет, Хабр! В этой статье я хочу рассказать про работу с плавающей точкой для процессоров с архитектурой ARM. Думаю, эта статья будет полезна прежде всего тем, кто портирует свою ОС на ARM-архитектуру и при этом им нужна поддержка аппаратной плавающей точки (что мы и делали для Embox, в котором до этого использовалась программная реализация операций с плавающей точкой).

Итак, приступим.
Читать дальше →

Ускоряем умножение матриц float 4x4 с помощью SIMD

Время на прочтение19 мин
Количество просмотров22K
Уже немало лет прошло, как я познакомился с инструкциями MMX, SSE, а позже и AVX на процессорах Intel. В своё время они казались какой-то магией на фоне x86 ассемблера, который уже давно стал чем-то обыденным. Они меня настолько зацепили, что пару лет назад у меня появилась идея написать свой собственный софт рендерер для одной известной игры. Сподвигло меня на это то, какую производительность обещали эти инструкции. В какой-то момент я даже думал об этом написать. Но писать текст оказалось куда сложнее кода.

В то время я хотел избежать проблем с поддержкой на разных процессорах. Хотелось иметь возможность проверить мой рендерер на максимально доступном количестве. У меня до сих пор остались знакомые со старыми AMD процессорами, и их потолок был SSE3. Поэтому на тот момент я решил ограничиться максимум SSE3. Так появилась векторная математическая библиотека, чуть менее, чем полностью реализованная на SSE, с редким включением до SSE3. Однако в какой-то момент мне стало интересно, какую максимальную производительность я смогу выжать из процессора для ряда критичных операций векторной математики. Одной из таких операций является умножение матриц float 4 на 4.

Если интересно, что из этого получилось, добро пожаловать под кат

Реверсим «Нейроманта». Часть 4: Звук, анимация, Хаффман, гитхаб

Время на прочтение17 мин
Количество просмотров5.1K

Привет, как вы уже поняли, это продолжение моей истории реверс-инжиниринга и портирования «Нейроманта».



Реверсим «Нейроманта». Часть 1: Спрайты
Реверсим «Нейроманта». Часть 2: Рендерим шрифт
Реверсим «Нейроманта». Часть 3: Добили рендеринг, делаем игру

Сегодня начнём с двух хороших новостей:


  • во-первых, я больше не один — к проекту присоединился и уже успел внести ощутимый вклад пользователь viiri;
  • во-вторых, теперь у нас есть открытый репозиторий на github.

В целом, дела идут очень неплохо и, возможно, скоро мы получим хоть сколько-то играбельный билд. А под катом, как обычно, поговорим о том, чего и каким образом удалось достичь на текущий момент.

Ускорение конкатенации строк в Go своими руками

Время на прочтение8 мин
Количество просмотров19K


Сегодня мы будем разгонять склеивание коротких строк в Go на 30%. Причём для этого нам не нужно будет модифицировать сам Go, всё это будет реализованно в виде сторонней библиотеки.


Под катом вас ждут:


  • Сравнение +, strings.Builder и собственной функции конкатенации
  • Детали внутреннего устройства строк в Go
  • Совсем немного ассемблера

Данную статью можно также считать предлогом обсудить CL123256: runtime,cmd/compile: specialize concatstring2. Идеи по улучшению этого change list'а приветствуются.

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

Запускаем ReactOS с BTRFS раздела

Время на прочтение3 мин
Количество просмотров11K
Привет, Хабр!

Меня зовут Виктор, и в этом году я единственный студент в программе Google Summer of Code на проекте ReactOS. Сегодня я расскажу немного о том, что я делаю в рамках стажировки.

ReactOS поддерживает кучу всяких разных файловых систем для чтения и записи (fat32, ext2, ReiserFS, BTRFS), однако загружаться до сих пор умеет только с раздела, отформатированного в fat32. Этой весной я решил что пора начать исправлять эту ситуацию, и подал заявку на GSoC. И вот, спустя несколько месяцев я пишу этот пост :)

Почему BTRFS? Ответ прост — драйвер файловой системы WinBtrfs на текущий момент самый стабильный и полнофункциональный из всех, что включены в код РеактОС. На данном этапе, мы хотим пофиксить именно баги ядра, которые мешают использовать другие ФС для загрузки, так что баги драйвера ФС нам тут совсем ни к чему.


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

Реверсим «Нейроманта». Часть 3: Добили рендеринг, делаем игру

Время на прочтение11 мин
Количество просмотров6.9K

Привет, это уже третья часть из серии моих публикаций, посвящённых обратной разработке «Нейроманта» — видеоигрового воплощения одноимённого романа Уильяма Гибсона.


Реверсим «Нейроманта». Часть 1: Спрайты
Реверсим «Нейроманта». Часть 2: Рендерим шрифт

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

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

Особенности вызова функций в С++

Время на прочтение33 мин
Количество просмотров64K

Не так давно у меня произошёл очередной разговор с коллегой на извечную тему: "по ссылке, или по значению". В результате возникла данная статья. В ней я хочу изложить результаты моего исследования по этой и смежным темам. Далее будут рассмотрены:


  • Регистры и их назначение при вызове функций.
  • Передача и возврат простых типов и структур.
  • Как передача по ссылке и по значению влияют на оптимизации тела функции компилятором.
  • Как используется место при многочисленных вызовах функций.
  • Механизм виртуальных вызовов.
  • Оптимизация хвостовых вызовов и рекурсии.
  • Инициализация структур, массивов и векторов.

Осторожно! Статья содержит большое количество кода на C++ и ассемблере (Intel ASM с комментариями), а также множество таблиц с оценками производительности. Всё написанное актуально для x86-64 System V ABI, который используется во всех современных Unix операционных системах, к примеру, в Linux и macOS.

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

Неканонический режим терминала и неблокирующий ввод на nasm

Время на прочтение5 мин
Количество просмотров11K
Идея написания игры на языке ассемблера, конечно, вряд ли придёт кому-то в голову сама собой, однако именно такая изощренная форма отчетности уже долгое время практикуется на первом курсе ВМК МГУ. Но так как прогресс не стоит на месте, то и DOS, и masm становятся историей, а nasm и Linux выходят на первый план подготовки бакалавров. Возможно, лет через десять руководство факультета откроет для себя python, но речь сейчас не об этом.

Программирование на ассемблере под Linux, при всех своих плюсах, делает невозможным использование прерываний BIOS'a и как следствие обделяет функциональностью. Вместо них приходится использовать системные вызовы и контактировать с api терминала. Поэтому написать симулятор блек-джека или морского боя не вызывает больших трудностей, а с самой обычной змейкой возникают проблемы. Дело в том, что система ввода-вывода контролируется терминалом, а системными функциями Си напрямую пользоваться нельзя. Поэтому при написании даже довольно простых игр рождаются два камня преткновения: как переключить терминал в неканонический режим и как сделать ввод с клавиатуры неблокирующим. Об этом и пойдёт речь в статье.
Читать дальше →

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

Смешанный десятично-двоичный формат vs IEEE754

Время на прочтение5 мин
Количество просмотров6.2K
В предыдущем топике был рассмотрен новый формат представления десятичных чисел с плавающей точкой, который мы назвали смешанным десятично-двоичным форматом (СДДФ).

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

$F=SM_{2}10^{e}$


где $M_{2}$ и e — целые двоичные числа. Под двоичным эквивалентом десятичного числа подразумевается двоичный код этого десятичного числа в выбранном формате. Под десятичным эквивалентом двоичного числа подразумевается десятичный код этого двоичного числа.
Читать дальше →

Go 1.11: AVX-512 со вкусом Go

Время на прочтение7 мин
Количество просмотров8.3K


В Go 1.11 значительно обновлён ассемблер под платформу x86.


У программистов появится возможность использовать AVX-512 — новейшие инструкции, доступные в процессорах Intel.


Под катом:


  • Самые значительные обновления в cmd/asm (go tool asm)
  • Как был внедрён новый набор инструкций в Go ассемблер
  • Использование новых инструкций и специальных возможностей EVEX префикса
  • Уровень интеграции в тулчейн (рецепты обхождения текущих ограничений)
Читать дальше →

Как собрать досовский COM-файл компилятором GCC

Время на прочтение10 мин
Количество просмотров16K
Статья опубликована 9 декабря 2014 года
Обновление от 2018 года: RenéRebe сделал на базе этой статьи интересное видео (часть 2)

В минувшие выходные я участвовал в Ludum Dare #31. Но даже до объявления тем конференции из-за своего недавнего увлечения я хотел сделать олдскульную игру под DOS. Целевой платформой выбрана DOSBox. Это самый практичный способ запуска DOS-приложений несмотря на то, что все современные процессоры x86 полностью обратно совместимы со старыми, вплоть до 16-битного 8086.

Я успешно создал и показал на конференции игру DOS Defender. Программа работает в реальном режиме 32-битного 80386. Все ресурсы встроены в исполняемый COM-файл, никаких внешних зависимостей, так что игра целиком упакована в бинарник 10 килобайт.


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

Как обновление Rust 1.26 ускорило мой код в три с лишним раза

Время на прочтение13 мин
Количество просмотров21K
Хочу поделиться небольшой историей о мощи LLVM и преимуществах языков высокого уровня над ассемблером.

Я работаю в компании Parity Technologies, которая поддерживает клиент Parity Ethereum. В этом клиенте нам нужна быстрая 256-битная арифметика, которую приходится эмулировать на программном уровне, потому что никакое оборудование не поддерживает её аппаратно.

Долгое время мы параллельно делаем две реализации арифметики: одну на Rust для стабильных сборок и одну со встроенным ассемблерным кодом (который автоматически используется nightly-версией компилятора). Мы так поступаем, потому что храним 256-битные числа как массивы 64-битных чисел, а в Rust нет никакого способа умножить два 64-битных числа, чтобы получить результат более 64 бит (так как целочисленные типы Rust только доходят до u64). Это несмотря на то, что x86_64 (наша основная целевая платформа) нативно поддерживает 128-битные результаты вычислений с 64-битными числами. Так что мы разделяем каждое 64-битное число на два 32-битных (потому что можно умножить два 32-битных числа и получить 64-битный результат).
Читать дальше →

8088 MPH: мы сломаем все ваши эмуляторы

Время на прочтение16 мин
Количество просмотров16K
image

Одним из пунктов списка моих желаний после прочтения первого отчета с пати в 1991 году стало посещение европейской демопати и участие в соревнованиях compo. Я участвовал в NAID ’96 и даже занял там место, но моей мечтой всегда было соревноваться с лучшими из лучших. Я рад объявить о том, что спустя шесть месяцев упорной работы с хорошими друзьями и невероятно талантливыми людьми нам это удалось. Наше демо 8088 MPH победило в oldskool demo compo Revision 2015. (Моей личной победой стало то, что наше демо показали в compo последним, что стало знаком уважения организаторов.) 7 апреля 2015 года в мире не было эмуляторов IBM PC, способных правильно запускать наше демо; они зависали или вываливались ещё до завершения демо, а цвета были искажены. То же относится и ко всему остальному железу, кроме целевого (см. ниже). Чтобы увидеть, что такое 8088 MPH, я рекомендую вам посмотреть видео записи демо, запущенного на реальном железе:


В демо так много технологических открытий, сделанных впервые в мире, а мы эксплуатируем железо так, как никто до нас не додумывался, поэтому будет честным рассказать, как же нам это удалось. Одной из моих должностей была «организатор» демо, поэтому я расскажу о нём сцена за сценой, вкратце объяснив основы каждого трюка. О частях, написанный мной, я расскажу чуть подробнее, но для глубокого анализа технологий я буду обновлять этот пост, чтобы можно было оставить ссылки на посты reenigne, VileR и Scali. Мы надеемся, что этот рассказ привлечёт интерес к «олдскульному» программированию ПО для платформы. После прочтения этого обзорного поста рекомендую пройти по ссылкам на статьи, где подробнее рассматриваются отдельные части демо.

Go: ускоряем выборку больших таблиц из MySQL

Время на прочтение9 мин
Количество просмотров17K
Я использую Go для написания рекламной сети вот уже почти год. Разработку веду на сервере Intel i7-7700, 16Gb RAM, 256Gb SSD. И в скрипте который выполняется раз в сутки появилась задача выбрать все показы за прошедшие сутки и пересчитать на этой основе статистику за день сразу по нескольким объектам (сайт, кампания, баннер).

По идиомам Go делается всё достаточно тривиально:
Читать дальше →

Руководство по ассемблеру Go

Время на прочтение12 мин
Количество просмотров28K


Прежде чем заняться реализацией runtime и изучением стандартной библиотеки, необходимо освоить абстрактный ассемблер Go. Надеюсь, это руководство поможет вам быстро овладеть нужными знаниями.
Читать дальше →