Привет, читатель! Да, это я — тот самый парень с обложки, где большими белыми буквами написано «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-3 дня после этой статьи. Я не шучу — это будет эпично!
Но это ещё не конец. После релиза я вернусь с новой статьёй, где подробно разберу, как использовать AsmX G3. Будь ты новичок, который только начинает разбираться в регистрах, или профи, который пишет драйверы во сне, — я покажу, как его использовать.
Заключение
Вот и всё на сегодня. AsmX G3 уже на подходе, и я не могу дождаться, чтобы увидеть, что ты с ним сделаешь. Этот инструмент создан для тех, кто не боится заглянуть «под капот» и стремится к полному контролю над своим кодом. AsmX G3 — это ваш шанс писать быстрый, эффективный и элегантный низкоуровневый код. Готовь свои IDE — через 1-3 дня начнётся новая эра низкоуровневого программирования.
И помни: я всегда возвращаюсь с чем-то великим.
Сайт: doc.asmx-g3-lang.org
ссылка на оригинал статьи https://habr.com/ru/articles/928538/
Добавить комментарий