PMID Scanroutine, was könnte falsch sein?



  • Hi Leute in folgendem Code ist der Wurm drin:

    mov ecx, 0x132768
    mov dword [ds:esi], 0x100000 ;dort befindet sich das kopierte Biosimage
    mov dword [es:edi], 'PMID'
    repe cmpsd
    je vesa_3_pmid_gefunden
    jne vesa_3_ende
    

    Er springt immer nach vesa_3_end, egal ob eine Vesa 3 Karte im System ist oder nicht. Was mache ich falsch??? Danke! 🙂



  • Alles. Der Code ist einfach komplett unsinnig. Keine Ahnung, wo da die Suche nach dem "PMID" drinstecken soll.

    Da wird zuerst einfach nur 0x100000 ins dword bei ds:esi und 'PMID' ins dword bei es:edi geschrieben.

    Dann führt dein Code 0x132768 mal cmpsd aus - oh, halt: In diesem Fall nur einmal, da die ersten beiden dwords bei es:edi und ds:esi jeweils direkt zuvor auf verschiedene Werte gesetzt wurden.

    Ab der 4. Zeile also alles reine Verschwendung von Rechenzeit.

    Wenn du schon "Programmieren" spielen musst, tu das bitte mit Basic oder HTML - Assembler ist offensichtlich zu hoch für dich.



  • Na vielen Dank auch! Ich habe bloß eine normale Frage gestellt. Ich programmiere schon seit mehreren Jahren in C/C++, C# und will halt auch mal was in Assembler machen/probieren. Bislang dachte ich halt, dass ein Forum dazu da ist, um seine Fragen und Probleme loszuwerden, aber anscheinend habe ich mich da geirrt. 😡 Kann halt nicht jeder von Anfang an mit Assembler im Blut auf Welt gekommen sein wie du..... 😡 😡 😡



  • sevobal schrieb:

    Ich programmiere schon seit mehreren Jahren in C/C++,...

    dann mach das mit c. asm braucht man nur für spezielle dinge und das vergleichen von zeichenketten im speicher gehört bestimmt nicht dazu.



  • Full Ack.

    Dann nutze deine fundierten C/C++ und C#-Kenntnisse. Damit bist du allemal besser bedient.

    Assembler wirst du so nicht lernen.
    Oder meinst du als erfahrener C/C++ und C#-Programmierer nicht auch, dass 2 (oder mehr?) Jahre reichen sollten, um eine Programmiersprache wenigstens ansatzweise zu lernen...

    Falls nicht, wird es mir eine Freude sein, dir eine Merkbefreiung auszustellen. 😋



  • Nicht ärgern unregistrierte mit blöden Texten sind wie Trolle, und zu feige sich erkennen zu geben.

    Aber wenn du am Rande mal reinschmecken willst, besorg dir eine sinnvolle Einführung/Tutorial in Assembler.

    Oftmals lohnt es sich auch, den C-Compiler zu überreden ein Assemblerlisting zu erzeugen, dann kann man nachvollziehen
    wie gewisse Sachen gelöst werden. Aüßerdem kann man seine eigene Assemblerlösung gegen ein Kompilat vergleichen.



  • Hi,
    danke, die erste einigermaßen Vernünftige antwort. Habe mir auch mehrere Bücher zum Thema Assembler geholt. Bin gerade dabei mich einzulesen, sowas braucht Zeit, keine Frage, und habe meinen Code mal folgendermaßen neu geschrieben, was hällst du (oder auch andere _vernünftige_) davon?

    mov edi, 0x100000 ;hierhin habe ich das Biosimage kopiert
    mov eax, 'PMID'
    rep scasd
    je vesa_3_pmid_gefunden
    jne pmid_failed
    

    leider springt er auch hier immer wieder zu pmid_failed, egal ob eine Vesa 3 Karte vorhanden ist oder nicht. 😞



  • Hallo,

    vorläufig brauchst du nur EIN Buch - Die Biebel der Assembler-Programmierer, das ist der Befehlssatz deines Prozessors!

    Lies mal unter REP nach, dann wirst auch du erkennen, daß deine VesaKarte meilenweit von deinem Programm entfernt ist.

    Sing mal .: I am Walking............... 🕶

    Vielleicht solltest du, wenn du unter JE nachgelesen hast, vorher einen Vergleich machen:

    cmp    eax,'PMID'
    

    dann springt er ganz sicher nach GEFUNDEN.

    Viel freude noch.
    Rudi



  • Hallo,

    sevobal schrieb:

    Hi,
    danke, die erste einigermaßen Vernünftige antwort. Habe mir auch mehrere Bücher zum Thema Assembler geholt. Bin gerade dabei mich einzulesen, sowas braucht Zeit, keine Frage, und habe meinen Code mal folgendermaßen neu geschrieben, was hällst du (oder auch andere _vernünftige_) davon?

    mov edi, 0x100000 ;hierhin habe ich das Biosimage kopiert
    mov eax, 'PMID'
    rep scasd
    je vesa_3_pmid_gefunden
    jne pmid_failed
    

    leider springt er auch hier immer wieder zu pmid_failed, egal ob eine Vesa 3 Karte vorhanden ist oder nicht. 😞

    versuch mal so:

    mov edi, 0x100000 ;hierhin habe ich das Biosimage kopiert 
    mov eax, 'PMID'
    rep scasd
    je vesa_3_pmid_gefunden
    jne pmid_failed
    


  • @Keine Ahung: Wo ist denn da der Unterschied zwischen meinem und deinem Code? 😕 Aber trotzdem danke schonmal!



  • Der REP-Befehl bewirkt dass der Stringbefehl nach dem Wiederholungspräfix so lange ausgeführt wird , bis das CX null erreicht hat.
    Ich sehe hier keine CX initialisierung.

    Was genau willst du machen? Den DWORD-Wert bei Adresse 0x100000 mit "PMID"
    vergleichen oder was?

    [asm]
    mov edi, 0x100000 ;hierhin habe ich das Biosimage kopiert
    mov eax, 'PMID' ; oder so 'DIMP'
    rep scasd
    je vesa_3_pmid_gefunden
    jne pmid_failed



  • Ausserdem überzeig dich dass du in edi wirklich offset und nicht den Wert 0x100000 schiebst.


Anmelden zum Antworten