Zbirni jezik

Iz Wikipedije, proste enciklopedije
Skoči na: navigacija, iskanje


Zbirni jezik (angleško assembly language, assemble - sestavljati) je nizkonivojski programski jezik druge generacije (prve generacije je strojna koda), ki je napisan z mnemoniki. Posplošeno velja, da mnemoniki predstavljajo berljive inačice dvojiških zaporedij (ničle in enice), ki jih je potrebno sestaviti, da dobimo centralnemu procesorju razumljivo kodo. Natančno gledano, predstavljajo mnemoniki ukazne kode (angl. operation codes, skrajšano opcodes), ki so v centralni procesni enoti definirani po ISA arhitekturi (angl. Instruction Set Architecture). To kodo je nato običajno potrebno še povezati z določenimi strukturami, da dobimo delujoč izvedljiv program. Določene programske opreme zbirnikov, kot je na primer FASM, samo zamenjajo mnemonike in operande oziroma parametre s ustreznimi instrukcijami v strojnem programskem jeziku. Na ta način se dobi ploščate binarne izvršilne datoteke, ki vsebujejo (sicer odvisno od izkušenj posameznega računalniškega programerja) strojno kodo z izjemno algoritemsko učinkovitostjo.

Zbirni jezik predstavlja najboljši približek dobesednemu prevodu navodil, ki jih računalnik izvaja, v človeku razumljivo obliko. Reklo bi se lahko tudi da je zbirni jezik oče vseh drugih programskih jezikov, saj se vsi jeziki, ki uporabljajo prevajalnik prevajajo v zbirni jezik (vendar pa večina prevajalnikov teh jezikov kodo samodejno po koncu prevajanja še sestavi in poveže).

Kot nizkonivojski programski jezik, je jezikoslovje sestavljalnika vezano na specifičen tip računalnika. Na primer jezikoslovje zbirnika za Intelove procesorje (na kratko »x86 zbirnik«) izdeluje programe, ki lahko tečejo samo na Intelovih in vseh Intelovim skladnih procesorjih, vendar pa je ob tem vredno pomniti da to velja tudi za vso že prevedeno kodo višjenivojskih jezikov.

Dandanes ima velika večina računalnikov medsebojno skladno strojno opremo, ampak medsebojno neskladno programsko opremo. V taki situaciji ima zbirni jezik v prenosljivosti prednost pred višjenivojski, saj ni nujno vezana na programsko opremo.

Zaradi svoje neposrednosti ima zbirni jezik lahko tudi druge prednost, saj lahko programer v zbirniku naredi vse kar je izvedljivo v vseh višjenivojskih programskih jezikih skupaj. Iz podobnih razlogov je možno vsak obstoječi sestavljen program razstaviti nazaj v zbirno obliko.

Jezikoslovje zbirnega programskega jezika[uredi | uredi kodo]

Jezikoslovje tega jezika temelji na strojni kodi v katero se ta le-ta neposredno sestavlja. V določenih primerih je strojna koda v predstavitvi kot človeku razumljivo besedilo poenostavljena, zato da je delovanje jezika bolj intuitivno.

Način delovanja procesorja se odraža v jeziku nekako takole:

  • Premikanje podatkov (MOV)
    • iz spomina v procesor
    • med deli procesorja
    • iz procesorja v druge naprave
  • Delo s podatki
    • računske operacije (ADD kot +, SUB kot -, itd)
    • logične operacije (AND kot logični in, OR kot logični ali, itd)
    • primerjave (CMP, TEST, itd)
  • Spreminjanje poteka programa
    • Skok na drugo mesto v programu (JMP)
    • Skok na drugo mesto v programu pod pogojem (JE, JNE, JA, itd)

Poleg teh osnovnih mnemonov pa različni procesorji vsebujejo stotine specializiranih mnemonov, ki delujejo kot bližnjice v pri bolj zapletenih problemih. Z podrobnejše informacije o le-teh je navadno na voljo dokumentacija procesorja.

