Samlesprog

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.

Historie

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).

Syntaks

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 .

Mnemonics

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.

Operander

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.

Bogstaver

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 .

Elementer af udtryksevne

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.

Kodeformateringsstandarder

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 igen

Fordele og ulemper

Da 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 .

Ansøgning

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.

Assembler indsætter

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.

Demoscene

Eksempler

Eksempler

Hej Verden!

COM - program til MS-DOS på TASM - dialekten .MODEL LITEN KODE SEGMENT ANTAG CS : KODE , DS : KODE ORG 100 t START : mov ah , 9 mov dx , OFFSET Besked int 21 timer int 20 timer Besked DB ' Hello World ' , 13 , 10 , ' SEND ' KODE _ START EXE - program til MS-DOS på TASM - dialekten .MODEL SMALL .DATA msg DB ' Hello World ' , 13 , 10 , ' $ ' .KODE START : mov ax , @ DATA mov ds , ax mov ax , 0900 h lea dx , msg int 21 h mov ax , 4 C00h 21 timer SLUT START Program til Linux / x86 på NASM dialekt SECTION .data msg: db " Hej , verden " , 10 len: equ $-msg SECTION .text global _start _start: mov edx , len mov ecx , msg mov ebx , 1 ; stdout mov eax , 4 ; skriv(2) int 0x80 mov ebx , 0 mov eax , 1 ; exit(2) int 0x80 Program til FreeBSD / x86 på NASM dialekt SECTION .data msg: db " Hej , verden " , 10 len: equ $-msg SECTION .text global _start syscall: int 0x80 ret _start: push len push msg push 1 ; stdout mov eax , 4 ; skriv(2) kald syscall add esp , 3 * 4 skubbe 0 mov eax , 1 ; exit(2) kalder syscall Program til Microsoft Windows i MASM dialekt .386 .model flad , stdcall option casemap : ingen inkluderer \ masm32 \ include \ windows.inc include \ masm32 \ include \ kernel32.inc includelib \ masm32 \ lib \ kernel32.lib .data msg db " Hej , verden " , 13 , 10 len equ $-msg .data ? skrevet dd ? .code start: push -11 call GetStdHandle push 0 push OFFSET skrevet push len push OFFSET msg push eax call WriteFile push 0 kalder ExitProcess slut start Konsolprogram til Windows på FASM- dialekten format PE konsol indgang start inkludere ' include \ win32a.inc ' afsnittet ' .data ' data læsbar skrivbar besked db ' Hej verden ! _ ' , 0 afsnit ' .code ' kode læsbar eksekverbar start: ; CINVOKE makro i FASM. ; Giver dig mulighed for at kalde CDECL-funktioner. cinvoke printf , besked cinvoke getch ; INVOKE er en lignende makro for STDCALL-funktioner. påkald ExitProcess , 0 sektion ' .idata ' importer datalæsbar bibliotekskerne , ' kernel32.dll ' , \ msvcrt , ' msvcrt.dll ' _ _ import kerne , \ ExitProcess , ' ExitProcess ' importer msvcrt , \ printf , ' printf ' , \ getch , ' _getch ' 64-bit Windows-program på YASM- dialekten (ved hjælp af Microsofts linker) ;yasm-1.0.0-win32.exe -f win64 HelloWorld_Yasm.asm ; setenv /Release /x64 /xp ;link HelloWorld_Yasm.obj Kernel32.lib User32.lib /entry:main /subsystem:windows /4AREADDRESS 6 globale hoved ekstern MessageBoxA ekstern ExitProcess afsnit .data mytit db ' 64 - bit verden af ​​Windows & assembler ... ' , 0 mymsg db ' Hello World ! ' , 0 afsnit .tekst hoved: mov r9d , 0 ; uType = MB_OK mov r8 , mytit ; LPCSTR lpCaption mov rdx , mymsg ; LPCSTR lpText mov rcx , 0 ; hWnd = HWND_DESKTOP kalder MessageBoxA mov ecx , eax ; uExitCode = MessageBox(...) kalder ExitProcess ret Program til Solaris og SPARC arkitektur .section ".data" hej: .asciz "Hej verden!\n" .sektion ".tekst" .align 4 .global main hoved: gem %sp , -96 , %sp ! tildele hukommelse mov 4 , %g1 ! 4 = SKRIV ( systemkald ) mov 1 , % o0 ! 1 = STDOUT sæt hej , %o1 mov 14 , %o2 ! antal tegn til 8 ! systemopkald _ ! program exit mov 1 , % g1 ! flyt 1 ( afslut () syscall ) til %g1 mov 0 , %o0 ! flyt 0 ( returadresse ) til % o0 ta 8 ! systemopkald _

