Bosh sahifa Wiki Assembler

Assembler

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:

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