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

Assembly

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

Обмеження:

Embedded systems

У бізнесі Assembly рідко виступає як основною мовою. * розуміння компіляції;

  • низькорівневих фрагментів;
  • performance analysis;
  • debugging;
  • embedded;
  • reverse engineering;
  • runtime systems. Він містить:

Спрощено:

Поширені помилки:

  • little-endian;
  • big-endian. Тому немає одного універсального Assembly; так само реалізовано ARM/AArch64 assembly, RISC-V assembly і інші варіанти. GNU assembler історично часто використовує AT&T syntax для x86, але здатна підтримувати й Intel syntax залежно від режиму. * ISA — Instruction Set Architecture, набір інструкцій і правил CPU. * System call — звернення програми до kernel. * immediate value;
  • register;
  • memory address;
  • register + offset;
  • base + index;
  • PC-relative addressing. * низька продуктивність розробника;
  • складність підтримки;
  • залежність від architecture;
  • ризик memory bugs;
  • складність тестування;
  • складність portability;
  • сучасні компілятори часто оптимізують краще;
  • для бізнес-систем майже завжди краще високорівнева мова. x86-64 — 64-бітне розширення, яке широко застосовують, коли потрібно на desktop, laptop і server системах.[1]

Assembly особливо корисний для:

Stack

call

!

У x86-64 register rsp часто вказує на верх stack. mov

У коді часто зустрічаються:

  • RAX;
  • RBX;
  • RCX;
  • RDX;
  • RSI;
  • RDI;
  • RSP;
  • RBP;
  • R8–R15. * Linker — інструмент, що об’єднує object files у executable. Endianness — порядок байтів у багатобайтових числах. * x86-64 — 64-бітна технічна архітектура Intel/AMD. Arm A-profile A64 documentation надає HTML-опис A64 instruction set architecture. Assembly виступає як проміжним рівнем:
  • чому код повільний;
  • як функціонує stack;
  • що таке pointer;
  • що робить compiler;
  • чому native extension падає;
  • як працюють CPU caches;
  • чому data layout важливий.== Side-channel attacks ==
  • компілюються в machine code;
  • виконуються через VM;
  • JIT-компілюються;
  • викликають native libraries;
  • використовують runtime.== CPU architecture ==

Bootloader здатна:

  • прямий контроль над CPU;
  • робота з registers;
  • розуміння machine code;
  • embedded і firmware;
  • kernels і drivers;
  • debugging native crashes;
  • reverse engineering;
  • performance analysis;
  • SIMD optimization;
  • навчання computer architecture.

Compiler output

Instruction Set Architecture або ISA — набір правил, які визначають, які інструкції підтримує процесор.[2]

  • binary formats;
  • network protocols;
  • embedded systems;
  • file parsing;
  • reverse engineering;
  • interoperability. # Покривати код тестами. Приклади AArch64 registers:

Calling convention

ARM і AArch64

Він часто застосовується для в Linux/Unix toolchains. Linker об’єднує object files і libraries у фінальний executable.== Assembly і Python/C#/Go/Swift/Dart == ldr Wasm застосовується для для:

Дивіться так само

Assembly найкраще використовувати як точний інструмент для специфічних низькорівневих задач, а не як універсальну мову для застосунків. * Calling convention — правила передачі arguments і результатів між функціями. Під час роботи з Assembly варто:

Типові помилки в Assembly

MASM здатна зустрічатися в:

Він здатна бути потрібен для:

ABI — Application Binary Interface. Це не інтуїтивно для великих застосунків, але дуже корисно для системного програмування, embedded, debugging і розуміння того, як функціонує код “під капотом”. * C;

  • C++;
  • Rust;
  • Go;
  • C#;
  • Swift;
  • Java;
  • Python;
  • JavaScript;
  • Dart. Його використовують для:

Stack frame — частина stack, яка належить конкретному function call. ARM і RISC-V — RISC-напрям. Сценарії:

