Как стать автором
Обновить
71.94

Assembler *

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

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

Забытая повесть «Машины, пишущие код»

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

Патрик через минуту вернулся с небольшой пыльной коробкой. Мы с Дейвом смотрели, как Патрик ее открывает и достает сетевой свитч — такой староватый из тех времен, когда им еще делали железные корпуса. Он воткнул блок питания в розетку и аккуратно выпрямил шнур CAT-5, чтобы подключить этот свитч к нашей сети. Я хотел наорать на него за всю излишнюю осторожность в такой момент. Дейв сидел рядом со мной, нехарактерно тихо.

Я замер, пока у Патрика не получалось попасть шнуром в нужный порт. Я глядел на передние огоньки — Дейв, наверное, тоже. Мои глаза намокли. Патрик впихнул шнур. Сразу же огоньки загорелись и быстро замигали. Я почувствовал, как мои руки и лецо покраснели, а в углу глаза увидел как Дейв встал и открыл рот, будто пытаясь что-то сказать. Затем он нырнул лицом в сложенные руки, затем его вырвало.

Читать повесть
Всего голосов 11: ↑10 и ↓1+12
Комментарии10

Новости

Управление памятью в ассемблере для Apple Silicon

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

В статье мы познакомимся с языком ассемблера для Apple Silicon (ARM64). Рассмотрим основные регистры, запись данных из регистров в память и обратно. Затронем также и базовые навыки работы с LLDB.

Читать далее
Всего голосов 6: ↑6 и ↓0+6
Комментарии0

Глобально оптимальный, восьмой и наиболее быстрый вид интерпретаторов байткода

Уровень сложностиСложный
Время на прочтение15 мин
Количество просмотров6.2K

Совершать невозможное и раздавать пинки здравому смыслу — в этом и состоит жизнь членов Гуррен-Дана! (C) Камина

Эта статья вступает в техническую полемику со статьей 2015 года за авторством Atakua, подходы из которой я и атакую. Atakua исследует 7 видов интерпретаторов байткода, но делает это без уважения - быстрейшей оказывается двоичная трансляция, которая, по сути, уже не интерпретатор байткода, а форма Ahead-Of-Time компилятора. Эта двоичная трансляция транслирует байткод в машинный код, представляющий собой цепочку вызовов скомпилированных сервисных процедур. Тех самых, что в интерпретаторе байткода отвечают за выполнение каждого опкода.

Но Atakua не выжал из интерпретаторов байткода всю скорость которая возможна. Так что эта статья - туториал: как написать интерпретатор байткода, который может обгонять JIT/AOT-компиляцию по скорости. Интересно? Читайте дальше!

Бенчмарк прилагается. Будет немного хардкора и ни одной сгенерированной нейросетью картинки!

Читать далее
Всего голосов 74: ↑73 и ↓1+88
Комментарии63

Невероятно быстрый подсчёт байтов

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

Оказалось, что тема суммирования целых чисел в кодировке ASCII в Haswell со скоростью memcpy гораздо популярнее, чем я мог ожидать. Именно поэтому я решил поучаствовать и в другом челлендже в жанре HighLoad: подсчёт uint8. В настоящее время я занимаю всего лишь 13 место в списке лидеров, проигрываю первому месту около 7%, но уже узнал немало интересного. В этом посте я полностью опишу моё решение, в том числе, удивительный паттерн считывания из памяти. Используя его, можно примерно до 30% (по сравнению с обычным последовательным доступом) повысить скорость передачи в контексте одноядерных рабочих нагрузок, ограниченных размером кэша. По-видимому, этот метод малоизвестен.

Как и в других постах автора, программа настроена для следующих входных характеристик высоконагруженной системы: Intel Xeon E3-1271 v3 @ 3,60 ГГц, ОЗУ 512 МБ, Ubuntu 20.04. В ней используется только AVX2, а AVX512 не используется.

Читать далее
Всего голосов 14: ↑13 и ↓1+21
Комментарии10

Истории

Как создать простую операционную систему с нуля

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров9.4K

Многие разработчики хоть раз задумывались о том, чтобы создать свою собственную операционную систему (ОС). Это может показаться сложной задачей, но, если разбить процесс на этапы, создание минимальной ОС становится более реалистичным. В этой статье мы рассмотрим основные шаги создания простой операционной системы с нуля, а также инструменты и знания, которые могут вам понадобиться.

Читать далее
Всего голосов 19: ↑13 и ↓6+12
Комментарии22

Ассемблеры, 5 штук — быстрое знакомство для тех кто не знаком

Уровень сложностиПростой
Время на прочтение15 мин
Количество просмотров15K

