samlesprog | |
---|---|
Sprog klasse | bydende nødvendigt |
Udførelsestype | samles |
Dukkede op i | 1949 |
Filtypenavn _ | .asmeller [1].s |
Mediefiler på Wikimedia Commons |
Assembly language ( engelsk assembly language ) - repræsentationen af processorkommandoer i en menneskelig læsbar form. Assembly-sprog betragtes som et programmeringssprog på lavt niveau , i modsætning til sprog på højt niveau , der ikke er bundet til en bestemt implementering af et computersystem. Programmer skrevet i assemblersprog oversættes utvetydigt til instruktionerne fra en bestemt processor og kan i de fleste tilfælde ikke porteres uden væsentlige ændringer til at køre på en maskine med et andet instruktionssæt. En assembler er et program, der konverterer assemblersprogkode til maskinkode; et program, der udfører en omvendt opgave, kaldes en disassembler.
De første samlere blev designet af Kathleen Booth i 1947 under ARC2 [2] og af David Wheeler i 1948 under EDSAC [3] , mens udtrykket "assembler" ikke blev brugt, blot kaldte sproget "et sæt grundlæggende instruktioner " ( Engelsk grundlæggende rækkefølgesæt ) og "indledende kommandoer" ( Engelske indledende ordrer ). For første gang begyndte udtrykket "assembler" for processen med at kombinere felter til et kontrolord at blive brugt i senere rapporter om EDSAC.
Også i de tidlige stadier af udviklingen af programmering blev begrebet autokode introduceret - et programmeringssprog, hvis sætninger grundlæggende ligner i strukturen kommandoerne og de behandlede data i et bestemt maskinsprog [4][ betydningen af det faktum? ] . Udtrykket er i øjeblikket ikke brugt.
Historisk set, hvis maskinkoder betragtes som den første generation af programmeringssprog, kan assemblersprog betragtes som anden generation af programmeringssprog. . Manglerne ved assemblersproget, for eksempel vanskeligheden ved at udvikle store softwaresystemer på det, førte senere til fremkomsten af tredje generations sprog - programmeringssprog på højt niveau (såsom Fortran , Lisp , Cobol , Pascal , C og andre).
Der er ingen almindeligt brugt assemblersprogsyntaks. Da instruktionssystemerne for forskellige processorer adskiller sig væsentligt, er monteringssprogene for disse processorer også forskellige. Derudover kan hvert assembler-program bruge en anden syntaks. I assemblere til x86-processorer er den såkaldte Intel-syntaks mest udbredt , og i mindre grad AT&T-syntaks .
Den grundlæggende konstruktion af assemblersproget er en mnemonisk eller mnemonisk kode - en kort symbolsk repræsentation af en processorinstruktion. Som regel består det af flere tegn, der angiver den handling, der skal udføres (for eksempel movat overføre fra et register til et andet, addat tilføje værdier osv.). Mnemonikken kan også omfatte det objekt, som operationen udføres på (register, hukommelse, stak) eller andre funktioner (indflydelse på registret over flag , udførelsesbetingelser osv.), men i andre dialekter kan de samme funktioner angives i operander.
Som regel har assembleren af hver processor sit eget traditionelle sæt af mnemonics, men der er assemblers med cross-platform syntaks (såsom AT&T-syntaksen), men kun notationer forbliver på tværs af platforme i dem, koden for én processor kan ikke direkte overføres til en anden.
Registre, konstantværdier, adresser på hukommelsesceller og I/O-porte , konstanter, etiketter osv. kan angives som operander. Forskellige assemblere kan kræve en anden rækkefølge af operander: I nogle implementeringer kommer operatoren, som værdien er skrevet i, først, i andre kommer den sidst. Som regel er operander adskilt fra instruktionsmnemonics med mellemrum.
Den mest almindelige datatype, som de fleste processorer kan arbejde med, er et heltal pakket ind i et maskinord eller en eller flere bytes , sjældnere et flydende kommatal . I assemblersprog-programmer bruges værdier givet i forskellige talsystemer meget oftere. Først og fremmest, i computere med en otte-bit byte, bruges hexadecimal notation ofte , da to hexadecimale cifre er placeret i en byte. Nogle værdier kan skrives i binære koder. I tidlige computere med en seks-bit byte blev det oktale talsystem også stødt på . Skrivemetoderne kan være forskellige i forskellige samlere, for eksempel:
Derudover er det nogle gange påkrævet at specificere datablokke, der indlæses sammen med programkoden, for hvilke assembleren kan indeholde specialiserede direktiver. Moderne samlere kan også understøtte organiseringen af data i form af forskellige strukturer .
Assemblere kan understøtte forskellige konstruktioner for at gøre assembly-koden nemmere at læse, for at fritage programmøren for behovet for at holde styr på instruktionsadresser og for at implementere elementer, der er specifikke for sprog på højt niveau.
Som regel bruger assembly-koden ikke indrykning og operatorparenteser, der er karakteristiske for sprog på højt niveau . Monteringskode er normalt skrevet i flere kolonner, som inkluderer:
Denne måde at skrive på afspejler det særlige ved udførelse af programmer på processorer til generelle formål: på maskinkoderniveau er programmer normalt lineære, har ingen struktur, og fra et sted i programmet kan der foretages en overgang til et andet, uanset af, hvor begyndelsen af programkoden er placeret, og programmet vil fortsætte med at køre fra det tidspunkt, det sted, hvor overførslen blev foretaget. Et eksempel på et assemblersprogsprogram til PIC16 -arkitekturen :
Igen: movf 0x40 , W ;Kopier placering 0x40 (decimal 64) til W register addlw 0x05 ; Tilføj konstant 5 til W register movwf PORTC ;Skriv W register til mikrocontroller PORTC output port clrw ;Ryd W register (denne instruktion har ingen operands ) Igen ;Gå til etiketten igenDa assembler-koden er utvetydigt oversat til maskinkode for en given processor, giver dette dig mulighed for mere fuldt ud at bruge alle processorens muligheder, reducere antallet af unødvendige "tomgange" og bruge andre metoder til programkodeoptimering, som ikke er tilgængelige ved brug af compilere fører udviklingen af optimering af compilere imidlertid til, at kvaliteten af den kode, de genererer, kan være højere, end en moderat dygtig assembler-programmør kan skrive [5] . Desuden, jo større volumen programmet er, jo mindre er gevinsten ved at bruge assemblersproget.
Assembly sprogprogrammer tillader ikke udefineret adfærd , men generelt kræver skrivning og fejlfinding af kode i assembly mere indsats. Typekontrol er ikke tilgængelig i assembler , hvorfor betydningen af en bestemt værdi og de tilladte handlinger på den skal kontrolleres af programmøren selv. Når man skriver programmer i assemblersprog, er det påkrævet konstant at bruge stakken og et begrænset antal generelle registre, samt pointere, hvilket kræver, at programmøren er opmærksom og har en god hukommelse.
Assembly-sprogprogrammer er næsten umulige at porte til en maskine med en anden arkitektur eller instruktionssæt uden at omskrive programmet, selvom der blev brugt en "cross-platform" assemblersprog-dialekt under skrivning: forskellige processorarkitekturer har forskellige sæt af registre, flag, forskellige maskinordstørrelser og kan også have højt specialiserede kommandoer, der ikke er tilgængelige på andre platforme.
Assembler-programmet har flere muligheder for at interagere med hardwaren og OS-kernen . Eksempelvis var der i tidlige hjemmecomputere og spillekonsoller måske ikke indbygget en timer med tilstrækkelig høj opløsning, men samtidig var processorens clockfrekvens standard for alle enheder af samme type, hvilket gjorde det muligt at bruge processoren som en timer, tælle antallet af cyklusser for at udføre bestemte kommandoer og indsætte tomme operationer de rigtige steder. I moderne processorer, der bruger indbyggede ydelsesoptimeringskredsløb, dynamiske clockfrekvensændringer og komplekse interruptsystemer, og endnu mere under kontrol af multitasking OS , er sådanne teknikker blevet umulige, men de bliver fortsat brugt på nogle mikrocontrollere .
Fremkomsten af assemblere lettede i høj grad opgaven med at programmere tidlige computere, men ret hurtigt krævede kompleksiteten af anvendte problemer brugen af sprog på højt niveau. Disse sprog blev dog udført ret langsomt, og desuden havde de ikke altid adgang til alle computerens hardwarefunktioner. Da ydeevnen af mainframes og minicomputere steg, og med fremkomsten af sprog som C , begyndte relevansen af assemblersprog at falde, men steg igen med fremkomsten af mikrocomputere . Som regel havde tidlige mikroprocessorer lav ydeevne og en lille mængde tilgængelig RAM , og desuden dukkede højkvalitetssprogkompilere til sprog på højt niveau ikke umiddelbart op for dem. Ofte blev programmer til hjemmecomputere, inklusive spil, udelukkende skrevet i assembler. Men i begyndelsen af det 21. århundrede blev optimerende compilere tilføjet til den voksende ydeevne af computere , som genererede maskinkode, der var mere optimal, end en gennemsnitlig programmør kunne skrive. Derudover er spørgsmålet om portabilitet mellem forskellige platforme blevet vigtigt.
Assembly sprog bruges også i debugging og reverse engineering ved hjælp af disassembler -programmer . Ved hjælp af disassembleren kan du styre programmets udførelse på niveau med maskininstruktioner, hvilket er nyttigt, for eksempel ved søgning efter steder med udefineret adfærd, eller fejl, der opstår ved arbejde med pointere.
For at lette udviklingen blev følgende tilgang brugt: det meste af koden er skrevet på et højt niveau sprog, og kun sektioner, for hvilke ydeevnen er kritisk eller kræver direkte adgang til computerhardwareressourcer, er skrevet i assembler.
Dette program sender et tegn tilbage, der modtages gennem 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 Eksempler på kompilering af C til assemblersprog for ARM-arkitekturenBit operationer:
C:
z = ( a << 2 ) | ( b & 15 );Monter:
ADR r4 , a ; få adresse til en LDR r0 ,[ r4 ] ; få værdien af en MOV r0 , r0 , LSL #2 ; udføre skift ADR r4 , b ; få adresse for b LDR r1 ,[ r4 ] ; få værdien af b OG r1 , r1 , #15 ; udføre OG ORR r1 , r0 , r1 ; udføre OR ADR r4 , z ; få adresse for z STR r1 ,[ r4 ] ; gem værdi for zGrene:
C:
hvis ( i == 0 ) { i = i + 10 ; }Monter:
@(variabel i er i register R1 ) SUBS R1 , R1 , #0 ADDEQ R1 , R1 , #10Cykler:
C:
for ( i = 0 ; i < 15 ; i ++ ) { j = j + j _ }Monter:
SUB R0 , R0 , R0 ; i -> RO og i = 0 starter CMP RO , #15 ; er jeg <15? ADDLT R1 , R1 , R1 ; j = j + j ADDLT RO , RO , #1 ; i++ BLT start Program til PIC16F628A mikrocontroller ( PIC arkitektur )I det tilfælde, hvor 8 lysdioder er forbundet til PORTB-porten på mikrocontrolleren, tænder programmet 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 skal starte ;Hop til begyndelsen af hovedkoden start: bsf STATUS , RP0 ;Vælg bank 1 clrf TRISB ;Alle bits af PORTB er output bcf STATUS , RP0 ;Vælg bank 0 led: movlw .170 ; Skriv binær værdi "10101010" til PORTB movwf PORTB goto led ENDE Program til MSP430G2231 mikrocontroller ( MSP430 arkitektur ) i Code Composer Studio .cdecls C , LIST , "msp430g2231.h" ;------------------------------------------------ -------------- ------------------------------------ ---- .tekst ; Programstart ;------------------------------------------------------ ------ ------------------------------- NULSTIL mov.w #0280 h , SP ; Initialiser stackpointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT SetupP1 bis.b #001 h , & P1DIR ; P1.0 output ; Mainloop bit.b #010 h , & P1IN ; P1.4 høj/lav? jc TIL ; jmp--> P1.4 er indstillet ; FRA bic.b #001 h , & P1OUT ; P1.0 = 0 / LED OFF jmp Hovedsløjfe ; ON bis.b #001 h , & P1OUT ; P1.0 = 1 / LED ON jmp Hovedsløjfe ; ; ;------------------------------------------------- ------------------------------------ ; Afbryd vektorer ;------------------------------------------------------ ------ ---------------------------------- .sect ".reset" ; MSP430 RESET Vector .short RESET ; .endesamlesprog | |
---|---|
IDE | |
Oversættere | |
Syntaksformater _ |
Programmeringssprog | |
---|---|
|