Как стать автором
Поиск
Написать публикацию
Обновить
58.45

Assembler *

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

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

Делись, рыбка, быстро и нацело

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

Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[1] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120. В переводе на Русский — МЕДЛЕННО! Тем не менее, возможность избежать инструкции деления в вашем коде — есть. И в этой статье, я расскажу как это работает, в частности в современных компиляторах(они то, умеют так уже лет 20 как), а также, расскажу как полученное знание можно использовать для того чтобы сделать код лучше, быстрее, мощнее.
Читать дальше →

Разработка Unix подобной OS — Драйверы символьных устройств (8)

Время на прочтение9 мин
Количество просмотров3.1K
В предыдущей статье мы ввели многозадачность. Сегодня пришло время рассмотреть тему драйверов символьных устройств.

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

Начнем с создания структуры устройства, затем введем базовую поддержку файлового ввода-вывода, рассмотрим структуру io_buf и функции для работы с файлами из stdio.h.
Читать дальше →

Разработка Unix подобной OS — Многозадачность и системные вызовы (7)

Время на прочтение8 мин
Количество просмотров2.5K
В предыдущей статье мы научились работать с виртуальным адресным пространством. Сегодня мы добавим поддержку многозадачности.
Читать дальше →

Архитектура и программирование Fairchild Channel F

Время на прочтение10 мин
Количество просмотров6.1K
«Channel F homebrew would be like programming sprites via hardware jumpers...»
/ chadtower, atariage forum /




Игровая приставка Fairchild Channel F, также известная как VES, появилась в ноябре 1976 года. В отличие от своих предшественников типа Ping-Pong, Tennis (в том же ряду — советский «Видеоспорт»), у неё было очень существенное отличие — наличие микропроцессора и картриджей с программами. До этого игры в приставках реализовывались на жёсткой логике — программа, в современном понимании, там отсутствовала.

Fairchild Channel F выпускалась вплоть до 1983 года. За это время было продано более четверти миллиона этих приставок и выпущено около 30-40 игр, некоторые из которых — уже в 2000-х годах.

Говоря о первенстве в плане использования микропроцессора стоит отметить, что RCA Studio II, о которой я рассказывал в прошлой статье, опоздала всего на пару месяцев, но оказалась существенно слабее Channel F, ввиду чего и провалилась по продажам. Впрочем, появление, менее чем через год, Atari VCS — вытеснило с рынка и Channel F.

Развития Fairchild_Channel_F, как такового, не было. В System II и нескольких клонах, типа Saba Videoplay 2 (1979), отличия состояли преимущественно в корпусе, джойстиках (кстати, все они понимали кроме обычных положений ещё и поворот ручки) и количестве микросхем. Архитектурно всё было практически идентично.

Что же собой представляет Channel F?

Профилирование со сверхсветовой скоростью: теория и практика. Часть 1

Время на прочтение13 мин
Количество просмотров12K
Привет! Из заголовка вы уже поняли, о чём я собираюсь рассказать. Тут будет много хардкора:
мы обсудим Java, С, С++, ассемблер, немного Linux, немного ядра операционной системы. А ещё разберём практический кейс, поэтому статья будет в трёх больших частях (достаточно объёмных).



В первой мы попробуем выжать всё возможное из существующих профилировщиков.
Во второй части сделаем собственный маленький профилировщик, а в третьей посмотрим, как же профилировать то, что профилировать не принято, потому что существующие инструменты не очень для этого подходят. Если готовы пройти этот путь — жду вас под катом :)
Читать дальше →

Разработка Unix подобной OS — Виртуальное адресное пространство (6)

Время на прочтение7 мин
Количество просмотров4.9K
В предыдущей статье мы рассмотрели основы работы в защищенном режиме IA-32. Сегодня пришла пора научиться работать с виртуальным адресным пространством.
Читать дальше →

Как не сделать самый быстрый strlen и найти недоработку в Visual Studio 2019 Community