Статья для тех кто не знаком с ассемблерами - но хочет взглянуть "одним глазком". Мы не сделаем вас гуру разработки на ассемблере за 15 минут - но покажем ассемблеры для нескольких популярных архитектур микроконтроллеров (ARM32, AVR, MSP430, 8051) - и для настольных наших компьютеров (x86 под Linux и DOS) - чтобы увидеть их различия и сходства - и не бояться погрузиться глубже, если что-то из этого может быть вам полезно.

Наша цель не призвать всех писать на ассемблере (ассемблерах!) - это не так уж сложно, но для большинства задач не очень практично. Цель именно познакомить! Чтобы было уже не страшно изредка заглянуть в потроха какой-то отладки - или сделать какую-то оптимизацию с ассемблерной вставкой - а может вы соберетесь написать компилятор или что-то в этом духе.

Бонусом - для любопытных - ассемблер для Intel-4004 - 4-разрядного процессора которому уже больше 50 лет. К нему будет также небольшой "интерактивчик".

Кто не боится - давайте посмотрим ближе!
Всего голосов 46: ↑43 и ↓3+56
Комментарии85

Разбор JIT-Компилятора AsmX и краткая биография его создателя

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

На выходных я наткнулся на статью от комментатора, в которой был представлен  Обзор языка программирования AsmX. После прочтения этой статьи я решил поискать в Telegram диалоги создателя языка, к которым мы вернемся позже. Цитирую список пунктов от обзорщика Василия, с которыми я полностью согласен:

Читать далее
Всего голосов 10: ↑4 и ↓6-1
Комментарии7

Разыменовываем NULL на RISC-V ядре scr1

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

Во время работы в ASIC дизайн центре я потратил немало времени на отладку ошибок и падений ядра, просматривая временные диаграммы на шинах AXI от процессора к памяти. Иногда оказывалось, что адрес чтения из памяти оказывался 0x00000000 - классический случай разыменования нулевого указателя в C. На системах с ОС это приводит к известному всем C программистам segfault-у. И в bare metal системах разыменование NULL может приводить к интересным ситуациям. В этой статье рассмотрим, что происходит при разыменовании NULL, используя для пример open source RISC-V ядро scr1 и open source инструмент симуляции RTL Verilator.

Читать далее
Всего голосов 24: ↑24 и ↓0+33
Комментарии6

Путешествие в мир эмуляторов микропроцессоров

Уровень сложностиСредний
Время на прочтение24 мин
Количество просмотров12K

Всем привет!

Не так давно на Хабре появился занятный пост о разработке процессора, и я понял, что созрел для своей первой статьи как раз в этом направлении.

Тема разработки эмуляторов олдскульных микропроцессоров типа того же Intel 8080 не нова. Если вы уже разбираетесь в вопросе, то для вас этот пост не будет чем-то новым, разве что вы увидите еще один подход к реализации такого проекта. Для тех, кто ничего об этом не слышал – прошу под кат.

Читать далее
Всего голосов 47: ↑46 и ↓1+61
Комментарии17

Числа с фиксированной запятой для NES/DENDY

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

Консоль Dendy в первую очередь ассоциируется с относительно простыми играми (Super Mario Bros, Duck Hunt, Battle City и т. д.), которые обычно не требуют сложных расчётов и обходятся целочисленной математикой. Но как только нужно сделать трёхмерную графику или сложную физику, сразу появляется потребность в точных вычислениях и дробных числах.

Самым простым и быстрым способом программного представления дробей являются числа с фиксированной запятой (Fixed‑point числа). О реализации такой арифметики для NES/Dendy мы и поговорим.

Читать далее
Всего голосов 22: ↑22 и ↓0+35
Комментарии20

Quake на плате микроконтроллера с 276 килобайтами ОЗУ

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

Введение


В прошлом году в рамках празднования 30-летней годовщины Doom мы продемонстрировали его порт для платы Sparkfun Thing Plus Matter MGM240P. В этом году мы портируем Quake на плату Arduino Nano Matter.
Читать дальше →
Всего голосов 21: ↑20 и ↓1+28
Комментарии6

Тетрис на ATtiny10

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

Решив использовать последние дни отпуска для приведения имеющихся у меня запасов электронных компанентов к некоторому подобию порядка я наткнулся на неизвестную михросхему SOT-23-6 с еле читаемой маркировкой.

Читать далее
Всего голосов 130: ↑130 и ↓0+176
Комментарии31

Ассемблер для программистов на языках высокого уровня: условные конструкции

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

В предыдущей статье мы познакомились с основами синтаксиса языка ассемблера и смогли создать программу на основе всего двух команд. Впечатляющий результат!