У Malware analysis часто передбачено читання Assembly. * Reverse engineering — аналіз binary або системи для розуміння її роботи. Як і будь-який інструмент, Assembly здатна використовуватися відповідально або шкідливо. WebAssembly не виступає як класичним CPU Assembly, але концептуально близький: це низькорівневий instruction format для stack-based virtual machine.== Головна ідея ==

  • objdump;
  • llvm-objdump;
  • gdb;
  • lldb;
  • radare2;
  • Ghidra;
  • IDA Free/IDA Pro;
  • Hopper. У сучасних CPU ця різниця складніша, бо внутрішня реалізація здатна відрізнятися від зовнішньої ISA. # Документувати register usage. Reverse engineering здатна використовуватися для:

mov rax, 1

Коли Assembly особливо корисний

Сьогодні більшість програм не пишуть на 100% на Assembly. # Писати мінімальні Assembly-фрагменти. * 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.== Disassembler ==
  • audio/video;
  • image processing;
  • cryptography;
  • numerical computing;
  • ML inference;
  • compression;
  • signal processing. je zero_case

SEO title: Assembly — асемблер, машинний код, регістри, інструкції CPU, x86-64, ARM, RISC-V, NASM, GAS і низькорівневе програмування

SEO keywords: Assembly, assembler, асемблер, мова асемблера, машинний код, machine code, x86 assembly, x86-64 assembly, ARM assembly, AArch64 assembly, RISC-V assembly, NASM, MASM, GAS, GNU assembler, LLVM assembler, registers, CPU instructions, stack, memory, calling convention, ABI, linker, object file, disassembler, objdump, embedded systems, низькорівневе програмування, reverse engineering, debugging assembly, performance optimization

</noinclude>
 {{SEO
Шаблон для службового SEO-опису сторінки. 

}}



* 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. Але inline 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.== Object file ==

* розуміння native crash у сторонній бібліотеці;
* аналіз performance на рівні compiled code;
* інтеграційні функції ERP з embedded device;
* driver або low-level connector;
* reverse engineering старого binary-компонента з дозволом;
* аудит native dependency. Assembly — це важлива низькорівнева мова, яка дає можливість зрозуміти й контролювати роботу процесора. * '''ABI''' — binary-level правила сумісності між модулями.[[Категорія:ARM]]

'''A64''' — instruction set для AArch64. # Перевіряти stack alignment. Instruction — команда CPU. * overflow;
* alignment;
* zero-length input;
* boundary values;
* calling convention;
* register preservation;
* stack alignment.== Assembly і тестування ==

[[Категорія:Compiler]]

== Performance optimization ==

== WebAssembly ==

== System calls ==
'''MASM''' — Microsoft Macro Assembler. Основна частина kernel часто пишеться C/C++ або Rust, але низькорівневі частини можуть потребувати Assembly. Приклад ідеї:

== Branching ==
всіх комп’ютерів: виступає як x86/x86-64 assembly забезпечується через Кожна технічна архітектура процесора має власний набір інструкцій.

Assembly залишається важливим для:

  • registers;
  • instruction formats;
  • memory addressing;
  • data types;
  • privilege levels;
  • exceptions;
  • calling conventions частково через ABI;
  • system instructions;
  • vector instructions. * Stack frame — частина stack для конкретного виклику функції. * Assembly — низькорівнева мова, що текстово описує інструкції CPU. * x86;
  • x86-64;
  • ARM;
  • AArch64;
  • RISC-V;
  • MIPS;
  • PowerPC;
  • AVR;
  • 6502;
  • Z80;
  • WebAssembly-like virtual instruction sets. Підхід !! * Stack — область пам’яті для function calls і local data. cmp rax, 0

Потрібно пояснювати:

SIMD — Single Instruction, Multiple Data.

Високорівневі мови не виконуються “магічно”. Ідея

High-level code → Compiler → Assembly → Assembler → Machine code

