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.