Assembler
Från Rilpedia
Assembler eller assemblyspråk är ett sätt att uttrycka maskinkoden för en dators processor på ett sätt som människor kan läsa och skriva. Maskinkod består av mönster av ettor och nollor och är i allmänhet svår för programmerare att använda. Assembler tillåter att bitmönstren istället skrivs med bokstäver och siffror, så kallade mnemnotekniska symboler, vilket väsentligen underlättar programmerarens arbete. Vidare tillhandahåller assembler möjligheten att använda symboliska namn för minnesadresser.
Det finns assemblerspråk definierade för alla processorer, men varje typ av processor har sin egen assembler. Detta gör att det i allmänhet inte går att använda ett assemblerprogram skrivet för en processor på en annan typ av processor. För att göra det möjligt att flytta program mellan olika processortyper används i stället ett högnivåspråk.
En kompilator för ett högnivåspråk översätter programkod skriven i språket till processorspecifik maskinkod och genom att använda olika kompilatorer kan samma högnivåkod användas för olika processortyper.
Det förekommer även att kompilatorn översätter högnivåspråket till en mellannivå, intermediärkod, som vid körningsögonblicket interpreteras (tolkas). En sådan mellannivå tar ofta mindre plats att lagra, och gör det möjligt att ha maskinneutral körbar kod. Välkända exempel på detta är p-kod för Pascal, och byte-kod för Java. NOP är en operation i assembler som står för No Operation.
Innehåll |
Översättning till maskinkod – och omvändningen
Program skrivna i assembler översätts med en assemblator till maskinkod. Maskinkoden som är binärkod kan via ett disassemblerande program återöversättas till assemblerkod (motsvarande är praktiskt inte möjligt i högrenivåspråk pga alltför stort avstånd till maskinkod).
Nackdelen är att läsbarheten blir nedsatt, då alla hopp- och minnesadresser måste döpas om till ett symboliskt namn med ett löpnummer, eftersom ursprungskoden inte finns tillgänglig. Det medför att om man vill veta programmets funktion måste man följa koden instruktion för instruktion. För att underlätta, kan en monitor i stället användas. Dessa har normalt en disassemblator inbyggd samt en trace-funktion som utför en instruktion i taget och mellan dessa visar innehållet i register, stack och arbetsareor. Sedan inväntas användarens respons innan nästa instruktion utförs. Typiska responser är "nästa instruktion", "hoppa till annat ställe", "sätt in 'x' i register/minnesarea", "avbryt", "kör till nästa brytpunkt" samt "kör till slutet".
Exempel
Några exempel på assemblerkod för olika processortyper.
IBM OS/360 assembler (och senare)
Exempel på assemblerkod från IBMs stordatorer (eng: mainframe). Den ursprungliga OS/360-assemblern kom till kring 1960 på IBMs laboratorium på Lidingö, och torde ha stått modell för de flesta av alla förekommande assemblerspråk därefter.
Inom IBM-världen kallas språket för ASM (eller BAL Basic Assembly Language; det är ofta en generationsfråga). ASM torde vara det vanligaste, kompletterad med beteckning för version, miljö mm, t ex S/390 ASM, ASM-H eller High Level Assembler (HLASM).
Från början skrevs alltid typ "OS/360", där OS står för Operating System, för att skilja från "DOS/360" (Disk Operating System) som innebar att miljön var minidator inte stordator. När minidatorerna fasade ut, började beteckningar typ "S/390" bli allmänna.
Egentligen är det så att när man pratar om hårdvaran, säger man t.ex. "S/370"; och pratar man om motsvarande operativsystem, säger man "OS/370".
AMODE ANY Accept both 24 and 31 bit addresses RMODE 24 May also be called by 24 bit address programs IEFBR14 CSECT , Control section start, module name and entry point USING IEFBR14,15 Establish addressability; reg 15 contains address of entry point B SAVE+72 Skip over PgmId & SaveArea DC AL1(L'PGMID) Length of name PGMID DC C'IEFBR14' The name itself SAVE DC 18F'0' Own save area; contains registers of calling program STM 14,12,12(13) Save regs of calling program ST 13,SAVE+4 Caller's save area addr LR 14,13 Retain caller's save area addr LA 13,SAVE Local save area addr USING SAVE,13 Switch addressability so we may use reg 15 ST 13,8(14) Report own save area addr to calling pgm * In case you actually want something done, put it here L 13,SAVE+4 Restore save area reg of calling pgm from own save area LM 14,12,12(13) Restore regs of calling pgm SR 15,15 Zero register 15 = return code "ok" ==> RC or CC * If something went wrong, put another return code in register 15 BR 14 Return addr in R14 -- go back to calling pgm END IEFBR14 End assembly and specify default entry point for Linkage Editor / Loader
- Det lilla programmet ovan heter IEFBR14 som IBMs klassiska dummy-program (den utför alltså "ingenting"), men är skriven fritt efter hur det troligen ser ut i senaste 31-bitsadress-version, och kan därför knappast bryta IBMs eventuella copyright. Det är alltså inte kopierat från något ställe.
I den allra första versionen innehöll programmet endast raden " BR 14 " (hoppa tillbaka till anropande program), därav namnet, men flera ändringar krävdes för att den skulle anpassas till IBMs konventioner för hur program ska se ut för att fungera i alla sammanhang och med nyare versioner av hård- och mjukvara.
Det kan tyckas att detta är rätt mycket kod för att faktiskt inte utföra någonting, men mainframe-världen är mer komplex än den är i andra miljöer. Rätt tidigt utvecklades conditional assembly ("villkorlig assembler"), vanligen kallad macroassembler även i andra miljöer. Med detta kunde snarlika grupper av återkommande programrader ges ett namn och med vissa anropsparametrar kan ovanstående kod i ett typiskt program t ex reduceras till:
AMODE ANY Accept both 24 and 31 bit addresses RMODE 24 May also be called by 24 bit address programs IEFBR14 SAVE ... RETURN RC=8 ..(at any point of error condition) ... RETURN END IEFBR14 End of assembly
Här måste macrona SAVE och RETURN vara utförligt fördefinierade antingen i ett särskilt bibliotek eller lokalt i programkoden. IBM har fördefinierat flera hundra standardmacron; varje enskilt företag kan ha minst lika många egna och vissa program har sin grupp som då är särskilt programtypiska.
i386/MS-DOS assembler
Följande kod kan köras på ett i386/MS-DOS-system och skriver ut texten "Hello, World!" på skärmen samt avslutar programmet. Programmet använder sig av instruktionen "int" för att anropa operativsystemet för att skriva ut texten på skärmen. Programmet utnyttjar möjligheten att använda symboliska namn; namnet "hello" är ett symboliskt namn för den minnesadress texten "Hello, World!" befinner sig på.
mov ah,9 mov dx,offset hello int 21h mov ah,4Ch int 21h hello db 'Hello, World!',0dh,0ah,'$'
MIPS-assembler
Följande är ett utdrag ur programkoden för en enkel processhanterare för multitasking på en MIPS-processor. Koden i exemplet är del av den kod som sparar undan register, pekare och stack (sw-instruktionerna) för den aktiva processen och byter till en annan (lw-instruktionerna).
lbu t5 0(t2) nop addiu t5 t5 1 nop sb t5 0(t2) sw t2 4(s1) ; store gp sw t3 8(s1) ; store sp sw t4 0(s1) ; write back pcb1 sw s2 0(s0) ; change curpcb <= pcb2 lw k1 0(s2) ; change CP+4 lw gp 4(s2) ; change gp <= glob2 lw sp 8(s2) ; change sp nop b restore nop
Motorola M68k
Adress: MOVE.L A0, $FF8240 ADDI.B #$D0, D1 LEA ($0400,A0), A0 ROL.W (A0) CMP.W D1, (A0) BNE.S Adress