RISC-V — open standard instruction set architecture. * де лежать functions;

  • як зв’язати symbols;
  • які libraries підключити;
  • які relocations застосувати;
  • як сформувати executable format. Це без зусиль низькорівневий інструмент. NASM має власний синтаксис і macros.== MASM ==

Це корисно для:

Linker вирішує:

Знання Assembly оптимізує читати compiler output. ARM — технічна архітектура, дуже поширена в мобільних пристроях, embedded, Apple Silicon, servers і IoT. # Мати reference implementation високого рівня. Assembly або мова асемблера — це низькорівнева мова програмування, яка описує інструкції процесора у текстовій формі, близькій до машинного коду. * ARM — поширена RISC-архітектура для mobile, embedded і servers. * crash;

  • data corruption;
  • undefined behavior;
  • security vulnerability;
  • неправильний результат. У cryptography потрібно уникати data-dependent timing, якщо це здатна розкрити секрети.[3]

ret

Але Rust теж компілюється в машинний код і здатна взаємодіяти з Assembly, intrinsics і ABI. # Не використовувати Assembly без реальної потреби.== Inline assembly == Приклади x86-like інструкцій: Але сучасні компілятори дуже сильні. * Disassembler — інструмент, що перетворює binary code у assembly-like текст. ABI містить:

  • load;
  • store;
  • address;
  • pointer;
  • offset;
  • stack;
  • heap;
  • alignment;
  • memory access size.

ret

str

Object file — проміжний файл після компіляції або асемблювання. * Bootloader — ранній код запуску системи. Register — дуже швидке місце зберігання всередині CPU.

Assembler — програма, яка перетворює Assembly-код у машинний код або object file. # Вказувати assembler і syntax.== x86 і x86-64 ==

Stack frame

Інструменти:

GAS підтримує багато architectures і часто застосовується для compiler toolchains.== CISC і RISC ==

Приклади:

  1. Чітко вказувати target architecture.== LLVM assembler ==

* iPhone;
* Android;
* Apple Silicon Mac;
* embedded systems;
* microcontrollers;
* cloud ARM servers;
* low-power devices. * '''Object file''' — проміжний файл із machine code і symbols. Це критично для:

* X0–X30;
* SP;
* PC;
* V0–V31.[[Категорія:RISC-V]]

Сучасні CPU мають branch prediction, тому pattern переходів здатна впливати на performance. '''критично:''' reverse engineering здатна бути легальним або незаконним залежно від контексту, ліцензій і юрисдикції. * '''AArch64''' — 64-бітний execution state ARM. * [[C Sharp]]
* [[Go]]
* [[Swift]]
* [[Dart]]
* [[PowerShell]]
* [[Visual Basic]]
* [[Python]]
* [[MATLAB]]
* [[Розробка в K2 ERP]]
* [[Тестування коду]]
* [[API K2 ERP]]
* [[Інтеграції K2 ERP]]
* [[Deep Learning]]
* [[Великі мовні моделі]]
* [[GitHub Copilot]]
* [[Cursor]]
* [[Tabnine]]
* [[Штучний інтелект]]
* [[Генеративний AI]]

add rax, 2

* [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]

== ABI ==
[[Категорія:Debugging]]
Assembly важливий для reverse engineering. Intrinsics часто кращі за inline assembly, бо компілятор краще розуміє код і здатна оптимізувати його. ABI описує binary-level правила взаємодії між compiled modules. * '''Alignment''' — вирівнювання даних у пам’яті. # Уникати зайвої “магії”. Особливо критично тестувати edge cases:

