Assembler — assembly tilida yozilgan instructionlarni mashina kodi va object file’ga aylantiradigan dastur.
Assembly tili processor instructionlarini odam o‘qiy oladigan mnemonic va operandlar bilan ifodalaydi. Assembler ushbu matnni target arxitektura tushunadigan binary encodingga o‘giradi.
Assembler compiler pipeline’ning yakuniy qismlaridan biri bo‘lishi yoki dasturchi tomonidan bevosita ishlatilishi mumkin.
Assembly tili
Mashina kodi bit va baytlardan iborat.
Assembly instruction:
add rax, rbx
assembler tomonidan x86-64 instruction encodingiga aylantiriladi.
Mnemonic:
mov;add;sub;cmp;jmp;call;ret
kabi nomlardan iborat.
Target architecture
Har instruction set uchun assembly syntax va encoding boshqa.
Misollar:
- x86;
- x86-64;
- ARM;
- AArch64;
- RISC-V;
- MIPS;
- AVR.
Bir arxitektura assembly code’i boshqasida to‘g‘ridan-to‘g‘ri assemble qilinmaydi.
Syntax turi
x86 dunyosida ikki keng tarqalgan syntax mavjud.
Intel syntax
mov rax, rbx
Destination birinchi.
AT&T syntax
movq %rbx, %rax
Source birinchi, register oldida %, immediate oldida $ bo‘lishi mumkin.
Assembler optioni syntaxni belgilaydi.
Label
Label instruction yoki data manziliga nom beradi.
start:
mov rax, 1
jmp finish
finish:
ret
Assembler label offsetini hisoblab branch encoding yaratadi.
Final absolute address linker yoki loadergacha noma’lum bo‘lishi mumkin.
Directive
Directive CPU instruction emas. U assemblerga object file qanday yaratilishini bildiradi.
Misollar:
- section tanlash;
- data e’lon qilish;
- alignment;
- symbol visibility;
- include;
- macro;
- target mode.
Syntax assemblerga bog‘liq.
Section
Assembly source odatda sectionlarga bo‘linadi.
Text
Executable instructionlar.
Data
Boshlang‘ich qiymatli writable data.
Read-only data
Constant va stringlar.
BSS
Zero-initialized data uchun joy.
Assembler object file sectionlarini yaratadi.
Data e’lon qilish
Misol:
message:
db "Hello", 0
db byte data yaratishi mumkin.
Boshqa directive’lar word, double word va quad word qiymatlar uchun ishlatiladi.
Symbol
Assembler local va global symbol yaratadi.
Global symbol linkerga boshqa object file’dan ko‘rinadi.
global main
main:
...
Tashqi function:
extern printf
relocation bilan bog‘lanadi.
Relocation
Assembler har symbolning final manzilini bilmasligi mumkin.
U object file’da relocation yozadi:
- qaysi offset;
- qaysi symbol;
- qanday hisob;
- qancha bit.
Linker barcha object joylashuvini bilib relocationni yechadi.
Object file
Assembler natijasi:
- ELF;
- COFF/PE;
- Mach-O;
- raw binary;
- platformaga xos format
bo‘lishi mumkin.
Object file tarkibida:
- machine code;
- section;
- symbol table;
- relocation;
- debug info
saqlanadi.
One-pass va two-pass
One-pass assembler
Source’ni bir marta o‘qishga intiladi.
Oldinda e’lon qilingan label final offseti noma’lum bo‘lsa qo‘shimcha fixup kerak.
Two-pass assembler
Birinchi pass label va section offsetlarini yig‘adi.
Ikkinchi pass instruction encoding va reference’larni yaratadi.
Zamonaviy assemblerlar bundan murakkabroq pipeline ishlatishi mumkin.
Macro assembler
Macro bir nechta assembly qatorini nom ostida qayta ishlatadi.
SAVE_REGS
assembler vaqtida instructionlar ketma-ketligiga kengaytiriladi.
Macro function emas; runtime call yaratmaydi.
Conditional assembly
Build target yoki constantga qarab code qo‘shiladi.
Masalan:
Bu preprocessor yoki assembler directive bilan bajariladi.
Alignment
Instruction va data ma’lum byte chegarasiga tekislanishi mumkin.
Alignment:
uchun muhim.
Assembler padding byte qo‘shishi mumkin.
Pseudo-instruction
Ba’zi assembly instruction haqiqiy bitta machine instruction emas.
Assembler uni bir yoki bir nechta real instructionga aylantiradi.
RISC-V li yoki ARMdagi ayrim constant load yozuvlari misol bo‘lishi mumkin.
Inline assembly
High-level tildagi function ichida assembly yoziladi.
Qo‘llanishlar:
- maxsus CPU instruction;
- hardware access;
- optimization;
- memory barrier;
- system code.
Compilerga qaysi register va memory o‘zgargani to‘g‘ri bildirilmasa, optimization xato natija chiqarishi mumkin.
Calling convention
Assembly function ABIga rioya qiladi.
U:
- argument registerlari;
- return value;
- callee-saved register;
- stack alignment;
- stack cleanup;
- exception/unwind ma’lumoti
ni to‘g‘ri boshqaradi.
Debug information
Assembler source line va symbol ma’lumotini object file’ga qo‘shishi mumkin.
Debugger instruction va labelni ko‘rsatadi.
Hand-written assembly’da stack unwind metadata bo‘lmasa stack trace uzilishi mumkin.
Disassembler bilan farqi
Assembler:
assembly → machine code
Disassembler:
machine code → assembly ko‘rinishi
Disassembly original source, label va commentlarni to‘liq tiklamaydi.
Cross-assembler
Bir hostda boshqa target uchun object code yaratadi.
Embedded developmentda:
x86 host → ARM mikrokontroller
keng qo‘llanadi.
Assembler target ABI va object formatga mos bo‘lishi kerak.
Diagnostika
Assembler xatosida:
- target architecture;
- 32/64-bit mode;
- syntax;
- invalid operand;
- instruction extension;
- section;
- symbol;
- relocation;
- alignment;
- ABI
tekshiriladi.
Instruction CPU tomonidan qo‘llanmasa program runtime’da illegal instruction xatosi bilan tugashi mumkin.
Instruction encoding
Assembler operand turi, register va immediate qiymatga qarab instructionning aniq binary encodingini tanlaydi. x86da bir mnemonic bir nechta opcode va addressing variantiga ega bo‘lishi mumkin.
Encoding tarkibida prefix, opcode, ModR/M, SIB, displacement va immediate maydonlari bo‘lishi mumkin. ARM va RISC-V kabi arxitekturalarda instruction formatlari ko‘proq qat’iy uzunlikka ega.
Assembler qisqa branch sig‘sa ixcham encoding, masofa katta bo‘lsa uzunroq encoding tanlashi mumkin. Bu jarayon branch relaxation deb ataladi.
Listing fayli
Assembler source qatori, offset, machine byte va symbolni birga ko‘rsatadigan listing yaratishi mumkin. U low-level debugging, firmware audit va instruction encodingni o‘rganishda foydali.
Bog‘liq tushunchalar
Assembly language, Machine code, Instruction set, Object file, Symbol, Relocation, Linker, ABI, Macro, Disassembler