Assembly
Atomic operations — операції, які виконуються неподільно щодо інших threads.; # Дотримуватися ABI і calling convention.;
- audio/video;
- image processing;
- cryptography;
- numerical computing;
- ML inference;
- compression;
- signal processing.; Але Assembly сам по собі не є собою “шкідливою мовою”.; Приклади наборів:
- context switching;
- interrupt handling;
- system call entry;
- low-level CPU setup;
- synchronization primitives;
- memory management;
- hardware-specific code.; Calling convention — правила виклику функцій.;== Embedded systems ==
CISC — Complex Instruction Set Computer.; cmp
- низька продуктивність розробника;
- складність підтримки;
- залежність від architecture;
- ризик memory bugs;
- складність тестування;
- складність portability;
- сучасні компілятори часто оптимізують краще;
- для бізнес-систем майже завжди краще високорівнева мова.; mov rax, 1
Вони потрібні для:
Він містить:
- налаштувати CPU;
- підготувати memory;
- завантажити kernel;
- перевірити firmware;
- налаштувати hardware;
- перейти в інший execution mode.;
як ілюстрація, для x86-64 можна побачити щось подібне: Основна частина kernel часто пишеться C/C++ або Rust, але низькорівневі частини можуть потребувати Assembly.; * x86-64 — 64-бітна технічна архітектура Intel/AMD.; dec rcx
У коді часто зустрічаються:
Bootloader — код, який запускається дуже рано й готує систему до виконання основної програми або OS.; * registers;
- instruction formats;
- memory addressing;
- data types;
- privilege levels;
- exceptions;
- calling conventions частково через ABI;
- system instructions;
- vector instructions.;== ARM і AArch64 ==
- навчанні;
- OSDev;
- bootloaders;
- low-level x86 experiments;
- hand-written assembly modules.; Alignment важливий для:
SIMD і vector instructions
NASM — Netwide Assembler, популярний assembler для x86/x86-64.;== Пояснення термінів ==
High-level code → Compiler → Assembly → Assembler → Machine code
- multithreading;
- atomics;
- locks;
- lock-free programming;
- compiler optimization;
- CPU reordering.;== LLVM assembler ==
- calling convention;
- object file format;
- type layout;
- name mangling;
- exception handling;
- dynamic linking;
- system call interface.; * освіти;
- досліджень;
- embedded;
- custom processors;
- open hardware;
- experimentation;
- academic CPU design.; Приклади:
Intrinsics часто кращі за inline assembly, бо компілятор краще розуміє код і має змогу оптимізувати його.;[1]
Addressing mode — спосіб вказати, де знаходиться operand.; SIMD instructions виконують одну операцію над кількома елементами одночасно.; # Вимірювати performance до оптимізації.; x86-64 — 64-бітне розширення, яке широко застосовують, коли потрібно на desktop, laptop і server системах.; * A64 — instruction set для AArch64.; call
Обмеження:
A64 — instruction set для AArch64.; # Читати офіційно затверджений ISA manual.; * ARM — поширена RISC-архітектура для mobile, embedded і servers.; # Покривати код тестами.; # Перевіряти stack alignment.;* binary formats; * network protocols; * embedded systems; * file parsing; * reverse engineering; * interoperability.;<div style="background:#f6ffed;border-left:6px solid #27ae60;padding:14px 18px;margin:16px 0;border-radius:8px;"> '''GNU assembler''' або '''GAS''' — assembler у складі GNU Binutils.;<ref>https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html</ref> loop_start: ARM/AArch64 важливий для: SIMD корисний для: * порядок operands; * префікси registers; * позначення sizes; * immediate values; * memory addressing syntax.; Ідея == GNU assembler ==
- performance;
- SIMD;
- ABI;
- structs;
- embedded systems;
- binary compatibility.; ARM — технічна архітектура, дуже поширена в мобільних пристроях, embedded, Apple Silicon, servers і IoT.;
- stack canaries;
- ASLR;
- DEP/NX;
- control-flow integrity;
- memory-safe languages;
- sanitizers;
- fuzzing;
- code review;
- static analysis;
- careful ABI adherence.; * які arguments ідуть у registers;
- які arguments ідуть у stack;
- де повертається result;
- які registers зберігає caller;
- які registers зберігає callee;
- як вирівнюється stack;
- як обробляються variadic functions.;== Object file ==
GNU assembler documentation зазначає, що це user guide для as GNU Binutils.;[2]
Помилки з пам’яттю можуть бути дуже серйозними:
- buffer overflow;
- stack corruption;
- return address overwrite;
- use-after-free;
- integer overflow;
- calling convention mismatch;
- unsafe system calls;
- race conditions;
- side-channel leaks;
- gadget-based exploitation.;== Inline assembly ==
- overflow;
- alignment;
- zero-length input;
- boundary values;
- calling convention;
- register preservation;
- stack alignment.; Високорівневі мови не виконуються “магічно”.; Assembly-level знання важливе для розуміння таких атак, бо вони часто залежать від CPU, memory access і branch behavior.;
Відмінності:
Але сучасні компілятори дуже сильні.; System calls потрібні для:
Ризики:
Коли Assembly має змогу бути невдалим вибором
ldr
Не варто плутати WebAssembly з x86 або ARM Assembly: Wasm виконується через runtime, а не напряму CPU як native ISA.;== CPU architecture ==
- x86;
- x86-64;
- ARM;
- AArch64;
- RISC-V;
- MIPS;
- PowerPC;
- AVR;
- 6502;
- Z80;
- WebAssembly-like virtual instruction sets.;== Debugging Assembly ==
Він має змогу бути потрібен для:
System call — звернення програми до operating system kernel.; AT&T syntax часто виглядає так:
Compiler output
- return address;
- local variables;
- saved registers;
- function arguments, якщо не вистачає registers;
- stack frames.; * Instruction — команда процесора.; У x86-64 register
rspчасто вказує на верх stack.; У бізнесі Assembly рідко є собою основною мовою.; x86-64 має:
- файлів;
- процесів;
- пам’яті;
- мережі;
- вводу/виводу;
- таймерів;
- permissions.; # Писати коментарі не “що”, а “чому”.;== Linker ==
- чому код повільний;
- як функціонує stack;
- що таке pointer;
- що робить compiler;
- чому native extension падає;
- як працюють CPU caches;
- чому data layout важливий.; Assembly-код теж потрібно тестувати.; Assembly знання сприяє зрозуміти:
Endianness важливий для:
Корисно, коли:
- return address;
- old frame pointer;
- local variables;
- saved registers;
- temporary storage.; * Stack — область пам’яті для function calls і local data.; * потрібен web app;
- потрібна ERP-бізнес-логіка;
- потрібен backend API;
- потрібна мобільна розробка програмного забезпечення;
- потрібна швидка підтримуваність;
- команда не має low-level досвіду;
- продуктивність ще не вимірювали;
- задачу можна вирішити C/Rust/Go;
- потрібна portability;
- потрібна безпечна робота з пам’яттю.; SIMD — Single Instruction, Multiple Data.; Bootloader має змогу:
AArch64 — 64-бітний execution state для Arm.;== Assembly і документація ==
Сьогодні більшість програм не пишуть в цілому на Assembly.;== Branching ==
Регістрів мало, з цієї причини Assembly-код має уважно працювати з ними.; Rust застосовується для системного програмування з фокусом на memory safety.; Головна ідея Assembly — дати людині текстовий спосіб записувати машинні інструкції.; * RAX;
- RBX;
- RCX;
- RDX;
- RSI;
- RDI;
- RSP;
- RBP;
- R8–R15.; * Stack frame — частина stack для конкретного виклику функції.; Для корпоративної роботи потрібні правила, дозвіл і юридична перевірка.; Багато Assembly вивчають саме через C/C++ compiler output.; Приклади:
- розуміння native crash у сторонній бібліотеці;
- аналіз performance на рівні compiled code;
- інтеграційні функціональні можливості з embedded device;
- driver або low-level connector;
- reverse engineering старого binary-компонента з дозволом;
- аудит native dependency.; * Bootloader — ранній код запуску системи.; ARM і RISC-V — RISC-напрям.; # Уникати зайвої “магії”.;
Безпека
Приклади AArch64-like інструкцій:
Stack зазвичай росте вниз у пам’яті, але це залежить від архітектури й ABI.; * ISA — Instruction Set Architecture, набір інструкцій і правил CPU.; У кінці все зводиться до машинного коду — байтів, які CPU розуміє як інструкції.; * Register — швидке сховище всередині CPU.; mov Assembly особливо корисний для: Intrinsics — функції компілятора, які дають доступ до спеціальних CPU instructions без написання сирого Assembly.; Linker об’єднує object files і libraries у фінальний executable.;== MASM ==
Performance optimization
Практичний принцип: Assembly — останній інструмент оптимізації, а не перший.;
Registers
- Чітко вказувати target architecture.;== Хороші практики ==
- startup code;
- interrupt handlers;
- bootloaders;
- direct hardware access;
- microcontroller initialization;
- performance-critical routines;
- power-sensitive code;
- tiny memory environments.; * працювати з pointers;
- контролювати layout;
- викликати intrinsics;
- взаємодіяти з ABI;
- писати системний код;
- використовувати inline assembly;
- компілювати під різні ISA.; Bootloaders часто містять Assembly, бо високорівневе runtime-середовище ще не готове.; * Alignment — вирівнювання даних у пам’яті.; Це істотно для:
- розуміння компіляції;
- низькорівневих фрагментів;
- performance analysis;
- debugging;
- embedded;
- reverse engineering;
- runtime systems.; * C;
- C++;
- Rust;
- Go;
- C#;
- Swift;
- Java;
- Python;
- JavaScript;
- Dart.; Assembly важливий для reverse engineering.; Це не комфортно для великих застосунків, але дуже корисно для системного програмування, embedded, debugging і розуміння того, як функціонує код “під капотом”.; * System call — звернення програми до kernel.; Потім linker об’єднує object files у executable або library.;== Assembly у бізнесі ==
Assembly має змогу бути невдалим вибором, якщо:
Він застосовується в Microsoft/Windows ecosystem.; Для x86 Assembly є собою різні синтаксиси.;== Джерела ==
Arm A-profile A64 documentation надає HTML-опис A64 instruction set architecture.; add rax, 2
ret
Приклад ідеї:
WebAssembly
GNU assembler історично часто використовує AT&T syntax для x86, але має змогу підтримувати й Intel syntax залежно від режиму.; Приклади:
Кожна технічна архітектура процесора має власний набір інструкцій.; Часто швидше сприяє кращий алгоритм або layout даних.; * Endianness — порядок байтів у багатобайтових значеннях.; Assembly є собою проміжним рівнем:
- if;
- loops;
- switch;
- function calls;
- error handling;
- state machines.; * Object file — проміжний файл із machine code і symbols.; mov rax, rbx
- програма падає в native code;
- немає source code;
- треба читати crash dump;
- треба зрозуміти stack trace;
- є собою memory corruption;
- compiler optimization ускладнює debugging;
- потрібно перевірити ABI;
- performance profiler показує hot instruction.; * Intrinsic — compiler-provided функція для спеціальних CPU інструкцій.; У Malware analysis часто передбачено читання Assembly.; # Не використовувати Assembly без реальної потреби.; Це корисно для:
Assembler
Loops
add
Особливо істотно тестувати edge cases: mov MASM — Microsoft Macro Assembler.; * iPhone;
- Android;
- Apple Silicon Mac;
- embedded systems;
- microcontrollers;
- cloud ARM servers;
- low-power devices.; Приклади AArch64 registers:
- важко переносити;
- без зайвих зусиль порушити ABI;
- compiler optimizations можуть взаємодіяти неочікувано;
- складно тестувати;
- складно підтримувати.; Assembly — це читабельний текстовий запис цих інструкцій.; * debugging;
- reverse engineering;
- аналізу compiler output;
- malware analysis;
- performance tuning;
- вивчення binary.; NASM має власний синтаксис і macros.;== System calls ==
Intel Software Developer’s Manual описує архітектуру, середовище програмування та повний instruction set reference для Intel 64 і IA-32 процесорів.; jmp done
Знання Assembly сприяє читати compiler output.; * general-purpose registers;
- SIMD/vector instructions;
- stack;
- calling conventions;
- complex instruction set;
- legacy modes;
- operating system support.; Потрібно пояснювати:
Сильні сторони:
- Assembly — низькорівнева мова, що текстово описує інструкції CPU.;== Stack frame ==
RISC — Reduced Instruction Set Computer.;== Assembly і тестування ==
| CISC | складніші інструкції, історично більше можливостей в одній інструкції |
| RISC | простіші інструкції, регулярніший набір операцій |
Assembly і C/C++
ABI охоплює:
Формати executable/object files:
Memory
Спрощено:
Compiler із високорівневої мови сам генерує подібні конструкції.; Практична думка: у високорівневій мові ви створюєте змінні майже без обмежень.; x86 — історична технічна архітектура Intel/AMD.; Side-channel attack використовує побічні сигнали, як ілюстрація timing або cache behavior.;Instruction — команда CPU.;
; тіло циклу
Assembly і ERP-системи
- performance optimization;
- understanding inlining;
- checking vectorization;
- reverse engineering bugs;
- learning compiler behavior;
- ABI debugging.; GAS підтримує роботу багато architectures і часто застосовується compiler toolchains.; * Assembler — програма, яка перетворює Assembly у machine code або object file.; * Linker — інструмент, що об’єднує object files у executable.; x86-64 зазвичай little-endian.; У контексті K2 ERP Assembly має змогу бути корисним лише опосередковано:
Він часто застосовується в Linux/Unix toolchains.; Memory model описує правила видимості операцій із пам’яттю між threads або cores.; Assembly іноді використовують для performance.; Цикли в Assembly зазвичай будуються через labels і conditional jumps.; В Assembly ви постійно думаєте: “у якому регістрі це лежить?” і “чи не перезапишу я потрібне значення?”.;{{SEO
- objdump;
- llvm-objdump;
- gdb;
- lldb;
- radare2;
- Ghidra;
- IDA Free/IDA Pro;
- Hopper.; Assembler перетворює assembly text у object file або machine code.;== Assembly і високорівневі мови ==
Проста аналогія: високорівнева мова каже “відсортуй список”, а Assembly каже процесору “поклади це значення в регістр, порівняй, зроби перехід, запиши в пам’ять”.; Вони або:
Side-channel attacks
Addressing modes
- embedded systems;
- bootloaders;
- kernels;
- drivers;
- compiler/runtime development;
- reverse engineering;
- malware analysis;
- performance-critical routines;
- SIMD optimization;
- ABI debugging;
- crash dump analysis;
- security research;
- навчання computer architecture;
- low-level hardware access.; Сценарії:
RISC-V
Але Rust теж компілюється в машинний код і має змогу взаємодіяти з Assembly, intrinsics і ABI.;[6]
Поширені помилки:
RISC-V Assembly Programmer’s Manual описує стандартну RISC-V assembly language, яку підтримують GNU as і LLVM assembler.; Під час роботи з Assembly варто:
str
LLVM toolchain має власні assembler/disassembler функціональні можливості.; * ABI — binary-level правила сумісності між модулями.; Inline assembly — вставка Assembly-коду в C/C++ або іншу мову.; Але бізнес-логіку ERP майже завжди потрібно писати високорівневою мовою, а не Assembly.;
WebAssembly не є собою класичним CPU Assembly, але концептуально близький: це низькорівневий instruction format для stack-based virtual machine.;== x86 і x86-64 == Це без ускладнень низькорівневий інструмент.; je zero_case Якщо ABI порушено, код має змогу компілюватися, але падати або працювати неправильно.; add '''Машинний код''' — це байти, які виконує процесор.; з цієї причини немає одного універсального Assembly для всіх комп’ютерів: є собою x86/x86-64 assembly, ARM/AArch64 assembly, RISC-V assembly і інші варіанти.;== NASM == == Endianness == * concurrency; * locks; * lock-free data structures; * reference counters; * synchronization; * kernel code.;== Bootloader == Популярні assemblers: * move/load/store; * arithmetic; * logic; * compare; * branch/jump; * call/return; * stack operations; * SIMD/vector operations; * system instructions; * atomic operations.; '''Stack frame''' — частина stack, яка належить конкретному function call.; '''RISC-V''' — open standard instruction set architecture.;== Instructions == !;== Reverse engineering == == Assembly і malware == * little-endian; * big-endian.;== Практичний висновок == <div style="background:#fff0f0;border-left:6px solid #eb5757;padding:14px 18px;margin:16px 0;border-radius:8px;"> == Intrinsics == * target architecture; * assembler syntax; * ABI; * calling convention; * register usage; * clobbered registers; * assumptions; * alignment; * supported OS; * tested CPUs; * build commands; * reason for hand-written assembly.; bl MASM має змогу зустрічатися в: Reverse engineering має змогу використовуватися для: ISA описує: Сучасні CPU мають branch prediction, з цієї причини pattern переходів має змогу впливати на performance.; # Розглядати intrinsics перед hand-written assembly.; * порушити calling convention; * не зберегти callee-saved registers; * зламати stack alignment; * переплутати operand order; * неправильно порахувати offset; * не врахувати endianness; * зробити out-of-bounds memory access; * забути про sign extension; * переплутати instruction size; * не врахувати ABI; * не тестувати edge cases; * оптимізувати без вимірювання; * не документувати register usage; * писати Assembly там, де достатньо C або Rust.; * '''Disassembler''' — інструмент, що перетворює binary code у assembly-like текст.; * '''AArch64''' — 64-бітний execution state ARM.; * '''x86''' — історична технічна архітектура Intel/AMD.; Rust має змогу замінити частину C/C++ там, де раніше могли знадобитися небезпечні низькорівневі підходи.; Assembly найкраще використовувати як точний інструмент для специфічних низькорівневих задач, а не як універсальну мову для застосунків.; # Використовувати debugger і disassembler.;<pre> Як і будь-який інструмент, Assembly має змогу використовуватися відповідально або шкідливо.; * SSE; * AVX; * AVX2; * AVX-512; * NEON; * SVE; * RISC-V Vector extension.; Його використовують для: Calling convention залежить від платформи.; * X0–X30; * SP; * PC; * V0–V31.; Disassembler корисний для: == Assembly і машинний код == '''Stack''' — область пам’яті для function calls, local variables, return addresses і тимчасових даних.;[[Категорія:Reverse Engineering]] Assembly — це важлива низькорівнева мова, яка надає можливість зрозуміти й контролювати роботу процесора.; Підходи: Деякі CPU працюють швидше або навіть вимагають, щоб інформаційні дані були вирівняні за певними адресами.; Assembly залежить від архітектури CPU.; '''Endianness''' — порядок байтів у багатобайтових числах.; GNU assembler documentation описує <code>as</code> як user guide для GNU assembler у складі GNU Binutils.;== Atomic operations == Сценарії: '''WebAssembly''' або '''Wasm''' — binary instruction format для portable execution.; Приклад ідеї: == Stack == як ілюстрація, SIMD intrinsics дозволяють використовувати vector instructions через C/C++ API.; * прямий контроль над CPU; * робота з registers; * розуміння machine code; * embedded і firmware; * kernels і drivers; * debugging native crashes; * reverse engineering; * performance analysis; * SIMD optimization; * навчання computer architecture.; ret Приклади x86-like інструкцій: NASM часто використовують у: * embedded продуктів; * industrial hardware; * firmware; * high-performance libraries; * cryptography; * drivers; * legacy binary support; * reverse engineering; * security audit; * performance-critical modules.;[[Категорія:ARM]] <pre> Assembly залишається важливим для: '''Коротко:''' Assembly — це мова, де програміст функціонує майже напряму з процесором: регістрами, пам’яттю, стеком, інструкціями й calling conventions.; Окремо варто відзначити регістрів і правил.; movq %rbx, %rax == Kernel і драйвери == Але inline assembly має ризики: Захист: як ілюстрація, x86-64 Windows і x86-64 Linux мають різні calling conventions.; Типові варіанти: == Дивіться додатково == * NASM; * MASM; * GNU assembler або GAS; * LLVM assembler; * FASM; * YASM; * platform-specific assemblers.;[[Категорія:Низькорівневе програмування]] * аналізу старих програм; * compatibility; * malware analysis; * security research; * debugging binary without source; * understanding protocols; * firmware analysis.; * [https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html Intel — Intel 64 and IA-32 Architectures Software Developer’s Manuals] * [https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-manual.html Intel — Intel 64 and IA-32 Architectures Software Developer’s Manual] * [https://developer.arm.com/documentation/ddi0602/2025-12/Base-Instructions Arm Developer — A64 Base Instructions] * [https://developer.arm.com/zh-TW/products/architecture/instruction-sets/a64 Arm Developer — A64 Instruction Set Architecture] * [https://github.com/riscv-non-isa/riscv-asm-manual RISC-V Assembly Programmer’s Manual] * [https://sourceware.org/binutils/docs/as/ GNU Binutils — Using as, GNU assembler documentation] * [https://www.gnu.org/software/binutils/ GNU Binutils] * [https://llvm.org/docs/ LLVM Documentation] * [https://lldb.llvm.org/ LLDB Debugger] * [https://sourceware.org/gdb/documentation/ GDB Documentation] * [https://webassembly.org/ WebAssembly] * [https://developer.mozilla.org/en-US/docs/WebAssembly MDN — WebAssembly] * [https://www.mediawiki.org/wiki/Help:Formatting MediaWiki — Help:Formatting] * [https://www.mediawiki.org/wiki/Help:Links MediaWiki — Help:Links] == Intel syntax і AT&T syntax == <pre> cmp rax, 0 Це значно читабельніше, ніж відповідні байти машинного коду.; Intel manual Volume 2 містить повний instruction set reference для Intel 64 і IA-32.;== Memory model == x86 часто вважають CISC-архітектурою.; У embedded часто пишуть ключовий код на C/C++, а Assembly — тільки там, де потрібен прямий контроль.;[[Категорія:Embedded Systems]] == Assembly і Rust == == Alignment == LLVM застосовується в: Вони дозволяють: * Clang; * Swift compiler ecosystem; * Rust compiler backend historically via LLVM; * many modern language toolchains; * cross-compilation; * optimization pipelines.; ret jmp == Типові помилки в Assembly == * embedded; * OS kernels; * performance; * compilers; * reverse engineering; * security research; * legacy systems.; * '''Machine code''' — байти інструкцій, які виконує процесор.; Assembly має змогу використовуватися в operating system kernels і drivers.; * machine code; * symbols; * relocation information; * debug information; * sections; * metadata.;== Головна ідея == * immediate value; * register; * memory address; * register + offset; * base + index; * PC-relative addressing.;== Assembly і Python/C#/Go/Swift/Dart == це низькорівнева мова програмування, яка описує інструкції процесора у текстовій формі, близькій до машинного коду виступає ключовою рисою '''Assembly''' або '''мова асемблера'''.;[[Категорія:x86]] <pre> Branching — умовні або безумовні переходи.; LLVM assembly і machine code tooling важливі для сучасних компіляторів.; * '''Calling convention''' — правила передачі arguments і результатів між функціями.; Підхід !!; Stack застосовується для: * спеціальних CPU instructions; * performance-critical fragments; * embedded; * low-level control; * compiler barriers; * hardware access.; Assembly функціонує з пам’яттю напряму або через адреси.;== Calling convention == '''ABI''' — Application Binary Interface.;
Для Assembly важлива документація.;
Він не веде обліковий облік, не проводить документи, не керує складом і не формує бізнес-звіти.; Branches потрібні для:
- crash;
- data corruption;
- undefined behavior;
- security vulnerability;
- неправильний результат.; * Inline assembly — Assembly-код, вставлений у код C/C++ або іншої мови.;
Зазвичай використовують:
Для цього використовують disassemblers, debuggers і decompilers.; як ілюстрація, Linux x86-64 і Windows x86-64 мають різні механізми виклику системних функцій.; # Документувати register usage.; * load; * store; * address; * pointer; * offset; * stack; * heap; * alignment; * memory access size.; sub b== CISC і RISC ==Instruction Set Architecture
- ↑ https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-manual.html
- ↑ https://sourceware.org/binutils/docs/as/
- ↑ https://sourceware.org/binutils/docs/as/
- ↑ https://github.com/riscv-non-isa/riscv-asm-manual
- ↑ https://developer.arm.com/zh-TW/products/architecture/instruction-sets/a64
- ↑ https://developer.arm.com/documentation/ddi0602/2025-12/Base-Instructions