* machine code;
* symbols;
* relocation information;
* debug information;
* sections;
* metadata. Для корпоративної роботи потрібні правила, дозвіл і юридична перевірка. * Windows low-level code;
* legacy projects;
* Visual Studio workflows;
* x86/x64 assembly для Windows;
* driver-related старих матеріалах. '''Calling convention''' — правила виклику функцій. * '''RISC-V''' — open standard instruction set architecture. * move/load/store;
* arithmetic;
* logic;
* compare;
* branch/jump;
* call/return;
* stack operations;
* SIMD/vector operations;
* system instructions;
* atomic operations. * '''x86''' — історична технічна архітектура Intel/AMD. * порядок operands;
* префікси registers;
* позначення sizes;
* immediate values;
* memory addressing syntax. # Читати офіційний ISA manual. Підходи:
<div style="background:#f6ffed;border-left:6px solid #27ae60;padding:14px 18px;margin:16px 0;border-radius:8px;">

== Memory ==

Приклади:

Bootloaders часто містять Assembly, бо високорівневе runtime-середовище ще не готове.[[Категорія:Embedded Systems]]
'''Side-channel attack''' використовує побічні сигнали, як приклад timing або cache behavior. * '''SIMD''' — виконання однієї операції над кількома даними. Він не веде обліковий облік, не проводить документи, не керує складом і не формує бізнес-звіти. * if;
* loops;
* switch;
* function calls;
* error handling;
* state machines. # виміряти performance;
# знайти bottleneck;
# перевірити algorithm complexity;
# оптимізувати data layout;
# перевірити compiler flags;
# подивитися generated assembly;
# розглянути intrinsics;
# тільки потім писати hand-written assembly. Приклади типів інструкцій:

Для Assembly важлива документація. Stack зазвичай росте вниз у пам’яті, але це залежить від архітектури й ABI. add

* stack canaries;
* ASLR;
* DEP/NX;
* control-flow integrity;
* memory-safe languages;
* sanitizers;
* fuzzing;
* code review;
* static analysis;
* careful ABI adherence. cmp

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

* target architecture;
* assembler syntax;
* ABI;
* calling convention;
* register usage;
* clobbered registers;
* assumptions;
* alignment;
* supported OS;
* tested CPUs;
* build commands;
* reason for hand-written assembly. * '''Intrinsic''' — compiler-provided функція для спеціальних CPU інструкцій.== Endianness ==

'''CISC''' — Complex Instruction Set Computer.== Assembly у бізнесі ==

Вона здатна містити:

<pre>

* return address;
* old frame pointer;
* local variables;
* saved registers;
* temporary storage. * multithreading;
* atomics;
* locks;
* lock-free programming;
* compiler optimization;
* CPU reordering. У кінці все зводиться до машинного коду — байтів, які CPU розуміє як інструкції. mov rax, rbx

<pre>

Корисно, коли:

* concurrency;
* locks;
* lock-free data structures;
* reference counters;
* synchronization;
* kernel code.== Хороші практики ==

* performance optimization;
* understanding inlining;
* checking vectorization;
* reverse engineering bugs;
* learning compiler behavior;
* ABI debugging. * '''A64''' — instruction set для AArch64. * '''WebAssembly''' — portable binary instruction format для sandboxed runtime. В Assembly ви постійно думаєте: “у якому регістрі це лежить?” і “чи не перезапишу я потрібне значення?”. Assembly пов’язаний із безпекою, бо функціонує близько до пам’яті й CPU. NASM часто використовують у:

як приклад, для x86-64 можна побачити щось подібне:

'''Atomic operations''' — операції, які виконуються неподільно щодо інших threads. Вони дозволяють:

Деякі CPU працюють швидше або навіть вимагають, щоб інформаційні дані були вирівняні за певними адресами. * general-purpose registers;
* SIMD/vector instructions;
* stack;
* calling conventions;
* complex instruction set;
* legacy modes;
* operating system support. Для звичайних ERP, CRM, web, mobile або reporting systems Assembly майже ніколи не виступає як правильним вибором. * gdb;
* lldb;
* WinDbg;
* Visual Studio debugger;
* objdump;
* perf;
* Intel VTune;
* Instruments;
* perfetto;
* platform-specific debuggers. * важко переносити;
* швидко порушити ABI;
* compiler optimizations можуть взаємодіяти неочікувано;
* складно тестувати;
* складно підтримувати. ret

