Zeichen aus Zeichenkette auslesen
-
Also, ich kann nix entdecken, außer vielleicht der eine Doppelpunkt, aber der ist glaub ich nicht der Fehler.
Gib ma bitte nen Tipp ich sehs echt nich.
Dankeschön!
-
... Dann will ich dir mal etwas auf die Spruenge helfen...
section .data section .text global _start _start: ; Hier startet das Programm ;Teststack Teststack ; Beim Erstellen: Warnung: orphan label (-> da gehoert ein Doppelpunkt hinter) push ebp ; Hier geht's weiter: Erster Befehl, der ausgefuehrt wird mov ebp, esp ;... mov esp, ebp pop ebp ; praktisch hat sich bis hier nichts weiter getan... ret ; Ab ins Nirvana: Die Zieladresse auf dem Stack ist hier undefiniert! -> "Speicherzugriffsfehler" ;alles Folgende wird nie ausgefuehrt... ;aufrufen call Teststack ;Programm beenden mov eax, 1 mov ebx, 0 int 0x80
-
Alles klar, jetzt hab ichs verstanden, ich mach jetzt einfach nen Sprung über das TestStack bzw. schreib den TestStack ganz unten hin.
Dankööö!
-
Palim palim!
Da bin ich wieder mit der nächsten Frage: Ich möchte mit Hilfe der cpuid-Instruktion den Herstellernamen auslesen und das alles in NASM.
Hab mich schon ein wenig belesen:
http://de.wikipedia.org/wiki/CPUID
http://www.sandpile.org/ia32/cpuid.htmSo, also ich muss ins EAX den Wert 0 übergeben und dann Interrupt ausführen? Aber welchen? Ist das auch der 0x80? Resultat ist ein 12 Zeichen langer Name des Herstellers und zwar in den Registern ebx, ecx, edx verteilt (3*4=12 Bytes). Aber irgendwie funktioniert das nich.
Hat jemand ne Idee?
-
Keinen Interrupt. cpuid ist ein Prozessorbefehl - den schreibst du einfach so in dein Programm.
-
Aber irgendwie bekomm ichs trotzdem nicht hin...
Hier mal der Quellcode:
section .data Vendor db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ;13 Byte Laenge equ $ - Vendor section .text global _start _start: ;Hersteller auslesen xor eax, eax ;Inhalte aus ebx, ecx, edx speichern mov [Vendor], ebx ;... die anderen Register ;Ausgabe mov eax, 4 mov ebx, 1 mov ecx, Vendor mov edx, Laenge int 0x80 ;Programm beenden mov eax, 1 mov ebx, 0 int 0x80
-
... Was erwartest du denn von diesem Code fuer eine Funktion? Meinst du, die CPU-ID wird ohne den cpuid-Befehl aus dem Nichts generiert, wann immer du eax auf 0 setzt?
-
Nein, das habe ich nicht erwartet, aber wenn ich keinen Interrupt ausführen muss, was dann? Muss ich irgendein Schlüsselwort "cpuid" einsetzen und wo? Ich weiß nich wie ich an die Information komme...
-
NASM schrieb:
Nein, das habe ich nicht erwartet, aber wenn ich keinen Interrupt ausführen muss, was dann? Muss ich irgendein Schlüsselwort "cpuid" einsetzen und wo? Ich weiß nich wie ich an die Information komme...
.< ok, jetzt versuch ich es mal mit farbe zu erkären
cpuid ist eine instruktion wiemov
oder
add
oder
xor
daraus folgt also
cpuid
im code genauso zu verwenden wie andere instruktionen. welche parameter in welchen registern erwartet werden kannst du in den prozessorspezifikationen nachlesen, ebenso in welchen registern aufrufresultate liegen.
-
Ok, jetzt hab ich verstanden. War ja ganz einfach :))
Danke!!!