Autor Thema: Zufallszahl generieren  (Gelesen 18828 mal)

Flexxx

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« am: 19. August 2005, 13:20 »
Hallo erstmal.

Also ich habe bereits ein paar Ausgaben vom LowlevelMagazin gelesen und mich auch sonst shcon etwas mit OS Dev auseinandergesetzt.
Als erstes wollte ich mal etwas üben...

Also wollte ich den Kernel aus Ausgabe 1 so erweitern, dass er eine Zufallszahl generieren soll, die man dann später raten kann. (auch bekannt als Zahlenraten)

Jedoch gibt NASM 2 Fehlermeldungen aus, beim kompilieren. Jedoch weiß ich nicht was ich falsch gemacht habe.

; Zufallszahl generieren
rand:
xor ebx,ebx ; EBX leeren
mov eax,0x0040
mov edx,eax
mov eax,edx:[0x6c] ; BIOS Zeitzähler nach EAX auslesen
.rand1:
xor edx,edx ; EDX leeren
div 0xa
add ebx,edx ; Quersumme bilden (mehrere durchläufe erforderlich)
cmp eax,0
jne .rand1 ; zahl nicht zu ende? >> nochmal
retn


In dem Code soll die Quersumme von der Zeit gebildet werden, die dann die Pseudozufallszahl ist.

Es gibt Probleme mit Zeile 6 (mov eax, edx:[0x6c]) und Zeile 9 (div 0xa)
Fehlermeldung zu den bieden Zeilen ist jeweils:
error: invalid combination of opcode and operands

Kann mir da jemadnd weiterhelfen?

EDIT: Der Prozessor befindet sich noch im Real Mode.
Erleichternd sind gelöste Probleme.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 19. August 2005, 13:50 »
Sicher das da edx:[...] stehen sollte? Das sieht für mich als ASM-Legastheniker so aus als ob du edx als Segmentregister benutzen wolltest, was ja nicht geht.
*post*

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 19. August 2005, 14:08 »
die division geht nicht, weil der div befehl anscheinend nur mit registern oder speicheradressen funktioniert.

...
mov ecx, 0x0a ; oder statt ecx ein anderes register
div ecx
...


oder

rand:
...
div dword [zehn]
...
retn
zehn dd 0x0a
Dieser Text wird unter jedem Beitrag angezeigt.

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. August 2005, 14:23 »
muss bei der Division nicht noch zwingend das DX bzw. EDX Register auf 0 gesetzt werden ?!

also XOR EDX, EDX

Flexxx

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. August 2005, 14:37 »
Danke, jetzt gibt es nur noch eine Fehlermeldung.

Das Lesen von 4 Byte von 0x0040:0x006c funktioniert immer noch nicht, obwohl ich jetzt ein Segmentregister verwende (mov eax,es:[0x006c])
Mein aktueller Code:
; Zufallszahl generieren
rand:
xor ebx,ebx ; EBX leeren
mov ax,0x0040
mov es,ax
mov eax,es:[0x006c] ; BIOS Zeitzähler nach EAX auslesen
.rand1:
xor edx,edx ; EDX leeren
mov ecx,0x0a
div ecx ; mit 10(0x0a) dividieren
add ebx,edx ; Quersumme bilden (mehrere durchläufe erforderlich)
cmp eax,0
jne .rand1 ; zahl nicht zu ende? >> nochmal
retn
Erleichternd sind gelöste Probleme.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. August 2005, 14:37 »
@ICC: ja. tut er auch.
Dieser Text wird unter jedem Beitrag angezeigt.

Paul

  • Beiträge: 41
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 19. August 2005, 14:40 »
Benutzt du NASM ?

Dann musst du schreiben
mov eax, [es:0x006c]   ; BIOS Zeitzähler nach EAX auslesen

Also das Segmentreg auch in die eckige Klammer rein.

Edit: Äh ROFL ? Mir fällt grad auf....die Uhrzeit....12:40 ? Bei mir ist es 14:40

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 19. August 2005, 14:44 »
Zitat von: ICC
Edit: Äh ROFL ? Mir fällt grad auf....die Uhrzeit....12:40 ? Bei mir ist es 14:40


das kannst du im profil ändern: Zeitzone auf "GMT + 2 Stunden"
Dieser Text wird unter jedem Beitrag angezeigt.

Flexxx

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 19. August 2005, 14:51 »
Danke, jetzt funktioniert es.

