Asemblerio kalba

**Asemblerio kalba** – žemo lygio programavimo kalba, skirta tam tikros architektūros kompiuterių mašininėms komandoms žymėti.

Pavyzdžiui, kompiuteris su atitinkamu procesoriumi, supras šią mašininę komandą:

 10110000 01100001

Tačiau programuotojui bus lengviau suprasti šios mašininės komandos atitikmenį asemblerio kalba:

 mov al, 061h

kuri reiškia procesoriaus komandą įkelti skaičių 61 (97 dešimtainėje sistemoje) į procesoriaus registrą al. Komanda „mov“ yra angliško žodžio „move“ (perkelti) santrumpa ir, kartu su kableliais atskirtais komandos parametrais, yra tipiška asemblerio kalba parašytos programos eilutė.

Asemblerio kalbos komandų vertimas į mašininę kalbą atliekamas asemblerio programa, ir atverčiamas atgal disasemblerio programa. Skirtingai nuo aukšto lygio kalbų, komanda, asemblerio programa paversta į mašininį kodą ir atstatyta atgal disasemblerio programa dažniausiai visiškai atitinka pirminį tos komandos variantą.

Kiekviena kompiuterio architektūra turi savo mašininį kodą ir savo asemblerio kalbą. Kompiuteriai skiriasi palaikomų operacijų skaičiumi ir tipais, jie gali skirtis procesorių registrų dydžiais ir skaičiumi, skirtingais apdorojamų duomenų tipais.

Įvairios skirtingos asemblerio kalbos komandos, turinčios tą pačią paskirtį, gali būti verčiamos į tokią pačią mašininę komandą. Tačiau dažniausiai naudojamos tos asemblerio kalbos komandos, kurios aprašytos gamintojo dokumentacijoje.

## Įvairūs pavyzdžiai

Skirtingai, nei daugumoje kitų programavimo kalbų, *asembleriu* parašytos programos priklauso nuo to, kokiam procesoriui, operacinei sistemai ar net asemblerio programos versijai jos skirtos.

### i8086, DOS, Intel sintaksė
 ; Programa "Sveikas pasauli", 8086 .COM vykdomasis formatas, Intel sintaksė
 ; Komentarai atskiriami kabliataškiu
 
 CSEG segment                                 ; Segmento apibrėžimas
 ASSUME CS:CSEG, DS:CSEG, SS:CSEG, ES:CSEG    ; Segmentinių registrų reikšmių apibrėžimas
 ORG 100h                                     ; Įėjimo į programą taško adresas
 
 Start:
 JMP ProgCode                                 ; Pereiname į kodo pradžią (peršokame per tekstą)
 OutString db 'Sveikas, pasauli!',13,10,'$'   ; Eilutė teksto, skirta išvedimui į ekraną
 
 ProgCode:
 MOV AH, 9h                                   ; Į registrą AH perkeliamas DOS teksto išvedimo f-jos kodas
 MOV DX, offset OutString                     ; Į registrą DX perkeliamas teksto eilutės adresas
 INT 21h                                      ; Pertraukimas nr. 21h: DOS f-jų iškvietimas
                                              ; Rezultate išvedama teksto eilutė "Sveikas, pasauli!"
 ProgExit:
 INT 20h                                      ; Pertraukimas nr. 20h: DOS programos užbaigimas
 
 CSEG ENDS                                    ; Segmento pabaiga
 END Start                                    ; Nurodomas įėjimo taškas

### i386, UNIX (FreeBSD), AT&T sintaksė
 # Programa "Sveikas pasauli", x386 FreeBSD vykdomasis failas, AT&T sintaksė
 # Komentarai pradedami "#" ženklu.
 
 .data                           # Duomenų sekcija
 
 msg:
 .asciz "Sveikas, pasauli!\n"    # Teksto eilutė spausdinimui
 len = . – msg – 1               # Teksto eilutės ilgis
 
 .text                           # Kodo sekcija
 .global _start
 
 _start:                         # Programos įėjimo taškas
 pushl   $len                    # Argumentas nr.3: teksto eilutės ilgis
 pushl   $msg                    # Argumentas nr.2: teksto eilutės adresas (rodyklė)
 pdushl   $1                      # Argumentas nr.1: failo deskriptorius
 movl    $4, %eax                # OS rašymo funkcija
 insint  $0x80                   # Iškviečiame OS funkciją, tekstas išvedamas į ekraną
 addl    $12, %esp               # Išvalome steką nuo argumentų
 
 pushl   $0                      # Išėjimo iš programos statusas
 movl    $1, %eax                # OS išėjimo iš programos funkcija
 int     $0x80                   # Iškviečiame OS funkciją, programa užbaigiama