05. maj 2024 - 19:30Der er
2 kommentarer og 1 løsning
Finde gentagne Instruktioner i ASSEMBER-lister
HEJ,
Jeg arbejder meget med dis-assembler (Z-80, 80X86, ATMEL-serien osv.) .
Et problem jeg ofte møder i disse (dis)-assembler lister er lange arealer med samme instruktion ( for det meste 0x00 eller 0xFF ). De fylder i listen og er ofte overflødige og kan erstattes med en .ORG på stedet hvor de slutter, hvis der er behov for det.
Er der nogen i denne gruppe, som har et par ideer om hvordan disse lange repetitive arealer kan reduceres mest muligt. (Bedst som en .ORG på slut adressen). Jeg har skrevet en SÆRDELES langsom rutine, som finder 10'ende 0x00, gemmer denne adresse og scanner derfra til den møder en ikke 0x00., men som sagt den langsom, og noget usikker. Ville sætte pris på en smart PSEUDO-kode,
For hver adresse i hukommelses_array: Hvis værdien på nuværende adresse er lig med gentaget_instruktion: Hvis gentagelser == 0: start_adresse = adresse gentagelser += 1 Ellers: Hvis gentagelser > 0: Hvis gentagelser >= længde: # Detekteret et langt repetitivt område slut_adresse = adresse - 1 Erstatter_repetitivt_område_med_ORG(start_adresse, slut_adresse) # Nulstil gentagelses-tælleren gentagelser = 0 # Hvis gentagelser er for kort til at blive betragtet som repetitivt område, nulstil start_adresse start_adresse = 0
Returnér hukommelses_array
Funktion Erstatter_repetitivt_område_med_ORG(start_adresse, slut_adresse): # Erstatter det repetitive område med en .ORG statement Udskriv(".ORG ", slut_adresse + 1)
Efter en overfladisk gennemgang af rutinen ser det ud til at den er virksom, måske med et par små modifikationer her og der. Minder på enkelte steder meget om de tanker jeg selv havde om min "sløve" løsning. Vil implementere den senere i dag (aften) og melder tilbage i løbet af onsdag/torsdag . Og 10000 --> 000 tak for indsatsen.
Allerførst: Undskyld forsinkelsen. Vi (konen og jeg) måtte akut ud af døren og var først hjemme ret sent i går aftes.
Men til sagen:
Implementerede dit forslag (men minimale ændringer afhængig af implementeringen.). Testede koden. Den fungerede, men størrelsen af ovennævnte repetitioner gør, at denne rutine faktisk ikke er væsentligt hurtigere, end den jeg selv havde. Beklager at måtte sige det. I mine assembler liste er der ca. 1200 efterfølgende NOP (NOP = NO OPERATION = Dummy ) linier. Min "fjerne" rutine tager ca. 13 - 15 sekunder, din har jeg målt til 11 -14 sekunder. (Bruger programvare tidsfunktioner). Jeg han en "bange" følelse af, at jeg må gå til kilden og modificere den (= fjerne de overflødige NOP's) for at jeg opnår den ønskede hastighedsgevinst. , ÆV og ÆV og ÆV... Men tak for hjælpen uanset det lidt uheldige resultat.
KR
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.