Привет, читатель! Да, это я - тот самый парень с обложки, где большими белыми буквами написано "I ALWAYS COME BACK". И я действительно вернулся, чтобы рассказать тебе кое-что важное. Ты сейчас читаешь эту статью, и я знаю, что ты здесь не просто так. Сегодня я анонсирую AsmX G3 — новое поколение моего проекта, которое вот-вот перевернёт твоё представление о низкоуровневом программировании. Готовься, потому что через 1-3 дня ты сможешь сам в этом убедиться!
Ты наверняка заметил обложку этой статьи — моё лицо и та самая надпись "I ALWAYS COME BACK". Это не просто мем для хайпа, это моё обещание тебе. Я возвращаюсь с чем-то большим, и эта обложка — твой первый намёк на то, что ждёт впереди. AsmX G3 — это мой успех, и я хочу, чтобы ты стал частью этого события. Так что давай разберёмся, что же я приготовил для тебя на этот раз!
Что такое AsmX G3?
Это не просто апдейт - это революция. Это третье поколение моего языка программирования/компилятора выводит всё на новый уровень:
Поддержка синтаксиса AT&T: AsmX G3 полностью поддерживает синтаксис AT&T, что делает его знакомым и удобным для многих разработчиков. (JITC режим поддерживает Intel синтаксис).
Генерация ELF-файлов (Linux): Для создания полноценных нативных приложений AsmX G3 генерирует исполняемые файлы с компоновщиком в формате ELF для систем x86_64.
Гибкая система команд: Управляйте каждым аспектом компиляции с помощью мощных флагов командной строки. Вы можете выбирать целевую архитектуру, оптимизировать код для релиза и многое другое.
Синтаксис будущего: Такие вещи как
@fn
,@section
@include
стирают грань между ассемблером и высокоуровневыми языками. Язык, который сочетает мощь машинных инструкций с элегантностью современного дизайна.Smart compiler: Умный компилятор делает много вещей когда вы пишете
@fn
,@section
@include
.
Пример кода
Чтобы ты понял, о чём речь, вот пример кода на AsmX G3:
@include libc;
@section rodata {
message: str("Hello World!\n"),
archlinux: str("\uf303 -> Arch Linux\n")
}
@fn pub main {
;; Example of simple operations
@mov $0, %rdi
@add $10, %rdi
@cmp $0, %rdi
;; Output the first message
@mov $1, %rax ;; sys_write
@mov $1, %rdi ;; stdout
@mov &message, %rsi ;; message pointer-address
@mov $21, %rdx ;; message length
@syscall
;; Output the second message
@mov $1, %rax
@mov $1, %rdi
@mov &archlinux, %rsi
@mov $24, %rdx
@syscall
;; Terminate the program
@mov $60, %rax ;; sys_exit
@mov $0, %rdi ;; exit code 0
@syscall
}
Output:
$ asmx index --release -march x86_64 -o hello
$ ./hello
Hello World!
-> Arch Linux
Этот простой код демонстрирует, как AsmX G3 работает с системными вызовами для вывода текста в консоль, включая специальные символы, и корректно завершает программу. Это лишь вершина айсберга, но она показывает, насколько интуитивно понятным и мощным может быть низкоуровневый код.
Синтаксис
Блочная структура как в high-level функции и секции оформляются через {}
- это не просто красиво, это практично:
@fn main {
;; Your code is here
}
Современные объявления данных. Инициализация переменных в секциях выглядит чисто и выразительно:
@section rodata {
message: str("Hello World!\n") ;; string
}
Набор x86_64 инструкций
На данном этапе компилятор пока что поддерживает фундаментальный набор инструкций, который является ядром любой процессорной архитектуры:
mov
— для перемещения данных.add
,sub
— для базовой арифметики.cmp
— для сравнения значений и установки флагов.adc
,sbb
— для работы с многобайтовыми числами (сложение и вычитание с учётом переноса).or
,xor
— для побитовых логических операций.
Давайте посмотрим на более релевантный пример, который демонстрирует базовые возможности AsmX G3 уже сейчас:
;; Представим, что у нас есть два 64-битных числа,
;; хранящихся в парах 32-битных регистров:
;; Первое число: %eax (младшая часть) и %edx (старшая часть)
;; Второе число: %ebx (младшая часть) и %ecx (старшая часть)
@fn pub main {
;; Сначала складываем младшие 32-битные части.
;; Если результат вызовет переполнение, установится флаг переноса (CF).
@add %ebx, %eax
;; Теперь складываем старшие 32-битные части,
;; но с учётом флага переноса от предыдущей операции.
;; Если был перенос, к результату добавится 1.
@adc %ecx, %edx
;; В результате в паре регистров %edx:%eax
;; будет храниться корректная 64-битная сумма.
;; ...
}
Этот код демонстрирует 64-битную операцию сложения на 32-битных регистрах. Сначала мы складываем младшие части (@add
), а затем — старшие, но уже с учётом флага переноса (@adc
). Это и есть настоящая низкоуровневая логика, которая станет основой для более сложных вычислений в будущем.
Ошибки прошлого в AT&T синтаксисе. Однако в AT&T синтаксисе нет явного различия между значением переменной и её адресом. Например, если message
— это метка в секции данных, запись $message
может быть интерпретирована как значение, а не адрес, что часто приводит к ошибкам, особенно при работе с указателями.
В AsmX G3 этот недостаток устранён:
Символ
&
для адреса: В AsmX G3 используется&
для явного указания адреса переменной. Например,&message
— это адрес переменнойmessage
, а не её значение.Символ
$
для значений: Как и в AT&T,$
обозначает непосредственное значение. Например,$10
— это константа 10.
Анонс релиза
Ты уже заинтригован? Тогда держись: релиз AsmX G3 состоится через 1-6 дней после этой статьи. Я не шучу — это будет эпично!
Но это ещё не конец. После релиза я вернусь с новой статьёй, где подробно разберу, как использовать AsmX G3. Будь ты новичок, который только начинает разбираться в регистрах, или профи, который пишет драйверы во сне, — я покажу, как его использовать.
Если тебя так же, как и меня, зажигает магия низкоуровневого кода — поделись этой статьёй с друзьями и коллегами! Давайте вместе создадим сильное сообщество вокруг AsmX G3!
Заключение
Вот и всё на сегодня. AsmX G3 уже на подходе, и я не могу дождаться, чтобы увидеть, что ты с ним сделаешь. Этот инструмент создан для тех, кто не боится заглянуть "под капот" и стремится к полному контролю над своим кодом. AsmX G3 — это ваш шанс писать быстрый, эффективный и элегантный низкоуровневый код. Готовь свои IDE - через 1-6 дней начнётся новая эра низкоуровневого программирования.
И помни: я всегда возвращаюсь с чем-то великим.