|  |  |
| --- | --- |
|    | **Šiam straipsniui ar jo daliai trūksta išnašų į šaltinius.**Jūs galite padėti Vikipedijai pridėdami tinkamas išnašas su šaltiniais. |

**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 skiriasi, priklausomai 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
```