Приклад ідеї:

loop_start:

'''Stack''' — область пам’яті для function calls, local variables, return addresses і тимчасових даних.</div>

* ELF — Linux;
* PE/COFF — Windows;
* Mach-O — macOS/iOS.== Assembly і C/C++ ==

'''x86''' — історична технічна архітектура Intel/AMD. movq %rbx, %rax

* потрібен web app;
* потрібна ERP-бізнес-логіка;
* потрібен backend API;
* потрібна мобільна розробка програмного забезпечення;
* потрібна швидка підтримуваність;
* команда не має low-level досвіду;
* продуктивність ще не вимірювали;
* задачу можна вирішити C/Rust/Go;
* потрібна portability;
* потрібна безпечна робота з пам’яттю. Arm documentation описує A64 як instruction set, used in AArch64 and supported by Armv8-A, Armv8-R AArch64 and Armv9-A architectures.== Assembler ==

Потім linker об’єднує object files у executable або library. Compiler із високорівневої мови сам генерує подібні конструкції.== Reverse engineering ==

Assembly здатна бути невдалим вибором, якщо:

== Джерела ==

C і C++ найближчі до Assembly серед масових мов високого рівня. Для цього використовують disassemblers, debuggers і decompilers. Disassembler корисний для:
Branches потрібні для:
<pre>
Alignment важливий для:
Формати executable/object files:
Приклади наборів:
jmp
bl
== Пояснення термінів ==
x86-64 має:
Але Assembly сам по собі не виступає як “шкідливою мовою”. '''Intrinsics''' — функції компілятора, які дають доступ до спеціальних CPU instructions без написання сирого Assembly. Без документації Assembly-код оперативно стає майже нерозбірливим.== Debugging Assembly ==

'''RISC''' — Reduced Instruction Set Computer. Регістрів мало, тому Assembly-код має уважно працювати з ними. System call interface залежить від OS і architecture. * 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. У контексті [[K2 ERP]] Assembly здатна бути корисним лише опосередковано:
через Assembly знання користувачі можуть в debugging. RISC-V Assembly Programmer’s Manual описує стандартну RISC-V assembly language, яку підтримують GNU as і LLVM assembler. '''Проста аналогія:''' високорівнева мова каже “відсортуй список”, а Assembly каже процесору “поклади це значення в регістр, порівняй, зроби перехід, запиши в пам’ять”. Помилки з пам’яттю можуть бути дуже серйозними:

* embedded;
* OS kernels;
* performance;
* compilers;
* reverse engineering;
* security research;
* legacy systems.== Bootloader ==

'''Коротко:''' Assembly — це мова, де програміст функціонує майже напряму з процесором: регістрами, пам’яттю, стеком, інструкціями й calling conventions. System calls потрібні для:

'''Практична думка:''' у високорівневій мові ви створюєте змінні майже без обмежень. '''Inline assembly''' — вставка Assembly-коду в C/C++ або іншу мову. Це значно читабельніше, ніж відповідні байти машинного коду.</div>

* debugging;
* reverse engineering;
* аналізу compiler output;
* malware analysis;
* performance tuning;
* вивчення binary. '''WebAssembly''' або '''Wasm''' — binary instruction format для portable execution.

Багато Assembly вивчають саме через C/C++ compiler output. # Вимірювати performance до оптимізації. * NASM;

  • MASM;
  • GNU assembler або GAS;
  • LLVM assembler;
  • FASM;
  • YASM;
  • platform-specific assemblers. # Використовувати debugger і disassembler.== Intel syntax і AT&T syntax ==

Зазвичай використовують:

Addressing modes сильно залежать від ISA. Захист:

Перед ручною оптимізацією треба:

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

x86-64 зазвичай little-endian.

Ризики:
Не варто плутати WebAssembly з x86 або ARM Assembly: Wasm виконується через runtime, а не напряму CPU як native ISA.[[Категорія:Програмування]]

