Abt. Moderne Logos
=============
Höchste Zeit für ein Update (GIF-Bild)
Gruss
ALGORITHMEN - Teil XV : Das Müllen ist des Wandrers Lust
-
-
-
Abt. Primzahllücken
==============
Zum Rätsel WR 17 schulde ich noch das zugehörige Programm - Bittesehr!
GrussCode
Alles anzeigenWindowTitle " PRIMZAHLLÜCKEN (= AUFEINANDERFOLGENDE PRIMZAHLDIFFERENZEN) SUCHEN" WindowStyle 1 | 8 | 16 :cls:Declare Daten#,ZahlenAnzahl&,StartZeit&,PrimAnz&,n& 'Erstellt mit dem XProfan Datengenerator, (C) Frank Abbing 'C:\Users\Jonathan\Desktop\JWASM\PrimTurbo_Hauptschleife.BIN (orig.Dateigröße 162 Byte) Declare Code#,Luecke&,last&:Dim Code#,164:Clear Code# Long Code#,0=1397791846,1448563281,35048,-1959228672,12977264,21022208 Long Code#,24=37799424,54576640,71353856,88131072,104908288,121685504 Long Code#,48=16827904,16859334,441,-834977536,-796187532,311087363,1946286720 Long Code#,76=-1047834384,-487075445,-1957113717,-958790696,-788332285 Long Code#,96=-210315461,29087723,-1962934272,63013832,-150736757,225955387 Long Code#,120=-1048374902,16416770,-347868555,63474671,428425679,1499094878 Long Code#,144=-1654237093,321731,-854261760,-1957165221,49920: huh: Print "\n Primzahlbereich untersuchen bis: ";:Input ZahlenAnzahl& ZahlenAnzahl&=abs(ZahlenAnzahl&):case ZahlenAnzahl&=0:goto "huh" set("decimals",15):Dim Daten#,ZahlenAnzahl&+5:Long Daten#,0=ZahlenAnzahl& Long Daten#,4=(Sqrt(ZahlenAnzahl&)+1)\1 WhileLoop 0,@SizeOf(Code#)-4:If @Long(Code#,&loop)=123456789 Long Code#,&loop=Daten#:EndIf EndWhile:Print " Primzahlen werden ermittelt..." StartZeit&=&gettickcount:@Call(Code#):Dispose Code# Print " Benötigte Zeit: "+format$("%g",(&gettickcount-StartZeit&)/1000)+" Sekunden." Print " Gefundene Primzahlen: " + @Str$(@Long(Daten#, ZahlenAnzahl& + 1)):nochmaL: print "\n Welche Primzahldifferenz wird gesucht? ";:input Luecke&:n&=0 case Luecke&=0:goto "exit" case (Luecke&>1) and ((Luecke& mod 2)>0):goto "Antwort" whileloop 1,Zahlenanzahl& IfNot @Byte(Daten#,&loop):if (&Loop-Last&)=Luecke& print Last&;"_";&Loop;" ";:inc n&:case n&=1:waitinput 3000 endif:last&=&Loop:endif endwhile:Antwort: beep:font 2 print "\n\n ";n&;" Lücken der Größe ";Luecke&;" gefunden im Bereich bis 0..";Zahlenanzahl& print "\n Lückenverhältnis (N / Anzahl Primzahlen): ";n&/@Long(Daten#,ZahlenAnzahl&+1) font 0:waitinput:goto "nochmaL": Exit: Dispose Daten#:font 2:print "\n Auf Wiedersehen! ":waitinput 2000 END
-
Abt. Interessante Links
==================
Vortrag im Rahmen des 34. Jahrestreffens des Chaos Computer Clubs "34C3" Ende 2017 in Leipzig (insgesamt ca. 15000 Teilnehmer!):
Englisch: "34C3 - Everything you want to know about x86 microcode, but might have been afraid to ask"
Deutsch: "Wie man den Intel/AMD x86 MICROcode des Risc-Processors, der in 80x86 CPUs sitzt, patchen kann"Und hier noch ein Vortrag über letzte Hacker-Erkenntnisse zur CPU-internen "System Management Engine Intel ME", auf der dem Vernehmen nach ab Stromanschluss nicht abschaltbar das Linux-OS MINIX läuft.
GrussP.S.: Besonders aktuell wegen des Meltdown/Spectre Hardwarebugs;
Ermittlungsstand gilt aber nur für CPUs bis Ende 2013. -
Abt. Realistische Bewegung von 3D-Game Figuren
=====================================
durch Einsatz von künstlichen neuronalen Netzen: Youtube-Video: Atemberaubend!
Vor kurzem sah das noch so aus: Youtube-LinkGruss
P.S.: Wo wird das enden? Werden Spielfiguren für mehr Realismus z.B. simulierte künstliche Schmerzen erleben? Für sie sind diese nämlich überhaupt nicht künstlich, sondern Schmerzen! Tierschutzparagraphen für Spielfiguren!?
-
Abt. XProfan X4: Floats mit Inline-FPU-Befehlen direkt bearbeiten
================================================
EDIT: Das bezieht sich auch auf die Alphaversion hier im Board: LINK
Gruss -
Abt. Skalarprodukt zweier Vektoren mittels X4-ASM ermitteln
=============================================
Alpha-Version ohne jede Gewähr (Bei mir hat´s funktioniert).
GrussCode
Alles anzeigenWindowTitle "Skalarprodukt zweier Float-Vektoren mit X4-ASM" WindowStyle 24:cls set("AsmMode",0) ASM "aDOTPRODf",4 MOV EAX,par1 MOV EBX,par2 MOV EDI,par3 'Size MOV ECX,par4 'addr(DotProd!) XOR EDX,EDX '&Loop FLDZ 'Sum=0 Rept: FLD QWORD PTR [EAX] FLD QWORD PTR [EBX] FMUL FADD INC EDX CMP EDI,EDX JE Exyt ADD EAX,8 ADD EBX,8 JMP Rept Exyt: FSTP QWORD PTR [ECX] ENDASM '-------------------------- Var vecsize& = 1000000 ' ... Beispiel '-------------------------- print "\n Skalarprodukt zweier Vektoren der Dimension ";format$("#,##0",vecsize&) var tmp&=&gettickcount declare a![vecsize&-1],b![vecsize&-1],dotprod! tmp&=&gettickcount-tmp& Print "\n Vektoren deklariert in ";tmp&;" ms." print "\n Werte zugewiesen in ... "; tmp&=&gettickcount Randomize a![]=rnd() ' 2e10 b![]=rnd() ' -1.1e10 tmp&=&gettickcount-tmp& print tmp&; " ms." var tm&=&gettickcount aDOTPRODf(addr(a![0]),addr(b![0]),sizeof(a![]),addr(dotprod!)) tm&=&gettickcount-tm& font 2:print "\n\n Ergebnis = ";format$("%g",dotprod!) print "\n ... errechnet in ";tm&;" ms." waitinput
-
Abt. Ungelöstes Rätsel
=================
Gesucht wird eine faire Wurfmünze, bei der die Wahrscheinlichkeit, daß sie genau auf dem Rand zu stehen kommt, ein Drittel beträgt, sowie für Zahl oder Kopf je ein weiteres Drittel. Klingt einfach, die Lösungskonzepte reichen aber von ...a) Deckfläche "Zahl" zu Zylinderfläche "Rand" zu Deckfläche "Kopf" müssen 1/3 zuz 1/3 zu 1/3 sein,
über ...
b) Der Querschnitt ist einem Kreis einzuschreiben, dessen Umfang dann zu je 1/3 auf Flächen und 2*1/6 Rand begrenzt wird,
über ...
c) Einer Kugel ist der Münzylinder einzuschreiben, sodaß die Kugelflächen je gedrittelt werden,
und über ...
d) Ein statistisches Modell über 100.000 Würfe wird einen Mittelwert zwischen a), b) und c) ergeben,
bis zu ...
e) "Mir doch egal, ich spiele ohnehin nicht!"reicht. Langsam neige ich zu irgendetwas zwichen d) und e), weil: Ich komm einfach nicht drauf ...
GrussP.S.: Auch in diesem Youtube Video (engl.) gibt es dazu keine Lösung!
-
Abt. Lösungsversuche zum ungelösten Rätsel
=================================
Ich habe nun zwei statistische Ansätze simuliert. Mein Ansatz war "Kippkante": Wenn der Schwerpunkt der Münze über der Kante zu liegen kommt, entscheidet sich in welche Richtung die dicke Münze fällt (oder am dicken Rand herumrollt).Ansatz f): Gefühlsmäßig wäre das bei einem Verhältnis Durchmesser zu Dicke von 2:1 der Fall gewesen - die Statistik unterstützt aber eher meinen zweiten Ansatz:
g): Der Winkel vom Schwerpunkt zu den Kanten der Münze muss +/-30° betragen. (Das Verhältnis Durchmesser zu Dicke ist dann SQRT(3):1, also ~1.732050808...). Nachstehend mein Versuchsprogramm.
Gruss
P.S.: Gerade entdeckt, dass das dem Ansatz b) im obigen Beitrag entspricht.
Hat offenbar auch etwas mit Sechseckseiten zu tun...Code
Alles anzeigencls randomize declare w!,g1!,g2!,zahl&,rand&,kopf& 'g1!=arctan(2/1) 'Versuch 1:63.43° ... Durchmesser zu Dicke = 2:1 g1! = 60*Pi()/180'Versuch 2:60°, Durchmesser zu Dicke = Sqrt(3) ~ 1.73 g2! = -g1! print "\n +/-";g1!*180/Pi();" °" whileloop 999999 case rnd()<0.00005:show w!=pi()*2*(rnd()-0.5) if w!>=g1!:inc Kopf& elseif w!<=g2!:inc Zahl& else :inc rand& endif endwhile font 2 show beep waitinput end proc show locate 4,2:print "Kopf:",kopf& locate 6,2:print "Zahl:",zahl& locate 8,2:print "Rand:",rand& locate 10,2:print "Summe",int(kopf&+zahl&+rand&) endproc
-
Abt. Realistische Bewegung von 3D-Spielfiguren (Teil II)
========================================
Interessant, was in Ansätzen schon 2006 möglich war: Energiearm gehen lernen auf Basis von Muskelmodellen (Youtube).2011 wurden dann auf dieser Basis auch Vierfüsser mit realistisch wirkenden Bewegungen versehen.
Im selben Jahr wurden auch realistische passive Oberflächen- und Hautsimulationen mögllich, und die Figuren erhielten Muskelspannung aufrecht sowie flexible Körperteile (Flatternde Ohren etc).
Und 2013 bekam man Flüssigkeiten verschiedener Zähigkeit in den Griff.
2017 wurden Biegelinien modern: Der Computer selbst hilft hier bei der Umsetzung von manuellen Skizzen in realistisch wirkende 3D-Figuren und -Szenen!
Ausserdem bekam man Partikelsysteme wie Rauchschwaden diesmal physikalisch richtig in den Griff, und auch Schnitte von (virtuellen) Scheren an gummiartigen Materialien.
Mit Spannung darf erwartet werden, wie es heuer weitergeht!
GrussP.S.: Zur Produktivitätserhöhung wurden 2017 auch künstliche Zusatzarme vorgeschlagen - kein Witz!
-
Abt. x86-Stack Eigenheiten
====================
Eine Intel\AMD x86-CPU ("Central Processing Unit") sieht im ´FLAT´-Speichermodell von 32 bit-Windows-Anwendungen im Prinzip bekanntlich so aus:_32:_16:_8__8_bit
(EAX(AX(AH)(AL)))
(EBX(BX(BH)(BL)))
(ECX(CX(CH)(CL)))
(EDX(DX(DH)(DL)))
(EDI(DI))
(ESI(SI))
(EBP(BP)): Base Pointer
(ESP(SP)): Stackpointer
-------------------------------
{EIP Instruction Pointer}
(EFLAGS(FLAGS){FH}{FL})
--------------------------------Ein CPU-Stack (zu dt. "Stapel") besteht nun bei der Intel\AMD x86 aus ...
- dem normal gegen hohe Speicheradressen jeweils 4 Byte stapelnden Parameterstack,
- der 4-Byte Rücksprungadresse, auf deren niederstes Byte der Extended Base Pointer EBP der CPU zeigt,
- aus dem verkehrt (gegen niedrigere Adressen) jeweils 4 Byte stapelnde Unterprogramm-eigene Variablenstack,
- aus den niedrigsten gültig belegten 4 Byte dieses Stack - paradoxerweise TOP OF STACK genannt, auf
' dessen niederstes Byte der Extended Stack Pointer ESP der CPU jeweils zeigt.
' Anmerkung: Der ESP wird vor PUSH um 4 Bytes reduziert und nach POP um 4 Byte erhöht.- aus dem möglicherweise noch mit alten Werten belegten, nach unten freien Stackbereich.
Hier ein Beispiel mit 4 Parametern (- immer zu je 4 Byte, welche entweder Werte oder Pointer darstellen):
[Hohe Speicheradressen]
...
Stackbasis + 16: Par3Stackbasis + 12: Par2
Stackbasis + 8: Par1
Stackbasis + 4: Par0 (nicht verwendet, für gepushten Original-EBP-Inhalt gebraucht??)
Stackbasis + 0: Rücksprungadresse
' Anmerkung: Auf das niedrigste Byte der Rücksprungadresse, die sog. Stackbasis,
' zeigt üblicherweise das EBP-Register der CPU und, falls noch keine Werte gePUSHt
' wurden, auch das (geradezu heilige) ESP-Register der CPU. Es gilt in der Regel:
' Finger weg vom ESP-Register - es sei denn es ginge um schnelle Stackbereinigung.Stackbasis - 4: GePUSHter 1. tempoerärer Wert (z.B. EAX-Register der CPU)
Stackbasis - 8: GePUSHter 2. temmporärer Wert (z.B. ESI-Register der CPU)
' Hinweis: Nach zwei PUSH-Befehlen zeigt das ESP-Register auf (Stackbasis +Darunter: Freier Stackbereich, eventuell noch mit Altwerten
...
[Niedrige Speicheradressen]Quelle: https://eli.thegreenplace.net/2011/02/04/whe…tack-is-on-x86/
sowie Auszug aus den Erläuterungen zum X4-alpha Interpreter:
(Zit.:)Par1 steht für [ebp + 8] (die Speicherstelle an der der erste Parameter abgelegt wird),
Par2 für [ebp + 12], etc. Da wir uns in der 32-Bit-Welt befinden hat jeder Parameter eben 4 Byte!
Der Wert in EAX ist der Rückgabewert der Funktion.
Das zwingend notwendige
PUSH EBP
MOV EBP,ESP'am Anfang, sowie das
MOV ESP,EBP
POP EBP
RET x '(x bei 1 Parameter x=4, bei 2 Parametern x=8 etc.)'am Ende fügt XProfan X4 selbsttätig hinzu.
Vom ESP-Register (Stack) sollte man im Code die Finger lassen!
Der ASM "Funktionsname" Befehl assembliert den nachfolgenden Code bis ENDASM und fügt die Funktion der Liste der importierten Funktionen bei, so wie es auch ImportDLL (alle Funktionen der DLL werden importiert) und ImportFunc (bestimmte Funktione werden importiert) machen. Anschließend steht die Funktion dem Programm unter dem gewählten Funktionsnamen zur Verfügung.
(Zit. Ende)
_________
Gruss -
-
-
Abt. Stack-Versuche 3: "getThirdPushedValue"
----------------------------------------------------- -
-
-
Deinen Code in #92 "getOwnCallAddr" sollte man nicht zu wörtlich nehmen . Wie Du in #90 schon schreibst, fügt Profan am Beginn des Codes noch
PUSH EBP
MOV EBP,ESPein, die ermittelte Adresse ist deshalb als Aufruf für die Prozedur nicht zu empfehlen.
Gruß Volkmar
-
Wieso klappt das dann, Volkmar?
Abt. Errata:
=======
1) In Beitrag #90 muss es heißen:' Hinweis: Nach zwei PUSH-Befehlen zeigt das ESP-Register auf (Stackbasis -
... ALSO MINUS ACHT, NICHT PLUS ACHT !
Stackbasis - 4: GePUSHter 1. tempo
erärer Wert2) In Beitrag #91 muss es heißen: ASM "getparam2",2
3) Volkmar hat recht: #92 "getOwnCallAddr" ist falsch, bitte nicht verwenden! Korrektur folgt!
Sorry!
-
Du erwischt zwar die Prozedur, aber eben nicht die beiden eingefügten Codezeilen. Die werden ja vor der ersten von Dir geschriebenen Zeile eingeschoben. Ich weiß nicht so genau, an welcher Stelle die Adresse der Marke bestimmt wird. Eigentlich logischerweise nach der Bearbeitung, also Einfügung.
Gruß Volkmar
-
Da hast Du allerdings recht. Da es sich aber um definierte Befehlslängen handelt, müsste das rauszukriegen sein, wieviele Byte der wahre Einstieg davor liegt. Mal sehen...
Code
Alles anzeigencls ASM "getAddrDiff",0 start: PUSH EBP MOV EBP,ESP marke: mov eax,marke sub eax,start MOV ESP,EBP POP EBP ENDASM print getAddrDiff() waitinput end
Hmmmm... Der Unterschied sind wirklich nur 3 Byte!
Sieht m.E. gut aus: RAM stabil, Caches stabil trotz 1 Mio mal CALL !
DANKE, VOLKMAR! -
Abt. Stack-Versuche 6
==============
Welche Bedeutung hat wohl Parameter 0 am Stack? Ich stehe momentan voll auf der Leitung ...
Die Return-Adresse ist es nicht, die Aufrufende offenbar auch nicht ??
Bei mir liefert Par0 stets 4739851. Seltsam ...
Es scheint sich nicht um einen Registerinhalt zu handeln: Weder EAX, EBX, ECX, EDX noch ESI, EDI, EBP oder ESP haben diesen Wert. Dummerweise scheint die Zwischenablage mit der Ausgabe zu interferieren: EBX und EBP zeigen andere Werte an als dann in der Zwischenablage landen. Sagte ich schon "seltsam" ?
Letzte Vermutung: Es könnte sich um das Handle des aufrufenden Programms handeln. (In Analogie zu Parameter 0 der Kommandozeile sozusagen.) -
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!