Время на прочтение8 мин
Количество просмотров9.6K
На размышления меня натолкнула статья об использовании «странной» инструкции popcount в современных процессорах. Речь пойдет не о подсчете числа единичек, а об обнаружении признака окончания Си строки (нуль-терминированная строка).
Нуль-терминированная строка — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (NUL из кода ASCII, со значением 0).

Для определения длины таких срок применяется стандартная функция

size_t __cdecl strlen(char const* str)

Алгоритм работы которой можно описать на языке Си как:


size_t strlen_algo(const char* str)
{
	size_t length = 0;
	while (*str++)
		length++;
	return length;
}

Посмотрим, во что его превращает компилятор MS Visual Studio 2019 community (Release, x86):

08811F7h:
mov         al,byte ptr [ecx]  
inc         ecx  
test        al,al  
jne         main+0D7h (08811F7h) 
Читать дальше →

Встраиваемые функции в Go

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

Go позволяет писать на ассемблере. Но авторы языка написали такую стандартную библиотеку, что бы этого делать не пришлось. Есть способы писать переносимый и быстрый код одновремено. Как? Добро пожаловат под cut.
Читать дальше →

Разработка монолитной Unix подобной OS — GDT & IDT (5)

Время на прочтение5 мин
Количество просмотров3.9K
В предыдущей статье мы с вами реализовали менеджер динамической памяти.
Сегодня мы рассмотрим основы работы в защищенном режиме процессора Intel i386.
А именно: глобальную таблицу дескрипторов и таблицу векторов прерываний.
Читать дальше →

C, C++ и DotNet decompile — основы реверса. Решение задач на реверсинг с Root-Me. Часть 1

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

В данной статье 5 первых заданий с сайта Root-Me, узнаем основы дизассемблирования, решим задачи начального уровня реверса, а также декомпилируем dotNet приложение.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Разработка монолитной Unix подобной OS — Куча (4)

Время на прочтение7 мин
Количество просмотров3.1K
В предыдущей статье мы с вами реализовали системный журнал ядра. Теперь пришло время реализовать менеджер динамической памяти.
Читать дальше →

Разработка монолитной Unix подобной OS — Системный журнал ядра (3)

Время на прочтение3 мин
Количество просмотров4.6K
В предыдущей второй по счету статье мы с вами разработали необходимые функции для работы со строками из библиотеки С. В этом уроке мы реализуем полноценный отладочный вывод на экран — системный журнал ядра.
Читать дальше →

Отладка игр для NES: как она происходит сегодня

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

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

Инструменты отладки


Один из лучших способов отладки кода — использование отладчика. В некоторых версиях эмуляторов FCEUX и Mesen есть встроенный отладчик, позволяющий прерывать в любой момент времени выполнение программы для проверки работоспособности кода.


Отладчик эмулятора FCEUX

Стоит заметить, что этот способ больше подходит для продвинутых программистов, работающих с языком ассемблера. Но мы новички, поэтому будем писать на языке C (cc65). Разумеется, компилятор станет играть по своим собственным правилам, и нам будет трудно разбираться с машинным кодом, скомпилированным из кода на C.

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

Разработка монолитной Unix подобной OS — Библиотека С (2)

Время на прочтение3 мин
Количество просмотров5.3K
В предыдущей статье мы научились запускать Hello World ядро и написали пару функций для работы со строками. Теперь пришло время расширить библиотеку С чтобы можно было реализовать kprintf и другие необходимые функции. Поехали!
Читать дальше →

Разработка монолитной Unix подобной OS — Начало (1)

Время на прочтение4 мин
Количество просмотров12K
В связи с отрицательными отзывами пробной статьи «Разработка микроядерной Unix подобной OC — планировщик» я решил перезапустить серию статей с учетом некоторых замечаний. Теперь, осознав свою целевую аудиторию, я смог сместить фокус с подобных себе на тех кому это действительно нужно.
Читать дальше →

Волшебная сила макросов, или как облегчить жизнь ассемблерного программиста AVR

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

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

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

Разработка многозадачной микроядерной ОС — Планировщик

