assembleringsspråk | |
---|---|
Språkklass | nödvändigt |
Utförandetyp | monteringsbar |
Framträdde i | 1949 |
Filtillägg _ | .asmeller [1].s |
Mediafiler på Wikimedia Commons |
Assembly language ( English assembly language ) - representationen av processorkommandon i en läsbar form. Assembly-språk anses vara ett programmeringsspråk på låg nivå , i motsats till högnivåspråk som inte är knutna till en viss implementering av ett datorsystem. Program skrivna på assemblerspråk översätts otvetydigt till instruktionerna för en viss processor och kan i de flesta fall inte porteras utan betydande ändringar för att köras på en maskin med en annan instruktionsuppsättning. En assembler är ett program som konverterar assemblerspråkskod till maskinkod; ett program som utför en omvänd uppgift kallas en disassembler.
De första montörerna designades av Kathleen Booth 1947 under ARC2 [2] och av David Wheeler 1948 under EDSAC [3] , medan termen "montör" inte användes, utan bara kallade språket "en uppsättning grundläggande instruktioner " ( Engelsk grundordningsuppsättning ) respektive " initiala kommandon " ( engelska initiala order ). För första gången började termen "assembler" för processen att kombinera fält till ett kontrollord användas av senare rapporter om EDSAC.
I de tidiga stadierna av utvecklingen av programmering introducerades begreppet autokod - ett programmeringsspråk, vars meningar i grund och botten liknar kommandona och bearbetade data i ett visst maskinspråk [4][ betydelsen av faktum? ] . Termen används för närvarande inte faktiskt.
Historiskt sett, om maskinkoder anses vara den första generationen programmeringsspråk, kan assemblerspråk betraktas som den andra generationens programmeringsspråk. . Bristerna i assemblerspråket, till exempel svårigheten att utveckla stora mjukvarusystem på det, ledde senare till uppkomsten av tredje generationens språk - högnivåprogrammeringsspråk (som Fortran , Lisp , Cobol , Pascal ) , C och andra).
Det finns ingen vanlig syntax för assemblerspråk. Eftersom instruktionssystemen för olika processorer skiljer sig markant, skiljer sig även monteringsspråken för dessa processorer. Dessutom kan varje assemblerprogram använda en annan syntax. I assemblers för x86-processorer används den så kallade Intel-syntaxen mest och i mindre utsträckning AT&T-syntaxen .
Den grundläggande konstruktionen av assemblerspråket är en mnemonisk eller mnemonisk kod - en kort symbolisk representation av en processorinstruktion. Som regel består den av flera tecken som anger vilken åtgärd som ska vidtas (till exempel movatt överföra från ett register till ett annat, addatt lägga till värden, etc.). Mnemoniken kan också inkludera objektet på vilket operationen utförs (register, minne, stack) eller andra funktioner (påverkan på flaggregistret , exekveringsvillkor, etc.), men i andra dialekter kan samma funktioner specificeras i operander.
Som regel har assembleraren för varje processor sin egen traditionella uppsättning minnesminnen, men det finns assemblerare med plattformsoberoende syntax (som AT&T-syntaxen), men endast notationer förblir plattformsoberoende i dem, koden för en processor kan inte direkt överföras till annan.
Register, konstantvärden, adresser till minnesceller och I/O-portar , konstanter, etiketter etc. kan anges som operander. Olika assemblerare kan kräva en annan ordning av operander: i vissa implementeringar kommer operatorn som värdet skrivs i först, i andra kommer den sist. Som regel är operander separerade från instruktionsmnemonics med mellanslag.
Den vanligaste datatypen som de flesta processorer kan arbeta med är ett heltal packat i ett maskinord , eller en eller flera byte , mer sällan ett flyttal . I assemblerspråksprogram används värden som ges i olika talsystem mycket oftare. Först och främst, i datorer med en åtta-bitars byte, används ofta hexadecimal notation , eftersom två hexadecimala siffror placeras i en byte. Vissa värden kan skrivas i binära koder. I tidiga datorer med en sexbitars byte påträffades också det oktala talsystemet . Skrivmetoderna kan skilja sig åt i olika sammanställare, till exempel:
Dessutom krävs det ibland att specificera datablock som laddas tillsammans med programkoden, för vilka assemblern kan innehålla specialiserade direktiv. Moderna assemblerare kan också stödja organiseringen av data i form av olika strukturer .
Assemblers kan stödja olika konstruktioner för att göra monteringskoden lättare att läsa, för att befria programmeraren från behovet av att hålla reda på instruktionsadresser och för att implementera element som är specifika för högnivåspråk.
Som regel använder monteringskoden inte indrag och operatorparenteser som är karakteristiska för högnivåspråk . Monteringskoden skrivs vanligtvis i flera kolumner, som inkluderar:
Detta sätt att skriva återspeglar det speciella med exekveringen av program på processorer för allmänna ändamål: på maskinkodernivån är programmen vanligtvis linjära, har ingen struktur, och från en plats i programmet kan en övergång göras till en annan, oavsett av var början av programkoden finns och programmet kommer att fortsätta exekveringen från den punkten på den plats där överföringen gjordes. Ett exempel på ett assemblerprogram för PIC16- arkitekturen :
Återigen: movf 0x40 , W ;Kopiera plats 0x40 (decimal 64) till W-registret addlw 0x05 ; Lägg till konstant 5 till W-registret movwf PORTC ;Skriv W-register till mikrokontrollerns PORTC- utgångsport clrw ;Rensa W-registret (denna instruktion har ingen operands ) Igen ; Gå till etiketten igenEftersom assemblerkoden otvetydigt översätts till maskinkod för en given processor, tillåter detta dig att mer fullt ut använda processorns alla funktioner, minska antalet onödiga "tomgångsoperationer" och använda andra metoder för programkodsoptimering som inte är tillgängliga när man använder kompilatorer leder dock utvecklingen av att optimera kompilatorer till att kvaliteten på koden de genererar kan vara högre än vad en måttligt skicklig assemblerprogrammerare kan skriva [5] . Dessutom, ju större volym programmet är, desto mindre blir vinsten från att använda assemblerspråket.
Assembly-språkprogram tillåter inte odefinierat beteende , men i allmänhet kräver skrivning och felsökning av kod i assembler mer ansträngning. Typkontroll är inte tillgänglig i assembler , varför innebörden av ett visst värde och de tillåtna åtgärderna på det måste kontrolleras av programmeraren själv. När man skriver program på assemblerspråk krävs det att man ständigt använder stacken och ett begränsat antal allmänna register, samt pekare, vilket kräver att programmeraren är uppmärksam och har ett bra minne.
Assembly-språkprogram är nästan omöjliga att porta till en maskin med en annan arkitektur eller instruktionsuppsättning utan att skriva om programmet, även om en "cross-platform" assembly-språkdialekt användes vid skrivning: olika processorarkitekturer har olika uppsättningar av register, flaggor, olika maskinordsstorlekar och kan också ha högt specialiserade kommandon som inte är tillgängliga på andra plattformar.
Assemblerprogrammet har fler möjligheter att interagera med hårdvaran och OS-kärnan . Till exempel i tidiga hemdatorer och spelkonsoler kanske det inte fanns en inbyggd timer med tillräckligt hög upplösning, men samtidigt var processorns klockfrekvens standard för alla enheter av samma typ, vilket gjorde det möjligt att använda processorn som en timer, räkna antalet cykler för att utföra vissa kommandon och infoga tomma operationer på rätt ställen. I moderna processorer som använder inbyggda prestandaoptimeringskretsar, dynamiska klockfrekvensförändringar och komplexa avbrottssystem, och ännu mer under kontroll av multitasking OS , har sådana tekniker blivit omöjliga, men de fortsätter att användas på vissa mikrokontroller .
Tillkomsten av montörer underlättade avsevärt uppgiften att programmera tidiga datorer, men ganska snabbt krävde komplexiteten hos tillämpade problem användning av högnivåspråk. Dessa språk kördes dock ganska långsamt, och dessutom hade de inte alltid tillgång till datorns alla hårdvarufunktioner. När prestanda för stordatorer och minidatorer ökade, och med tillkomsten av språk som C , började relevansen av assemblerspråk minska, men steg igen med tillkomsten av mikrodatorer . Som regel hade tidiga mikroprocessorer låg prestanda och en liten mängd tillgängligt RAM , och dessutom dök inte högkvalitativa språkkompilatorer för högnivåspråk upp för dem omedelbart. Ofta skrevs program för hemdatorer, inklusive spel, helt i assembler. Men i början av 2000-talet lades optimerande kompilatorer till datorernas växande prestanda , vilket genererade maskinkod som var mer optimal än en genomsnittlig programmerare kunde skriva. Dessutom har frågan om portabilitet mellan olika plattformar blivit viktig.
Assembly språk används också vid felsökning och reverse engineering , med hjälp av disassemblerprogram . Med hjälp av disassemblern kan du styra exekveringen av programmet på maskininstruktionsnivå, vilket är användbart till exempel när du söker efter platser med odefinierat beteende eller fel som uppstår när du arbetar med pekare.
För att underlätta utvecklingen användes följande tillvägagångssätt: det mesta av koden är skriven på ett språk på hög nivå, och endast sektioner för vilka prestandan är kritisk, eller som kräver direkt åtkomst till hårdvaruresurser, skrivs i assembler.
Detta program skickar tillbaka ett tecken som tagits emot via UART-serieporten ("Echo"):
mov SCON , #50 h mov TH1 , #0 FDh orl TMOD , #20 h setb TR1 igen: clr RI jnb RI , $ mov A , SBUF jnb RI , $ clr TI mov SBUF , A jnb TI , $ sjmp igen Exempel på kompilering av C till assemblerspråk för ARM-arkitekturenBitoperationer:
C:
z = ( a << 2 ) | ( b & 15 );Assemblerare:
ADR r4 , a ; få adress för en LDR r0 ,[ r4 ] ; få värdet av en MOV r0 , r0 , LSL #2 ; utföra skift ADR r4 , b ; få adress för b LDR r1 ,[ r4 ] ; få värdet av b OCH r1 , r1 , #15 ; utföra AND ORR r1 , r0 , r1 ; utföra OR ADR r4 , z ; få adress för z STR r1 ,[ r4 ] ; lagra värde för zFilialer:
C:
om ( i == 0 ) { i = i + 10 ; }Assemblerare:
@(variabel i finns i register R1 ) SUBS R1 , R1 , #0 ADDEQ R1 , R1 , #10Cykler:
C:
för ( i = 0 ; i < 15 ; i ++ ) { j = j + j _ }Assemblerare:
SUBRO , R0 , R0 ; _ i -> RO och i = 0 startar CMP RO , #15 ; är jag <15? ADDLT R1 , R1 , R1 ; j = j + j ADDLT RO , RO , # 1 ; i++ BLT start Program för PIC16F628A mikrokontroller ( PIC -arkitektur )I fallet när 8 lysdioder är anslutna till PORTB-porten på mikrokontrollern, kommer programmet att slå på dem efter en:
LIST p = 16 F628A __CONFIG 0309 H STATUS equ 0x003 RP0 equ 5 TRISB equ 0x086 PORTB equ 0x006 ORG 0x0000 ;Start vektor måste starta ;Hoppa till början av huvudkoden start: bsf STATUS , RP0 ;Välj bank 1 clrf TRISB ;Alla bitar av PORTB är utdata bcf STATUS , RP0 ;Välj bank 0 led: movlw .170 ;Skriv binärt värde "10101010" till PORTB movwf PORTB goto led SLUTET Program för MSP430G2231 mikrokontroller ( MSP430 arkitektur ) i Code Composer Studio .cdecls C , LIST , "msp430g2231.h" ;------------------------------------------------ ------------------------------------------------------------ ---- .text ; Programstart ;------------------------------------------------------- ------ -------------------------------- ÅTERSTÄLL mov.w #0280 h , SP ; Initiera stackpointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stoppa WDT SetupP1 bis.b #001 h , & P1DIR ; P1.0 utgång ; Mainloop bit.b #010 h , & P1IN ; P1.4 hi/low? jc PÅ ; jmp--> P1.4 är satt ; AV bic.b #001 h , & P1OUT ; P1.0 = 0 / LED AV jmp Huvudslinga ; PÅ bis.b #001 h , & P1UT ; P1.0 = 1 / LED PÅ jmp Huvudslinga ; ; ;------------------------------------------------- ------------------------------------ ; Interrupt Vectors ;------------------------------------------------------ ------ -------------------------------- .sect ".reset" ; MSP430 RESET Vector .short RESET ; .slutetassembleringsspråk | |
---|---|
ID | |
Översättare | |
Syntaxformat _ |
Programmeringsspråk | |
---|---|
|