Prøveprogrammer til forskellige mikrocontrollere

ASM-51 program til AT89S52 mikrocontroller ( MCS-51 familie )

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-arkitekturen

Bit 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 z

Grene:

C:

hvis ( i == 0 ) { i = i + 10 ; }

Monter:

@(variabel i er i register R1 ) SUBS R1 , R1 , #0 ADDEQ R1 , R1 , #10

Cykler:

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 ; .ende

Noter

  1. https://cs.lmu.edu/~ray/notes/x86assembly/
  2. Generelle overvejelser i designet af en elektronisk digital computer til alle formål arkiveret 24. marts 2020 på Wayback Machine af Andrew D. Booth og Kathleen HV Britten. 2. udgave. august 1947.
  3. 1985 Computer Pioneer Award "For assemblersprogprogrammering."
  4. GOST 19781-83 // Datalogi. Terminologi: Referencemanual. Nummer 1 / Anmelder Ph.D. tech. Videnskaber Yu. P. Selivanov. - M . : Forlag for standarder, 1989. - 168 s. - 55.000 eksemplarer.  — ISBN 5-7050-0155-X .
  5. Chris Kaspersky. War of the Worlds: Assembler vs. C (utilgængeligt link) . Hentet 1. juni 2010. Arkiveret fra originalen 29. juli 2010. 

Litteratur

  • Galiseev GV Assembler til Win 32. Tutorial. - M . : Dialektik , 2007. - 368 s. - ISBN 978-5-8459-1197-1 .
  • Zubkov SV Assembler til DOS, Windows og UNIX. - M. DMK Press; SPb. Peter, 2006. - 608 s. — ISBN 5-94074-259-9 .
  • Kip Irvine. Assembly language for Intel-processorer = Assembly Language for Intel-baserede computere. — M. : Williams , 2005. — 912 s. — ISBN 0-13-091013-9 .
  • Kalashnikov O. A. Assembler? Det er simpelt! At lære at programmere. - Sankt Petersborg. : BHV-Petersburg , 2007. - 384 s. — ISBN 978-5-94157-709-5 .
  • Chris Kaspersky. Kunsten at skille ad. - Sankt Petersborg. : BHV-Petersburg , 2008. - 896 s. - ISBN 978-5-9775-0082-1 .
  • Vladislav Pirogov. Assembler til Windows. - Sankt Petersborg. : BHV-Petersburg , 2007. - 896 s. - ISBN 978-5-9775-0084-5 .
  • Vladislav Pirogov. Montering og demontering. - Sankt Petersborg. : BHV-Petersburg , 2006. - 464 s. — ISBN 5-94157-677-3 .
  • Richard Simon. Microsoft Windows API System Programmers reference.
  • Frunze A. V. Mikrocontrollere? Det er simpelt! - T. 1.
  • Yurov V., Khoroshenko S. Assembler: træningskursus. - Sankt Petersborg. : Peter , 1999. - S. 672. - ISBN 5-314-00047-4 .
  • Ablyazov R. Z. Programmering i assembler på x86-64 platformen. - M .: DMK Press , 2011. - S. 304. - ISBN 978-5-94074-676-8 .
  • Yurichev D., Forståelse af assemblersprog https://yurichev.com/writings/UAL-RU.pdf
  • Praktisk programmering af Atmel AVR mikrocontrollere i assemblersprog .. - 2. - BHV-Petersburg, 2014. - 368 s. - (Elektronik). — ISBN 9785977533119 .

Links