Время на прочтение6 мин
Количество просмотров17K
После того, как вы прочитали базовые шаги по написанию Hello World ядра из цикла имеющихся на Хабре статей, самое время приступить к серьезной разработке самых базовых инструментов: аллокатора кучи и планировщика.

Важно:
1. Эта серия уроков для новичков. Цель — сформировать целостную картину мира. Очень долго у меня в голове была теория Таненбаума и я не мог ее связать с практикой. Тем у кого то же самое — посвящаю эту статью.
2. Код самый простой и тупой, но максимально понятный. Моя цель дать вам понимание чтобы вы смогли написать свое ядро, гораздо более крутое чем это.
3. Репо опубликую как только посчитаю его готовым для широкого круга. Я пишу небольшую часть, отлаживаю, и снимаю видеоурок. У меня нет готового продукта.

Честно говоря я долго думал стоит ли начинать писать статьи и делать видеоуроки на столь изьезженную тему. Но страсть к системному программированию и отсутствие структурированной информации на русском языке все же подтолкнули меня на этот эксперимент. Посему, если труд мой окажется востребованным, статьи планирую выпускать не реже чем раз в месяц и не чаще чем раз в неделю.

Реверс-инжиниринг электрокарниза AM82TV

Время на прочтение7 мин
Количество просмотров7.7K
Есть у меня пара электрокарнизов компании Akko — AM82TV. Модель эта выделяется из собратьев наиболее полным набором интерфейсов управления. Шторами можно управлять по радиоканалу, есть “сухие контакты”, пофазное управление (замыканием управляющих проводов с сетевыми). Есть интерфейс RS485 — это, если захочется подключить шторы к “умному дому”. Можно также открыть/закрыть шторы просто дернув их рукой в нужном направлении. “Из коробки” не хватает, пожалуй, только web-интерфейса, ну и MQTT.

Электрокарнизы у меня уже давно, работают надежно, но время от времени стало появляться желание их разобрать — из любопытства посмотреть что внутри и есть ли возможность засунуть туда ESP8266 (или ESP32) с тем, чтобы добавить недостающее. Можно, конечно, подключить всё снаружи, но лучше если внешний вид останется прежним и всё будет спрятано внутри.

Не чини того, что не сломано — это не про меня. Поначалу я пытался гнать от себя дурные идеи, но со временем зуд усиливался и вот, настал момент, когда с ним уже было невозможно бороться. Я снял мотор с электрокарниза и разобрал его. Начальный осмотр должен был дать ответы на два вопроса: есть ли место для ESP8266 и можно ли использовать встроенный источник питания. Разобралось все просто. Достаточно открутить несколько винтов с торцов мотора. Единственно — шлицы винтов сделаны не под отвертку, а под шестигранный ключ torx. После этого можно извлечь содержимое — коллекторный мотор в одном корпусе с редуктором и датчиком вала двигателя, блок питания на 24 вольта и плату управления.
Читать дальше →

Грязные хаки ассемблера 6502

Время на прочтение10 мин
Количество просмотров22K
В этой статье перечислены некоторые трюки, которые применяли участники моего маленького конкурса программирования Commodore 64. Правила конкурса были просты: создать исполняемый файл C64 (PRG), который рисует две линии, чтобы сформировать изображение ниже. Побеждал тот, чей файл меньше по размеру.


Конкурсные работы публиковались в открытых твитах и личными сообщениями, которые содержали только байты PRG-файла и хэш MD5.
Читать дальше →

Портирование ОС на Aarch64

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

Aarch64 — это 64-битная архитектура от ARM (иногда её называют arm64). В этой статье я расскажу, чем она отличается от "обычных" (32-битных) ARM и насколько сложно портировать на него свою систему.


Эта статья — не детальный гайд, скорее обзор тех модулей системы, которые придётся переделать, и насколько сильно архитектура в целом отличается от обычных 32-битных ARM-ов; всё это по моему личному опыту портирования Embox на эту архитектуру. Для непосредственного портирования конкретной системы так или иначе придётся разбираться с документацией, в конце статьи я оставил ссылки на некоторые документы, которые могут оказаться полезны.

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