05. maj 2024 - 19:30 Der 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,

TAK

Kristian
Avatar billede Braindead mac user Juniormester
07. maj 2024 - 08:03 #1
Funktion reducér_repetitivt_område(hukommelses_array, længde, gentaget_instruktion):
    gentagelser = 0
    start_adresse = 0
    slut_adresse = 0
   
    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)

# Eksempel på brug:
hukommelses_array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00]
længde = 5
gentaget_instruktion = 0x00

reducér_repetitivt_område(hukommelses_array, længde, gentaget_instruktion)
dette har jeg fundet online det er med værdien 0x00
07. maj 2024 - 09:21 #2
Hej,  Tak for rutinen.

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.

Kr
13. maj 2024 - 16:01 #3
Hej,

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester