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.htm

    So, 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 wie

    mov
    

    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!!!


Anmelden zum Antworten