Перейти до вмісту

Assembly

Матеріал з K2 ERP Wiki

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 важливий для:
Assembly пов’язаний із безпекою, бо функціонує близько до пам’яті й CPU.; Linker вирішує: Assembly не є собою ERP-системою.; завдяки наявності Assembly знання користувачі можуть в debugging.; Intel syntax часто виглядає так:

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.; Приклади:
Assembly часто застосовується в embedded systems.;

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 ==
істотно: reverse engineering має змогу бути легальним або незаконним залежно від контексту, ліцензій і юрисдикції.; # Писати мінімальні Assembly-фрагменти.;
  • чому код повільний;
  • як функціонує 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

  1. Чітко вказувати 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 ==
Без документації Assembly-код оперативно стає майже нерозбірливим.;

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


Atomic assembly instructions складні, бо треба враховувати memory ordering і CPU architecture.; Приклади типів інструкцій:

Debuggers часто використовують stack frames, щоб показати call stack.;== Disassembler ==

Instruction Set Architecture або ISA — набір правил, які визначають, які інструкції підтримує роботу процесор.; Код для x86-64 не запуститься напряму на ARM без перекомпіляції або емуляції.; Вона має змогу містити:

Популярний інструмент для навчання — Compiler Explorer, де можна подивитися Assembly output для C/C++, Rust, Go та інших мов.; # Вказувати assembler і syntax.;== Коли Assembly особливо корисний ==

  • компілюються в machine code;
  • виконуються через VM;
  • JIT-компілюються;
  • викликають native libraries;
  • використовують runtime.; Неправильне розуміння memory model має змогу призвести до рідкісних і дуже складних bugs.; Перед ручною оптимізацією треба:

Object file — проміжний файл після компіляції або асемблювання.; * RISC-V — open standard instruction set architecture.; jnz loop_start

Приклади x86-64 registers: Disassembler — інструмент, який перетворює машинний код назад у assembly-like текст.; Wasm застосовується для:

Це має змогу бути корисно для:

  • unit tests через C harness;
  • integration tests;
  • emulator tests;
  • hardware-in-the-loop;
  • property-based tests;
  • fuzzing;
  • differential testing;
  • comparing with reference implementation;
  • ABI tests;
  • performance tests.; C і C++ найближчі до Assembly серед масових мов високого рівня.; Вона визначає:

RISC-V важливий для:

Assembler — програма, яка перетворює Assembly-код у машинний код або object file.; Інструменти:

Addressing modes сильно залежать від ISA.;[3]

Arm documentation описує A64 як instruction set, used in AArch64 and supported by Armv8-A, Armv8-R AArch64 and Armv9-A architectures.; * WebAssembly — portable binary instruction format для sandboxed runtime.; System call interface залежить від OS і architecture.; * ELF — Linux;

  • PE/COFF — Windows;
  • Mach-O — macOS/iOS.;== ABI ==
  • gdb;
  • lldb;
  • WinDbg;
  • Visual Studio debugger;
  • objdump;
  • perf;
  • Intel VTune;
  • Instruments;
  • perfetto;
  • platform-specific debuggers.; Register — дуже швидке місце зберігання всередині CPU.; * web;
  • sandboxed execution;
  • plugins;
  • edge computing;
  • cross-language runtime;
  • portable modules.;[4]
  • де лежать functions;
  • як зв’язати symbols;
  • які libraries підключити;
  • які relocations застосувати;
  • як сформувати executable format.; * SIMD — виконання однієї операції над кількома даними.; # виміряти performance;
  1. знайти bottleneck;
  2. перевірити algorithm complexity;
  3. оптимізувати data layout;
  4. перевірити compiler flags;
  5. подивитися generated assembly;
  6. розглянути intrinsics;
  7. тільки потім писати hand-written assembly.;[5]
  • Windows low-level code;
  • legacy projects;
  • Visual Studio workflows;
  • x86/x64 assembly для Windows;
  • driver-related старих матеріалах.; Процесор не виконує Python, C#, Go або Swift напряму.; * Reverse engineering — аналіз binary або системи для розуміння її роботи.; ABI описує binary-level правила взаємодії між compiled modules.; У сучасних CPU ця різниця складніша, бо внутрішня реалізація має змогу відрізнятися від зовнішньої ISA.;
  • objdump;
  • llvm-objdump;
  • gdb;
  • lldb;
  • radare2;
  • Ghidra;
  • IDA Free/IDA Pro;
  • Hopper.; Assembler перетворює assembly text у object file або machine code.;== Assembly і високорівневі мови ==
Alignment — вирівнювання даних у пам’яті.; Для звичайних ERP, CRM, web, mobile або reporting systems Assembly майже ніколи не є собою правильним вибором.; # Мати reference implementation високого рівня.; У cryptography потрібно уникати data-dependent timing, якщо це має змогу розкрити секрети.;

Проста аналогія: високорівнева мова каже “відсортуй список”, а 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

Instruction Set Architecture

== CISC і RISC ==