Pojdi na vsebino

Zbirni jezik

Iz Wikipedije, proste enciklopedije


Zbirni jezik (angleško assembly language, iz assemble sestavljati) je nizkonivojski programski jezik druge generacije (2GL) – prve generacije (1GL) je strojna koda – ki je napisan s pomniki. Splošno velja, da ti pomniki predstavljajo berljive enačice dvojiških zaporedij (ničle in enice), ki jih je treba sestaviti, da dobimo za osrednje preračunalo razumljive ukaze. Natančno gledano, pomniki predstavljajo ukazne nize (angl. operation codes, skrajšano opcodes), ki so v osrednjem preračunalu sestavljeni iz ISA (ang. Instruction Set Architecture, sestava ukaznih nizov). Te ukaze pa je nato navadno treba povezati z določeno skladnjo, da dobimo delujoč in izvršljiv program. Določene programske opreme zbirnikov, kakor je za zgled FASM, samo zamenjajo pomnike in spremenljivke z ustreznimi ukazi v strojnem programskem jeziku. Tako se dobi ploske izvršilne datoteke, ki vsebujejo (sicer odvisno od izkušenj posameznega računalniškega ukazopisca) strojne ukazne nize z izjemno postopkovno uspešnostjo.

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 ukaze 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]