LLVM toolchain має власні assembler/disassembler функції ERP. Calling convention залежить від платформи. '''GNU assembler''' або '''GAS''' — assembler у складі GNU Binutils.== Alignment ==

* performance;
* SIMD;
* ABI;
* structs;
* embedded systems;
* binary compatibility.

Kernel і драйвери

AT&T syntax часто виглядає так:

Головна ідея Assembly — дати людині текстовий спосіб записувати машинні інструкції.== Instructions ==

GNU assembler

Assembly часто застосовується для в embedded systems. * Endianness — порядок байтів у багатобайтових значеннях. * Register — швидке сховище всередині CPU. # Розглядати intrinsics перед hand-written assembly. # Писати коментарі не “що”, а “чому”. Приклади x86-64 registers:

SIMD корисний для:

Assembly іноді використовують для performance. * працювати з pointers;

  • контролювати layout;
  • викликати intrinsics;
  • взаємодіяти з ABI;
  • писати системний код;
  • використовувати inline assembly;
  • компілювати під різні ISA. Неправильне розуміння memory model здатна призвести до рідкісних і дуже складних bugs. GNU assembler documentation зазначає, що це user guide для as GNU Binutils.== Assembly і malware ==
  • спеціальних CPU instructions;
  • performance-critical fragments;
  • embedded;
  • low-level control;
  • compiler barriers;
  • hardware access. ARM/AArch64 важливий для:

Loops

Цикли в Assembly зазвичай будуються через labels і conditional jumps. Branching — умовні або безумовні переходи.


Типові варіанти:

Але бізнес-логіку ERP майже завжди потрібно писати високорівневою мовою, а не Assembly.== SIMD і vector instructions ==

Memory model описує правила видимості операцій із пам’яттю між threads або cores. LLVM assembly і machine code tooling важливі для сучасних компіляторів. Окремо варто відзначити регістрів і правил. LLVM застосовується для в:

Assembly і документація

* return address; * local variables; * saved registers; * function arguments, якщо не вистачає registers; * stack frames. * startup code; * interrupt handlers; * bootloaders; * direct hardware access; * microcontroller initialization; * performance-critical routines; * power-sensitive code; * tiny memory environments.== Intrinsics == Assembly залежить від архітектури CPU. Debuggers часто використовують stack frames, щоб показати call stack. Машинний код — це байти, які виконує процесор. * освіти; * досліджень; * embedded; * custom processors; * open hardware; * experimentation; * academic CPU design. SIMD instructions виконують одну операцію над кількома елементами одночасно. * програма падає в native code; * немає source code; * треба читати crash dump; * треба зрозуміти stack trace; * виступає як memory corruption; * compiler optimization ускладнює debugging; * потрібно перевірити ABI; * performance profiler показує hot instruction.== NASM == Популярні assemblers:
Для x86 Assembly виступає як різні синтаксиси. * Inline assembly — Assembly-код, вставлений у код C/C++ або іншої мови. RISC-V важливий для: sub Assembly знання оптимізує зрозуміти: * які arguments ідуть у registers; * які arguments ідуть у stack; * де повертається result; * які registers зберігає caller; * які registers зберігає callee; * як вирівнюється stack; * як обробляються variadic functions.== Assembly і Rust == Вони або: x86 часто вважають CISC-архітектурою. b Atomic assembly instructions складні, бо треба враховувати memory ordering і CPU architecture. Якщо ABI порушено, код здатна компілюватися, але падати або працювати неправильно.== Linker ==

Addressing modes

