Heyho,
wie gesagt dazu musste einen Treiber schreiben und dafuer brauchts du entweder das aeltere Windows DDK oder das neue Windows Driver Kit (WDK). Einfach mal googln und dann wie gesagt schauste einfach mal bei codeproject nach, Da sollteste die Basics finden.
Blessed Love C0de4Fun
Weil es so im gcc Manual steht:
You can get the address of a label defined in the current function (or a containing function) with the unary operator ‘&&’. The value has type void *.
Und wenn man versucht mit einem & zu kompilieren, kommt eine Fehlermeldung:
funcB1.c: In function FuncB': funcB1.c:4: error:Ende' undeclared (first use in this function)
funcB1.c:4: error: (Each undeclared identifier is reported only once
funcB1.c:4: error: for each function it appears in.)
Übrigens, wegen der Zeile pushl #index mit dem Zeichen #. Das Zeichen kenne ich so nicht. Wenn, dann $:
pushl $index # push Adresse von index
pushl index # push Inhalt von index (42)
...
.section .data
index: .long 42
Nobuo T schrieb:
Ack (glaube ich).
Entweder du kennst dich schon mit den Grundlagen (Asm, Debugging und Eigenheiten von Compilern) halbwegs aus, dann brauchst du so ein Buch nicht, oder du hast im Grossen und Ganzen keine Ahnung, dann bergen solche Buecher IMHO ein grosses Risiko der Vermittlung gefaehrlichen Halbwissens.
Aehnlich wie duenne Buecher, die einem versprechen, in wenigen Tagen etwas Japanisch zu vermitteln.
In dem Buch geht es doch nicht um diese Grundlagen. Meine Frage war zu einem Unterkapitel eines Anhangs bezogen, dass dieser eine eigenständige Lektüre zu diesem Thema nicht ersetzten kann ist ja wohl klar. Außerdem schlägt der Autor auch explizit zusätzliche (empfehlenswerte) Literatur vor. Zumindest über Betriebssysteme, Compilerbau, Compileroptimierung und Assembler.
Das Buch selbst behandelt vereinfacht gesagt einfach nur ein paar Reversing-Sessions an denen der Autor ein paar Techniken die man Anwenden kann vermitteln möchte. Nicht mehr und nicht weniger
hi,
ich mag debug - kenn mich aber noch nicht so mit Assembler aus. kennt jemand eine neuere Version, mit der man ähnlich gut arbeiten und lernen kann, und welche schnell zwischen Real- und Protected Mode umschalten kann oder Fpu und MMX und SSE Register zeigt und parallelthread-asm kann usw?
(oder wie sowas selber programmieren?)(ein Anfang?...;-)
Ich finde, Assembler zu Lernen macht genausoviel Spaß wie Algorithmen lernen und verbessern oder in Basic, Java, C, D, Pascal, Fortran, Ruby oder Html oder Tabellenverarbeitungen usw. zu programmieren. Nur leider sind bei Assembler die Dokumentationen oder Bücher oft hoffnungslos veraltet oder didaktisch nicht wirklich gut.
dsdx schrieb:
Wird hier jetzt DS in DX geschoben und DX in den Buffer oder umgekehrt ?
DS:DX -> buffer
Weder noch. Die beschriebene Funktion erwartet in dem Registerpaar DS und DX einen Zeiger auf einen Puffer im RAM mit der angegebenen Struktur.
Stichwort "Adressierung im Real Mode". In DS gehoert der Segment- und in DX der Offset-Teil der Adresse des Puffers.
dsdx schrieb:
Weil z.b.
add var,2 <-- Hier schiebt man ja die 2 in var und nicht var in 2
Da wird die 2 auf einen Wert im RAM addiert. Hat aber nicht viel mit dem Fall oben zu tun.
nur ausgerechnet bei Schleifen mit drei xor und drei sub gibt es diesen einen Ausreisser...
Dass die Cpu bei aufeinanderfolgenden Instruktionen mit gleichem Zielregister Schwierigkeiten mit deren Parallelisierung haben kann ist nicht verwunderlich.
Wenn Du Dir bei Intel mal ein paar Dokumente zum Cpu-Frontend, Instruction-Prefetching und der Zerlegung von x86-Instruktionen in Micro-Ops anschaust, wirst Du sicherlich Hinweise darauf finden wieso es mit Deiner Cpu bei "mov" nicht klappt.
Die meisten Assembler bieten eine "Instruktion" an, welche dich direkt Bytes oder Words in den Code einbetten lässt. Bei x86 gibt es z.B. oft db oder dw , gefolgt von irgend einem Wert, welcher dann geschrieben wird anstelle von aus Mnemonics generiertem Code. Hast du schon mal die Dokumentation abgesucht nach sowas?
MfG
abc.hirn schrieb:
Das traurige ist, dass deine künstlichen Messungen dir garnicht den wahren Wert der ganzen Operationen zeigen und die Zusammenhänge erst recht nicht.
Ein winziger loop der nur Unsinn macht nutzt so ziemlich garnichts davon aus was CPUs an Optimierungen haben.
Dein xchg der 30 Takte zieht ist entsprechend mau, in normalen Fällen sind das eher 300.
So winzig sind meine Schleifen nicht. Machen immerhin eine Million Wiederholungen. Sie machen natürlich Unsinn, wenn Du bessere Beispiele kennst, dann her mit dem Code.
Wie kommst Du auf 30 Takte? 300 Takte? Wie gemessen?
Ich habs doch hinbekommen.
Die Frage ist nun folgende:
Ich lasse mir in C das Zeichen '\n' dezimal ausgeben und bekomme 10 raus.
Frag ich in Assembler ab, ob ein Array-Element den Wert 10 bzw. 0AH hat, spinnt mein Programm.
Wie kommt das denn?
Achchso, wieso geht folgendes nicht:
in eax befindet sich eine Adresse von einer 32-Bit-Variable
in ebx befindet sich eine Adresse von einer 32-Bit-Variable
Dann spuckt mir
mov dword [eax],[ebx]
einen Fehler aus.
Hat es einen tieferen Sinn, dass sowas nicht geht?
Ich mein, warum muss ich denn enbedingt eine Variable in den Prozessor laden?
Ich habe mir letzdens dieses Buch gekauft:
http://www.amazon.de/Assembler-Grundlagen-Programmierung-Joachim-Rohde/dp/3826614690
Das ist ganz gut da kommt auch etwas über NASM drin vor aber der unterschied zwischen NASM und TASM ist ja jetzt auch nicht so groß zu mindest von dem was ich bis jetzt gesehen habe.
Das Buch müsste man in die FAQ bei den Buchempfehlungen denn das Buch ist wirklich nicht schlecht.
Vielen Dank für deine Antwort. Auf die Idee, dass sich die Adresse bei einem "normalen" Aufruf im Gegensatz zum Debugger ändern kann, bin ich garnicht gekommen.
Das ganze war aber sowieso nur als Test gedacht, um mich ein wenig ins Debuggen einzuarbeiten. Von daher ist es also nicht schlimm, wenn es nicht funktioniert.
"Wenn du das sagst..."
so war das nicht gemeint (sorry)...
Frage ist: Wie macht das ein Bootloader? Ein Bootloader kann ja auch anbieten von CD, Laufwerk, Diskette u.s.w. zu booten auch wenn diese nicht im BIOS eingetragen sind.
Bin für anregungen dankbar.
Gruß
Sascha999999999
Nobuo T schrieb:
Hm, gute Idee eigentlich.
Weiss nur nicht, ob cdw der richtige Befehl ist. AFAIR erweitert der nur al auf ah.
du beschreibst cbw (convert byte to word)
ich meinte cwd (convert word to doubleword)