На этом уроке мы изучим новые команды и воспользуемся этими знаниями, чтобы перенести на язык ассемблера первую конструкцию высокого уровня: условные конструкции.
Читать дальше →
Всего голосов 44: ↑42 и ↓2+55
Комментарии11

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

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань

Ассемблер для программистов на языках высокого уровня: Hello World

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров25K

Если вы начинали изучение программирования с JavaScript, Rust, C или любого другого высокоуровневого языка, то ассемблерный код может показаться вам непонятным или даже пугающим.

Рассмотрим следующий код:

section .data
  msg db "Hello, World!"

section .text
  global _start

_start:
  mov rax, 1
  mov rdi, 1
  mov rsi, msg
  mov rdx, 13
  syscall

  mov rax, 60
  mov rdi, 0
  syscall

К счастью, по второй строке мы можем понять, что он делает.

Здесь нет ничего привычного нам: мы не видим ни условных операторов, ни циклов, нет никакого способа создавать функции… Да даже у переменных нет имён!

С чего же вообще начать?

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

Завершив прочтение этого руководства, вы сможете ориентироваться в ассемблерном коде, будете знать, где искать информацию, и даже сможете самостоятельно писать простые программы.
Читать дальше →
Всего голосов 61: ↑57 и ↓4+69
Комментарии41

Знакомимся с трансляторами ассемблера для ПК

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров4.8K

Привет, Хабр! Сегодня я хочу поделиться своими наблюдениями и опытом по работе с различными ассемблерами. Я сам пишу на языке C и относительно редко касался темы ассемблера. Но недавно решил восполнить этот пробел в знаниях и посмотреть на различные ассемблеры. В данной статье мы не будем рассматривать ARM, AVR и другие микроконтроллерные архитектуры, а сосредоточимся исключительно на компьютерных ассемблерах. Давайте не будем судить строго, ведь это скорее исследовательский опыт, чем глубокое погружение.

Читать далее
Всего голосов 11: ↑7 и ↓4+6
Комментарии15

Ещё слово о процедурной графике

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

Не так давно я публиковал здесь небольшой обзор по работам в жанре процедурной графики и, в частности, призывал поучаствовать в конкурсе. Упомянутый мной конкурс на фестивале Chaos Constructions состоялся - было представлено семь работ размером до 1кб, о которых, особенно о двух собственного изготовления, я и хочу рассказать.

Первая работа называется Way и написана для платформы Sony Playstation 1 (PSX) на ассемблере MIPS R3000.

Читать далее
Всего голосов 32: ↑32 и ↓0+44
Комментарии6

Симкод — современный язык ассемблера

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

Начну с определений.

Симкод — это последовательность симкоманд.

Симкоманда — это символьная машинная макрокоманда с Си-подобным синтаксисом.

Например, ассемблерной команде add rax, rbx соответствует симкоманда rax += rbx.

Симкод позволяет выразить любой ассемблерный код [и как следствие машинный], только в более человекочитаемом виде. Однако, симкод не пытается назначить символьное обозначение для абсолютно каждой ассемблерной команды — те команды ассемблера, которые не имеют символьной записи, оставляются как есть. Таким образом, симкод является надмножеством ассемблера.
Читать дальше →
Всего голосов 56: ↑51 и ↓5+61
Комментарии50

Райтап на таск «Крестики» с Codeby Games | CTF, реверс-инжиниринг

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров1.1K

Хотели порешать эти ваши реверс-инжиниринги на CTF? Да ещё и на C++ с Windows Forms? К тому же чтобы он был не сложным и в райтапе были объяснения? Тогда вам сюда 😉

Ссылка на задание (файлы): нажми на меня :)

Читать далее
Всего голосов 3: ↑3 и ↓0+7
Комментарии0

Linux Pipes – медленные

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

Я пишу программу для сверхбыстрого кодирования/декодирования азбуки Морзе и использую pipe для передачи данных. При этом pipe работает очень медленно. Давайте разберемся почему.

Читать далее
Всего голосов 34: ↑34 и ↓0+42
Комментарии11

Работа с файлами в ОС CP/M на компьютере «Profi»

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

В предыдущий раз пришлось уделить внимание и бегло рассмотреть работу с файлами в ОС CP/M. А так как «Быстро, хорошо не бывает» (с) было приято решение о необходимости подробного и основательного разбора данного вопроса, так что бы в будущих статьях не тратить на него время и место.

Статья была опубликована в 2020 году в 28 номере журнала по ZX Spectrum'у "ЗаRulem Печатное Слово".

Статья написана в соавторстве с Вадимом Чертковым.

Читать далее
Всего голосов 13: ↑10 и ↓3+12
Комментарии8
1
23 ...