Pri zbirnem jeziku ni vsiljenih pomnilniških struktur, posledično pa tudi ne spremenljivk ali podprogramov. Vso naslavljanje (kje se iščejo podatki in kje se naj nadaljuje program pri skokih) se zato opravlja samo na podlagi razdalje od izhodiščne točke, ki se nahaja na začetku programa, termin za to pa je »odmik«. Ta odmik se v programski kodi piše skrajno levo, podbno kot oštevilčevanje pri programskem jeziku BASIC. Podobno kot pri BASICu, je tudi pri zbirnem jeziku obvezno označevanje opuščeno in lahko se uporablja kose besedila, ki jih zbirnik potem sam zamenja z primernimi številčnimi odmiki.

Primer programa v zbirniku[uredi | uredi kodo]

Tole je primer »živijo svet« programa v Ploščatem Zbirniku (FASM):

format PE GUI 4.0 
include 'win32ax.inc'
.code
        invoke  MessageBox,HWND_DESKTOP,"Zivijo svet!«,"Program Zivijo Svet«,MB_OK
        invoke  ExitProcess,0

Soroden primer programske opreme »živijo svet«, v ELF zapisu, brez pred definiranih makroinstrukcij mnemonikov:

format ELF executable
entry Zacni

segment readable executable

Zacni:

        MOV EAX,4
        MOV EBX,1
        MOV ECX,SPOROCILO
        MOV EDX,VELIKOST
        INT 0x80

        MOV EAX,1
        XOR EBX,EBX
        INT 0x80

segment readable writeable

SPOROCILO DB 'Zivijo svet!',0xA
VELIKOST = $-SPOROCILO

Tule pa je primer DLLja napisanega v Ploščatem Zbirniku (FASM):

format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32axp.inc' 

section '.code' code executable readable

proc DllEntryPoint      hinstDLL,fdwReason,lpvReserved
                mov     eax,TRUE
                ret
endp

proc Encrypt    dataBuffer,dataLenght
                mov     esi,[dataBuffer]
                mov     ebx,esi
                add     ebx,[dataLenght]
                dec     ebx
                mov     edx, 'PASS'
ecryptZanka:    mov     eax, dword [esi]
                xor     eax, edx
                mov     dword [esi],eax
                add     esi,4
                cmp     esi,ebx
                jna     ecryptZanka
                ret
endp

section '.edata' export data readable

export  'CRYPTODLL.DLL',\
        Encrypt,        'Encrypt'

Ko se neki program enkrat sestavi, ga lahko v obratnem postopku spet razstavimo. Tule je primer tega kar dobimo iz programa za razstavljanje:

:004012A2 0500466F72              add eax, 726F4600
:004012A7 6D                      insd
:004012A8 3100                    xor dword ptr [eax], eax
:004012AA 0D010D0041              or eax, 41000D01
:004012AF 7070                    jo 00401321
:004012B1 204368                  and byte ptr [ebx+68], al
:004012B4 61                      popad
:004012B5 6C                      insb
:004012B6 6C                      insb
:004012B7 65                      BYTE 065h

Pri čemer prvi stolpec kaže odmik, drugi stolpec heksadecimalno predstavitev nerazstavljene kode, zadnji pa razstavljene mnemone z parametri.

Glej tudi[uredi | uredi kodo]

Zunanje povezave[uredi | uredi kodo]


Glavni programski jeziki (več)

Industrijski: ABAP | Ada | C | C++ | C# | COBOL | Delphi | Fortran | java | JavaScript | Lisp | Objective-C | Perl | PHP | PL/SQL | Python | SAS | sh | SQL | Visual Basic | zbirnik

Akademski: Eiffel | Haskell | Logo | ML | paskal | prolog | Scheme | Smalltalk

Zgodovinski: ALGOL | APL | AWK | BASIC | Clipper | PL/I | Simula