Assembly — це читабельний текстовий запис цих інструкцій. Intel manual Volume 2 містить повний instruction set reference для Intel 64 і IA-32. * embedded продуктів; * industrial hardware; * firmware; * high-performance libraries; * cryptography; * drivers; * legacy binary support; * reverse engineering; * security audit; * performance-critical modules.== RISC-V == Rust застосовується для для системного програмування з фокусом на memory safety. * Machine code — байти інструкцій, які виконує процесор. GNU assembler documentation описує as як user guide для GNU assembler у складі GNU Binutils. Assembly не виступає як ERP-системою. * Instruction — команда процесора. * аналізу старих програм; * compatibility; * malware analysis; * security research; * debugging binary without source; * understanding protocols; * firmware analysis. Часто швидше оптимізує кращий алгоритм або layout даних. Assembly функціонує з пам’яттю напряму або через адреси. # Дотримуватися ABI і calling convention. Assembler перетворює assembly text у object file або machine code.== Atomic operations == Assembly здатна використовуватися в operating system kernels і drivers.[4] Endianness важливий для: Відмінності:

Assembly і ERP-системи

* файлів; * процесів; * пам’яті; * мережі; * вводу/виводу; * таймерів; * permissions.[5] * web; * sandboxed execution; * plugins; * edge computing; * cross-language runtime; * portable modules. * навчанні; * OSDev; * bootloaders; * low-level x86 experiments; * hand-written assembly modules. mov

Коли Assembly здатна бути невдалим вибором

Stack застосовується для для:

Практичний висновок

* Clang; * Swift compiler ecosystem; * Rust compiler backend historically via LLVM; * many modern language toolchains; * cross-compilation; * optimization pipelines. * Assembler — програма, яка перетворює Assembly у machine code або object file.

Assembly і високорівневі мови

Registers

add Вони потрібні для: * calling convention; * object file format; * type layout; * name mangling; * exception handling; * dynamic linking; * system call interface. * context switching; * interrupt handling; * system call entry; * low-level CPU setup; * synchronization primitives; * memory management; * hardware-specific code. Вона визначає: Код для x86-64 не запуститься напряму на ARM без перекомпіляції або емуляції. Intel Software Developer’s Manual описує архітектуру, середовище програмування та повний instruction set reference для Intel 64 і IA-32 процесорів. Assembly-level знання важливе для розуміння таких атак, бо вони часто залежать від CPU, memory access і branch behavior. jnz loop_start

Instruction Set Architecture

 ; тіло циклу Assembly-код теж потрібно тестувати. Він застосовується для в Microsoft/Windows ecosystem. Сильні сторони: Процесор не виконує Python, C#, Go або Swift напряму. |-
CISC складніші інструкції, історично більше можливостей в одній інструкції
RISC простіші інструкції, регулярніший набір операцій

Rust здатна замінити частину C/C++ там, де раніше могли знадобитися небезпечні низькорівневі підходи. як приклад, Linux x86-64 і Windows x86-64 мають різні механізми виклику системних функцій. Сценарії: Приклади AArch64-like інструкцій: як приклад, SIMD intrinsics дозволяють використовувати vector instructions через C/C++ API.[6] jmp done як приклад, x86-64 Windows і x86-64 Linux мають різні calling conventions. Bootloader — код, який запускається дуже рано й готує систему до виконання основної програми або OS. У embedded часто пишуть базовий код на C/C++, а Assembly — тільки там, де потрібен прямий контроль. AArch64 — 64-бітний execution state для Arm. Alignment — вирівнювання даних у пам’яті.== Memory model == dec rcx * налаштувати CPU; * підготувати memory; * завантажити kernel; * перевірити firmware; * налаштувати hardware; * перейти в інший execution mode. * SSE; * AVX; * AVX2; * AVX-512; * NEON; * SVE; * RISC-V Vector extension.[7]

Безпека

Популярний інструмент для навчання — Compiler Explorer, де можна подивитися Assembly output для C/C++, Rust, Go та інших мов. Addressing mode — спосіб вказати, де знаходиться operand.== Assembly і машинний код == System call — звернення програми до operating system kernel. Intel syntax часто виглядає так: NASM — Netwide Assembler, популярний assembler для x86/x86-64. Практичний принцип: Assembly — останній інструмент оптимізації, а не перший. ISA описує: