.EXE

DOS MZ eksekverbar fil
Udvidelse . exe
Underskrift MZ eller ZM
Udvikler Microsoft
Formattype binær , eksekverbar , objekt , dynamisk bibliotek
Udvidet fra .COM
Udviklet i Ny eksekverbar
lineær eksekverbar
bærbar eksekverbar

.EXE (forkortet engelsk  executable  - executable) - udvidelse af eksekverbare filer, der bruges i operativsystemerne DOS , Windows , Symbian OS , OS / 2 og i nogle andre, svarende til en række formater . Ud over objektkoden kan den indeholde forskellige metadata ( ressourcer , digital signatur [1] ).

.EXE-formater

Filstruktur

EXE-filen genereret af linkeren består af to dele:

Oplysningerne om loaderen, som er beskrevet nedenfor, er placeret i begyndelsen af ​​filen og danner den såkaldte header . Det efterfølges umiddelbart af indlæsningsmodulets krop, som er en kopi af hukommelsesbilledet af opgaven bygget af linkeren.

Standardhoveddelen har følgende format [3] :

00-01 4D5A - .EXE filsignatur; 02-03 Længde af opgavebilledet modulo 512 (det vil sige antallet af nyttige bytes i den sidste blok). Linkere før 1.10 sætter 04 i dette felt; hvis det har en sådan værdi, anbefales det at ignorere det); 04-05 Fillængde i blokke; 06-07 Antal indtastninger i adresseindstillingstabellen; 08-09 Overskriftslængde i 16-byte afsnit. Bruges til at finde ud af starten af ​​belastningsmodulets krop; 0A-0B Minimum mængde hukommelse, der skal tildeles efter slutningen af ​​opgavebilledet (i 16-byte afsnit); 0C-0D Maksimal mængde hukommelse, der skal tildeles efter slutningen af ​​opgavebilledet (i 16-byte afsnit); 0E-0F Segmentadresse for starten af ​​staksegmentet i forhold til starten af ​​opgavebilledet; 10-11 SP-værdi ved indtastning af opgave; 12-13 Kontrolsum  - nul minus resultatet af tilføjelse uden at overføre alle ordene i filen; 14-15 IP- værdi (kommandotæller) ved indtastning af en opgave; 16-17 Segmentadresse for starten af ​​kodesegmentet i forhold til starten af ​​opgavebilledet; 18-19 Adresse på det første element i adresseindstillingstabellen i forhold til begyndelsen af ​​filen; 1A-1B Overlapningssegmentnummer (0 for programrodsegment).

Dernæst er adresseindstillingstabellen. Tabellen består af elementer, hvis antal er skrevet i bytes 06-07. Opsætningstabelposten består af to felter, en 2-byte offset og et 2-byte segment, og specificerer et ord i indlæsningsmodulet, der indeholder adressen, der skal indstilles til den hukommelsesplacering, hvor opgaven indlæses. Indstillingen er som følger:

  1. Et programsegmentpræfiks (PSP) er bygget i hukommelsesområdet efter den residente del af indlæsningsprogrammet ;
  2. Standarddelen af ​​headeren læses ind i hukommelsen;
  3. Længden af ​​belastningsmodulets krop bestemmes (forskellen mellem længden af ​​filen 04-07 og længden af ​​headeren 08-09 plus antallet af bytes i den sidste blok 02-03). Afhængigt af tegnet, der angiver at indlæse opgaven til slutningen af ​​hukommelsen eller til begyndelsen, bestemmes segmentadressen for indlæsning. Dette segment kaldes det indledende segment ;
  4. Belastningsmodulet læses ind i det indledende segment;
  5. Tuningtabellen indlæses i arbejdshukommelsen i batches;
  6. For hver indtastning i opsætningstabellen tilføjes segmentadressen for startsegmentet til segmentfeltet. Som et resultat heraf peger tabelindgangen på et ord i hukommelsen, hvortil segmentadressen for startsegmentet tilføjes;
  7. Når adresseopsætningstabellen behandles, skrives de værdier, der er angivet i overskriften, til SS- og SP-registrene, og segmentadressen for startsegmentet tilføjes til SS. Segmentadressen for starten af ​​PSP skrives til ES og DS. Styringen overføres til den adresse, der er angivet i overskriften (byte 14-17).

Programsegmentstruktur

Når du får adgang til en ikke-resident kommando eller kalder et program med Exec-operationen, bestemmer DOS minimumadressen, hvorfra det tilsvarende program kan indlæses. Dette område kaldes programsegmentet.

Ved offset 0000 i programsegmentet genererer DOS et programsegmentpræfiks (PSP) . Selve programmet indlæses ved offset 0100.

