Maskinkode ( platformorienteret kode ), maskinsprog - et system af kommandoer (et sæt operationskoder) på en bestemt computer , som fortolkes direkte af denne computers processor eller firmware . [en]
Et computerprogram skrevet i maskinsprog består af maskininstruktioner , som hver er repræsenteret i maskinkode i form af en såkaldt. opcode - den binære kode for en enkelt operation fra maskinens kommandosystem. For nemheds skyld i programmeringen , i stedet for numeriske opkoder, som kun forstås af processoren, bruges deres betingede alfabetiske mnemonics normalt . Et sæt af sådanne mnemonics, sammen med nogle ekstra funktioner (for eksempel nogle makroer, direktiver ), kaldes assemblersprog .
Hver processormodel har sit eget instruktionssæt, selvom disse instruktionssæt i mange modeller overlapper hinanden kraftigt. Processor A siges at være kompatibel med processor B , hvis processor A fuldt ud "forstår" maskinkoden for processor B. Hvis processor A og B har en undergruppe af instruktioner, som de er indbyrdes kompatible med, så siges de at have den samme "arkitektur" (har den samme instruktionssæt-arkitektur ).
Hver maskininstruktion udfører en specifik handling, såsom en handling på data (f.eks. tilføjelse eller kopiering af et maskinord i et register eller i hukommelsen ) eller spring til et andet kodestykke (ændre rækkefølgen af udførelse; i dette tilfælde spring kan være ubetinget eller betinget afhængigt af resultaterne af tidligere instruktioner). Ethvert eksekverbart program består af en sekvens af sådanne atommaskiners operationer.
Operationer skrevet som en enkelt maskininstruktion kan opdeles i "simple" ( elementære operationer ) og "komplekse". Derudover består de fleste moderne processorer af separate "aktuatorer" - computerenheder, der kun kan udføre et begrænset sæt simple operationer. Når den næste instruktion udføres, oversætter (dekoder) en speciel blok af processoren - dekoderen - den til en sekvens af elementære operationer, der forstås af specifikke udførende enheder.
Arkitekturen af processorens instruktionssæt bestemmer, hvilke operationer den kan udføre, og hvilke maskininstruktioner der svarer til hvilke numeriske opkoder (opkoder). Opkoder er af konstant længde (for RISC -, MISC -arkitekturer) og rækkevidde (for CISC -arkitekturer; for eksempel: for x86 -arkitekturen har kommandoen en længde på 8 til 120 bit).
Moderne superskalære processorer er i stand til at udføre flere maskininstruktioner i en enkelt clock-cyklus .
Maskinkode kan ses som et primitivt programmeringssprog eller som det laveste niveau af repræsentation af kompilerede eller samlede computerprogrammer. Selvom det er muligt at skrive programmer direkte i maskinkode, gøres dette nu sjældent på grund af kodens besværlighed og besværligheden ved manuelt at administrere processorressourcer, undtagen i situationer hvor ekstrem optimering er påkrævet . Derfor er langt de fleste programmer skrevet på overordnede sprog og oversat til maskinkode af compilere . Maskinkode omtales nogle gange som native code (også kaldet native code ), når man taler om platformspecifikke dele af et sprog eller biblioteker . [2]
Programmer på fortolkede sprog (såsom Basic eller Python ) oversættes ikke til maskinkode; i stedet udføres de enten direkte af sprogfortolkeren eller oversættes til pseudokode ( bytekode ). Imidlertid er tolkene af disse sprog (som selv kan opfattes som processorer) generelt repræsenteret i maskinkode.
I nogle computerarkitekturer ydes understøttelse af maskinkode af et endnu lavere niveau af programmer kaldet firmware . Dette gør det muligt at tilvejebringe en enkelt maskinsproggrænseflade for hele linjen eller familien af computere, som kan have betydelige strukturelle forskelle indbyrdes, og letter overførslen af programmer i maskinkode mellem forskellige computermodeller. Et eksempel på denne tilgang er IBM System/360- familien af computere og deres efterfølgere: På trods af forskellige busser fra 8 til 64 bit og højere deler de alligevel en fælles arkitektur på maskinsprogniveau.
Brug af et lag af mikrokode til at implementere en emulator tillader en computer at repræsentere arkitekturen af en helt anden computer. I System/360-linjen blev dette brugt til at overføre programmer fra tidligere IBM-maskiner til den nye familie - for eksempel IBM 1401/1440/1460-emulatoren på IBM S/360 model 40.
Absolut kode ( engelsk absolute code ) - programkode, der er egnet til direkte eksekvering af processoren [1] , det vil sige kode, der ikke kræver yderligere behandling (f.eks. løsning af links mellem forskellige dele af koden eller binding til adresser i hukommelsen, normalt udført af programindlæseren ). Eksempler på absolut kode er eksekverbare filer i .COM -format og en OS-indlæser placeret i MBR . Ofte forstås absolut kode i en snævrere betydning som positionsafhængig kode (det vil sige kode knyttet til specifikke hukommelsesadresser).
Positionsuafhængig kode er et program , der kan placeres i ethvert hukommelsesområde, da alle referencer til hukommelsesceller i det er relative (for eksempel i forhold til programtælleren ) . Et sådant program kan til enhver tid flyttes til et andet hukommelsesområde i modsætning til et program , der kan flyttes, som, selvom det kan indlæses i ethvert hukommelsesområde, skal forblive på samme sted efter indlæsning. [en]
Evnen til at oprette positionsuafhængig kode afhænger af målplatformens arkitektur og instruktionssæt. For eksempel, hvis alle hop-instruktioner i et instruktionssæt skal angive absolutte adresser, så er kode, der kræver hop, næsten umulig at gøre positionsuafhængig. I x86 -arkitekturen er direkte adressering i datainstruktioner kun repræsenteret af absolutte adresser, men da dataadresser betragtes i forhold til segmentregisteret , som kan ændres til enhver tid, giver dette dig mulighed for at oprette positionsuafhængig kode med din egen hukommelse lokationer for data. Derudover kan nogle instruktionssæt-restriktioner ophæves med selvmodificerende kode eller ikke-trivielle instruktionssekvenser.
Hej verden! » for en x86-processor ( MS DOS , output ved hjælp af BIOS - interrupt int 10h) er som følger (i hexadecimal notation ):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21Dette program fungerer, når det placeres ved offset 100 16 . Individuelle instruktioner er fremhævet i farver:
Den samme kode i assembler-kommandoer :
XXXX:0100 mov bx, 0111h ; indsæt bx forskydningen af HW strengen XXXX:0103 mov cx, 000Dh ; indsæt cx længden af HW strengen XXXX:0106 mov ah, 0Eh ; indsæt ah afbrydelsesfunktionen nummer 10h XXXX:0108 mov al, [bx] ; indsæt al værdien af den hukommelsesplacering, hvis adresse er i bx XXXX:010A ink bx ; flyt til næste byte af strengen (forhøjet forskydning med 1) XXXX:010B int 10h ; afbryde opkald 10h XXXX:010D loop 0108 ; sænk cx med 1, og hvis resultat≠0 springer du til adresse 0108 XXXX:010F int 20h ; afbryde 20h: Afslut program XXXX:0111 HW db 'Hej, verden!' ; strengen, der skal udskrives