Wiki: Assembly

Startsidan | Senaste ändringarna | Lista alla sidor | Sök


Assembly

Assembly är ett programmeringsspråk där varje kommando, eller instruktion, är en direkt översättning från binära processorinstruktioner till textform.

Assembly anses ofta som det språk som ger absolut störst kontroll över vad som händer, då man i assembly skriver varje enskild instruktion som processorn ska exekvera.

Det spekuleras ofta kring huruvida assembly är portabelt eller inte. Sålänge man håller sig till ett portabelt standardbibliotek är sannolikheten att få koden portabel ganska stor. Det som kan försvåra processen är oftast skillnaden mellan hur funktioner anropas i olika operativsystem. Förut var det mer vanligt att koda med operativsystems-interrupts i assembly. Interrupts är vanligtvis helt olika beroende på vilket operativsystem, vilket radikalt sänker möjligheten att få koden portabel. Använder man ett länkat bibliotek används automatiskt en implementation för det systemet man befinner sig i.

,,ven om assembly kanske, med väldigt mycket knep och knåp, går att få portabelt under samma platform mellan olika operativsystem är det ändå inte ett språk man vanligtvis använder när man skriver program. Det beror mycket på att assembly blir svårt att hålla strukturerat när det börjar bli för mycket kod. Assembly är som mest användbart när man skriver kernelkod eller drivrutiner, men även detta görs ofta i C istället - Eller en blandning.

Det finns två större syntaxstandarder för hur assemblerkod skall skrivas; AT&T och Intel. Intelsyntaxet är mer minimalistiskt, innehåller endast nödvändiga tecken och är ganska läsvänligt, medan AT&T-standarden är striktare. AT&T-syntaxet är populärt bland GNU-anhängare, medan Intel-syntaxet förekommer mer i Windows och i flera BSD-derivats kernelkod (T.ex. FreeBSD).

Intel-syntax:

  1. push rbp
  2. mov rbp,rsp
  3. sub rsp,0x10
  4. lea rsi,[rbp-4]
  5. mov edi,0x500dd0
  6. call 0x4006a0


Exakt samma sak i AT&T-syntax:
  1. push %rbp
  2. mov %rsp,%rbp
  3. sub $0x10,%rsp
  4. lea 0xfffffffffffffffc(%rbp),%rsi
  5. mov $0x500dd0,%edi
  6. callq 0x4006a0


För den intresserade; Koden gör inget speciellt, den arrangerar stacken och kör en funktion på minnesadressen 0x4006a0.

De extra tecken som används i AT&T är för att beteckna vilken typ argumentet är av. Om dessa är nödvändiga går att diskutera.

Fördelar


  • Kontrollen man får; allt som datorn stödjer kan man göra - Om man som inloggad användare har behörighet dvs.

  • Vissa saker går inte att göra i högnivåspråk, och många språk producerar kompilerad kod som kanske inte i alla lägen är lika effektiv som handskriven.

  • I och med att man lär sig hur datorn fungerar, hur funktionsanrop, minneshantering och binär aritmetik fungerar blir det enkelt att förstå program och lätt kunna förstå sig fram till felen istället för att leta.

  • Det är intressant, man lär sig mycket och det är många som anser att det är kul att förstå saker på djupet.

Nackdelar


  • Koden blir väldigt klumpig eftersom du måste skriva allt själv.

  • Det tar lång tid.

  • Man får lätt kryptiska fel utan någon som helst information om vad som är fel.

  • Koden går absolut inte att köra på någon annan plattform.

  • Man har ingen intelligent kompilator som kanske arrangerar, omstrukturerar och skriver om koden åt en. Många C-kompilatorer, t.ex. Intel C/C++ Compiler, har inprogrammerat hur assemblyinstruktioner ska placeras vart och användas hur för att programmet ska prestera optimalt.




Kategori: Programmeringsspråk

Senast ändrad av Independence 16:27 - 20:e Mars 2007

Atom feed

Innehållet på denna sida kan ändras utav alla som är medlemmar på Blinkenlights, men du måste logga in för att kunna ändra något.