Zum Abschluss noch der korekte Code:
; Zufallszahl generieren
rand:
xor ebx,ebx ; EBX leeren
mov ax,0x0040
mov es,ax
mov eax,[es:0x006c] ; BIOS Zeitzähler nach EAX auslesen
.rand1:
xor edx,edx ; EDX leeren
mov ecx,0x0a
div ecx ; mit 10(0x0a) dividieren
add ebx,edx ; Quersumme bilden (mehrere durchläufe erforderlich)
cmp eax,0
jne .rand1 ; zahl nicht zu ende? >> nochmal
;Zufallszahl in EBX
retn
Erleichternd sind gelöste Probleme.

Horst

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 26. March 2010, 13:44 »
Könnte das jemand in C übersetzen? Bin nämlich total schlecht in ASM. Die Funktion rand() von C bringt mir nichts, da ich keine Include's benutze.

L.G.
Horst

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 26. March 2010, 14:23 »
Hallo,


Könnte das jemand in C übersetzen?
klar:
uint32_t zeit = [0x0040:0x006C]  //wie man das seinem C-Compiler beibringt muss man selbst rausfinden
uint32_t zahl = 0; //hier kommt die Quersumme der BIOS-Zeit in Dezimal rein, ist dann das Ergebnis
do
 {
   zahl += zeit % 10;
   zeit = zeit / 10;
 }
while(zeit != 0);
Hoffe das hilft Dir weiter, denn tieferen Sinn dieses Code verstehe ich nämlich nicht.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Horst

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 26. March 2010, 22:18 »
Zitat
Hoffe das hilft Dir weiter, ...

Hey..  ja, das ist schon mal was. Aber wie ermittel ich die BIOS - Zeit?

L.G.
Horst

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 26. March 2010, 23:58 »
Hallo,


Aber wie ermittel ich die BIOS - Zeit?
Du meinst "Wie greife ich auf diese Speicherstelle zu?".
Ich denke Inline-Assembler ist das passende Werkzeug. Wie Inline-Assembler benutzt wird sollte dem Manual Deines Compilers zu entnehmen sein. Was für Befehle dann benötigt werden hängt u.a. davon ab ob der Code im Real-Mode oder im Protected-Mode läuft. Manche Compiler bieten auch die Möglichkeit direkt einen absoluten Speicherzugriff zu formulieren.

Alls Startwert für einen Pseudo-Zufalls-Generator ist diese Quersumme auf jeden Fall nicht geeignet, der mögliche Wertebereich ist einfach fiel zu klein (von etwa 20 bis maximal 77). Da gibt es bessere Werte, die auch mit weniger Aufwand zu ermitteln sind.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 27. March 2010, 00:16 »
Eigentlich ist hier aus diesem Thread gar nichts brauchbar.

Wenn du wirklich die Uhrzeit haben willst, solltest du sie aus dem CMOS lesen. Dann ist sie wenigstens aktuell, und in einem brauchbarem Format. Die BIOS Data Area wird nicht mehr aktualisiert, während du im Protected Mode bist. Außerdem bekommst du darüber nicht das Datum heraus, wenn du das auch noch haben willst.

Wenn du einfach vernünftige Pseudozufallszahlen willst, dann solltest du dich über LCG informieren, und nicht versuchen diesen verkorksten Algorithmus zu verstehen.
Dieser Text wird unter jedem Beitrag angezeigt.

lupo1977

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 12. April 2010, 03:25 »
Brauchbarere Zufallszahlengeneratoren findest Du hier
http://en.wikipedia.org/wiki/Linear_congruential_generator
und noch brauchbarer hier
http://en.wikipedia.org/wiki/Mersenne_twister

Beide kannst Du nativ in Assembler implementieren.

Das was Du da treibst ist kein guter Ansatz.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 12. April 2010, 13:26 »
Hallo,


Brauchbarere Zufallszahlengeneratoren findest Du hier ....
Naja, ob die wirklich "brauchbar" sind hängt vom Anwendungszweck ab. Beides sind jedenfalls PRNGs und damit für (sicherheits-)kritische Dinge absolut ungeeignet. Nebst dessen das dann immer noch das Problem bleibt das für derartige Algorithmen ein möglichst zufälliger Startwert benötigt wird, und dafür ist die aktuelle Zeit definitiv nicht geeignet.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 12. April 2010, 21:54 »
Hier fragen Leute, die (sicherheits-)kritische Dinge programmieren. Haha.
Dieser Text wird unter jedem Beitrag angezeigt.

lupo1977

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 13. April 2010, 02:23 »
Erhlich gesagt habe ich nicht das Gefühl das es dem Threadstarter um kryptographisch sichere PRNGs geht.
Ansonsten hast Du natürlich recht. Wenn es auf Sicherheit ankommt, dann bleibt bei guten PRNGs trotzdem noch das Problem einen sicheren seed zu benutzen. Aber da kann man ja dann Hardware einsetzen, zB Smartcards...
« Letzte Änderung: 13. April 2010, 02:25 von lupo1977 »

 

Einloggen