Programmet afsluttes ved at springe til adresse 0000 i programsegmentet ved at udføre INT 20, eller ved at udføre INT 21 med AH=0 eller AH=4C, eller ved at kalde subrutinen på adresse 0050 i programsegmentet med AH=0 eller AH =4C.

Bemærk: når det afsluttes på anden måde end ved operation 4C, skal programmet først sende til CS adressen for begyndelsen af ​​dets programsegment.

Alle fire metoder returnerer kontrol til den residente del af COMMAND.COM (i dette tilfælde sender operation 4C en udgangskode). Alle fire metoder får det program, der kaldte Exec-operationen (4B), til at fortsætte eksekveringen. I dette tilfælde gendannes interrupt-vektorerne 22, 23 og 24 (terminering, Ctrl-Break, fatal udvekslingsfejl) fra programsegmentpræfikset for den genoptagelige opgave. Herefter overføres kontrollen til opsigelsesadressen. Hvis programmet vender tilbage til COMMAND.COM, overføres kontrollen til den ikke-resident del. Hvis dette sker, mens batchfilen kører, fortsætter den, ellers beder COMMAND terminalen og venter på, at den næste kommando indtastes.

Når et indlæst program tager kontrol, gælder følgende betingelser:

For alle programmer:

  1. Medieadressen sendes i programsegmentpræfikset ved offset 2C. Miljøet er en sekvens af ASCIIZ- strenge af formen parameter=værdi. Den samlede længde af miljøstrengene er ikke mere end 32 KB; Onsdag starter ved en paragrafgrænse. Den sidste linje efterfølges af en null-byte. Det miljø, der sendes til opgaven af ​​COMMAND, indeholder mindst parameteren COMSPEC= (værdien af ​​denne parameter er det fulde navn på filen, der indeholder COMMAND.COM , der skal bruges ). Den indeholder også værdierne indstillet af PATH, PROMPT og SET kommandoerne. Det miljø, der sendes, er en kopi af miljøet i den overordnede proces. Hvis en opgave forbliver hjemmehørende, vil efterfølgende PATH-, PROMPT- og SET-kommandoer ikke påvirke dens miljø.
  2. Ved offset 0050 indeholder programsegmentpræfikset programmet til at kalde DOS-operationer. Ved at sætte operationsnummeret i AH kan programmet således kalde procedurer (LCALL) ved PSP + 50 og ikke få adgang til interrupt 21.
  3. DTA-bufferadressen er sat til PSP +80.
  4. Filkontrolblokke placeret ved offset 5C og 6C i programsegmentpræfikset udfyldes i henhold til kommandolinjeparametrene . I dette tilfælde, hvis den tilsvarende parameter inkluderer biblioteksnavnet, indtastes kun enhedskoden i FCB, filnavnet er dannet forkert.
  5. Den uformaterede del, der starter ved offset 81, indeholder kommandolinjetegnene efter kommandonavnet, inklusive alle mellemrum og skilletegn. Længden af ​​denne streng er placeret ved offset 80. Hvis kommandolinjen indeholder omdirigeringsmuligheder (de er angivet med > og < symbolerne), er de ikke inkluderet her, da omdirigeringen er gennemsigtig for programmer.
  6. Word ved offset 6 indeholder antallet af bytes i dette segment.
  7. AX-registeret angiver, om enhedsnavnene i parametrene er korrekte:

For .EXE-programmer:

  1. DS og ES angiver begyndelsen af ​​programsegmentpræfikset.
  2. CS-, IP-, SS- og SP-registrene får de værdier, der er angivet af linkeren .

For .COM-programmer:

  1. Alle fire segmentregistre peger på programsegmentpræfikset.
  2. Al ledig hukommelse er allokeret til programmet. Hvis programmet starter andre programmer med Exec-operationen, skal det frigøre noget hukommelse til det med Setblock-operationen (4A)
  3. IP-kommandotælleren er indstillet til 0100H.
  4. SP-registret angiver slutningen af ​​et programsegment. Segmentlængden ved præfiksplacering 6 reduceres med 0100H for at give plads til den størrelse stak.
  5. Nulordet placeres oven på stakken.

Noter

  1. Windows Authenticode Portable Executable Signature Format  (engelsk)  (utilgængeligt link) . Hentet 11. december 2009. Arkiveret fra originalen 1. marts 2012.
  2. Sådan åbnes en .DLL- eller .EXE-fil i Resource Editor  (engelsk)  (downlink) . Hentet 11. december 2009. Arkiveret fra originalen 1. marts 2012.
  3. Indlæs Windows-programmer fra DOS-prompten med WINSTART // PC Mag. - nr. 30. juni 1992 .

Links