Hallo Leute, ich habe folgenden Code zur Umwandlung von Fahrenheit nach
Newton und dazu eine Frage.
.data
F DW 21 ; 21 Grad Fahrenheit
N DB 4 dup(0) ; Variable Newton
I DB 0
.stack 16
.code
.startup
mov ax, F
mov bl, 11
mul bl
sub ax, 352
mov bl,60
idiv bl
mov N[0], ah
mov N[1], al
;NACHKOMMASTELLEN:
mov ax,-1
mov cx,3
mov si,1
mark1:
mov I,ah
mov bl,10
mov al,I
imul bl
mov bl,60
idiv bl
mov n[0+si],al
inc si
loop mark1
.exit
END
Zu den Fragen im Bereich Nachkommastellen:
Warum wird eine -1 in ax geschrieben?
warum wird durch 60 geteilt?
Das Prinzip ist mir klar, oben die Vorkommazahl, eine -2
3 Stellen Nachkomma (CX): ,016
Bei jeder Schleife wird mal 10 Multipliziert.
Danke für eure Hilfe!
Peter93 schrieb:> Algorithmus: Newton = (11 * Fahrenheit - 352) / 60
Newton ist eine Einheit für eine Kraft, Fahrenheit die einer Temperatur.
Du kannst nicht Äpfel in Birnen umrechnen.
Farenheit ---> imperiale Temperaturmaßeinheit
Newton ---> SI Einheit für Kraft (1 Newton ist die Kraft die eine
Masse von 1Kg in 1 sec um 1m/sec beschleunigt)
Umrechnung --> Unfug
Danke Kaj, das meinte ich damit.
Mir geht es auch weniger darum, ob das Programm sinnvoll ist oder nicht,
sondern darum wie es arbeitet, also den Algorithmus abarbeitet. Dazu
nochmal Folgende Fragen:
Warum wird eine -1 in ax geschrieben?
warum wird durch 60 geteilt?
Peter93 schrieb:> Warum wird eine -1 in ax geschrieben?
Wenn Du AX mit dem signed Integer -1 füllst steht 0xFFFF danach in AX
kann es sein das da irgendwo PUSH AX und POP AX fehlen.
> warum wird durch 60 geteilt?
Die Division durch 60 steht doch in deinem Umrechnungsalgorythmus, darum
steht sie wohl auch im Programm.
Peter93 schrieb:> Warum wird eine -1 in ax geschrieben?
verstehe ich auch nicht. Hast du schon mal probiert, ob die Routine
damit die richtigen Nachkommastellen errechnet?
Peter93 schrieb:> warum wird durch 60 geteilt?
Na wegen der Umrechnung ;-)
Innerhalb der Schleife wird ja jeweils der Rest der vorherigen Division
weiterverarbeitet. Die Nachkommastellen entsprechen ja nicht dem Rest,
sondern sie ergeben sich aus dem Rest dividiert durch den Divisor.
Achim S. schrieb:> Die Nachkommastellen entsprechen ja nicht dem Rest,> sondern sie ergeben sich aus dem Rest dividiert durch den Divisor.
Stimmt, das ergibt Sinn
Heinz V. schrieb:> Wenn Du AX mit dem signed Integer -1 füllst steht 0xFFFF danach in AX> kann es sein das da irgendwo PUSH AX und POP AX fehlen.Achim S. schrieb:> verstehe ich auch nicht. Hast du schon mal probiert, ob die Routine> damit die richtigen Nachkommastellen errechnet?
Ja es kommt das richtige heraus. Aber ist diese -1 nicht völlig unnötig,
da nach der Division ja sowieso FF FE (=-2) im AX register steht und
danach nur noch mit dem AL Register gearbeitet wird?
Okay ich habe das mov ax,-1 mal weg gelassen und es kommen trotzdem die
richtigen Werte raus, ich nehme also mal an, dass es überflüssig ist, da
ich auch keinen Grund sehe, warum ausgerechnet eine -1 da rein
geschrieben werden sollte.
Peter93 schrieb:> da nach der Division ja sowieso FF FE (=-2) im AX register steht und> danach nur noch mit dem AL Register gearbeitet wird?
AL wird danach gespeichert in n[SI] baer danach kommt ja wieder eine
Division, bzw. AH wird nach AL transportiert und dann wieder dividiert,
also ist der Inhalt von AX nicht egal.
reine vermutung, ohne den code im detail zu verstehen: evtl. ist das
nötig um die nachkommastellen von negativen newton temperaturen korrekt
zu berechnen?
Peter93 schrieb:> ich habe folgenden Code zur Umwandlung von Fahrenheit nach Newton
Ich finde es klasse, wenn ein Quellcode dermaßen "aussagekräftig"
kommentiert ist. Da fängt man doch schon am nächsten Morgen an zu
grübeln, was da noch genau passiert und warum dieses Register so und
jenes so gesetzt wurde.
Peter93 schrieb:> Aber ist diese -1 nicht völlig unnötig,> da nach der Division ja sowieso FF FE (=-2)
Dann ist es nicht unnötig sondern - für die allgemeine Umrechnung -
schlicht falsch.
Aber es kommt halt bei bestimmten Zahlenwerten trotzdem zufällig das
richtige heraus. Da deine Berechnung ja nur für einen bestimmten
Zahlenwert aufgerufen wird (21°F) hätte man auch einen beliebigen
Unsinns-Code hinschreiben können und am Schluss das richtige Ergebnis
fest codiert zuweisen können. So ähnlich schätze ich das mov ax,-1 ein.
Achim S. schrieb:> Peter93 schrieb:>> Aber ist diese -1 nicht völlig unnötig,>> da nach der Division ja sowieso FF FE (=-2)>> Dann ist es nicht unnötig sondern - für die allgemeine Umrechnung -> schlicht falsch.>> Aber es kommt halt bei bestimmten Zahlenwerten trotzdem zufällig das> richtige heraus. Da deine Berechnung ja nur für einen bestimmten> Zahlenwert aufgerufen wird (21°F) hätte man auch einen beliebigen> Unsinns-Code hinschreiben können und am Schluss das richtige Ergebnis> fest codiert zuweisen können. So ähnlich schätze ich das mov ax,-1 ein.
Ich würde einfach ein kleines C++-Progrämmschen schreiben, das die
Umrechnungsfunktion enthält. Werden umgerechneter Wert per cout <<
ausgegeben und der Eingangswert per cin >> eingelesen, dann optimiert
ein moderner Compiler das ganze nicht zu <Null> weg. Und natürlich eine
Assemblerlisting ausgeben lassen/aus dem Debugger C&Pten, dann hat man
einen Vorschlag, wie man das machen könnte.
Carl D. schrieb:> Ich würde einfach ein kleines C++-Progrämmschen schreiben, das die> Umrechnungsfunktion enthält. Werden umgerechneter Wert per cout <<> ausgegeben und der Eingangswert per cin >> eingelesen, dann optimiert> ein moderner Compiler das ganze nicht zu <Null> weg.
Das C++-Programm müsste aber schon recht "gekünstelt" sein, dass es zu
obigem Code vergleichbar wird (also mit Ganzzahlenoperationen die
Vorkommastellen und den Rest bestimmen und dann aus dem Rest dezimale
Nachkommstellen als Einzel-Ziffern berechnen).
Der oben gezeigte Code ist schon klar und nachvollziehbar. Nur wird halt
mittendrin ein Zwischenergebnis fix mit einem Wert überschrieben, der
für das gezeigte Zahlenbeispiel sogar das richtige Ergebnis liefert, der
aber bei Berechnung mit beliebigen Zahlen natürlich Quark wäre.
Harald W. schrieb:> Georg schrieb:>> Peter93 schrieb:>>> ich habe folgenden Code zur Umwandlung von Fahrenheit nach>>> Newton>>>> Woher? Es gibt keinen Umrechnungsfaktor dafür.>> https://de.wikipedia.org/wiki/Newton-Skala
Schon recht. Nur wurde diese Skala meines Wissens nach nie für
technische Anwendungen genutzt. Wozu man da also Code auf einem
Mikrocontroller für bräuchte, erschließt sich mir nicht so recht.
Mal abgesehen davon, dass der Code auch noch grottenschlecht ist.
Mark B. schrieb:> Schon recht. Nur wurde diese Skala meines Wissens nach nie für> technische Anwendungen genutzt. Wozu man da also Code auf einem> Mikrocontroller für bräuchte, erschließt sich mir nicht so recht.
Hausaufgaben.
Mark B. schrieb:> Wozu man da also Code auf einem> Mikrocontroller für bräuchte, erschließt sich mir nicht so recht.
Das ist x86 ASM vermutlich TASM Dialekt.
Heinz V. schrieb:> Mark B. schrieb:>> Wozu man da also Code auf einem>> Mikrocontroller für bräuchte, erschließt sich mir nicht so recht.>> Das ist x86 ASM vermutlich TASM Dialekt.
Gibt ja auch den 80C186 und 80C188 Mikrocontroller. ;-)
Peter93 schrieb:> Warum wird eine -1 in ax geschrieben?
Weil das Programm, so wie geposted, schlicht und einfach ziemlich falsch
ist. Sehr wahrscheinlich mit zwei absichtlich eingebauten Fehlern und
einem absichtlich eingebauten Performance-Killer.
Insgesamt: Vermutlich ist die eigentliche Hausaufgabe: finden und
beseitigen Sie die Fehler im Code und es gibt einen Bonuspunkt, wenn man
auch noch den Perfomance-Killer findet und beseitigt...
Insgesamt also eine durchaus angemessene Aufgabe für einen Studenten im
ersten Semester.
Also: Tu' es einfach, du faule Socke! Ja, man muss dazu tatsächlich noch
selber denken, da jib's kein YT-Tutorial für...
Mark B. schrieb:> Auch dafür darf man die Aufgabe(n) sinnvoll stellen, also hier z.B.> Fahrenheit nach Celsius :-)
Dafür würde man wohl schnell den Assemblercode im Netz finden. Durch
ungewöhnliche - notfalls auch praxisferne - Aufgabenstellung, verhindert
man recht unkompliziert eine direkte Copy&Paste-Lösung. Wer allerdings
den Code verstanden hat, dem wird es auch ein leichtes seine, eine
lineare Transformation Grad Fahrenheit nach Grad Celsius in eine Grad
Fahrenheit nach Grad Newton umzuformulieren. Vermutlich würde das noch
nichtmal als Transferleistung gewertet.
Mark B. schrieb:> S. R. schrieb:>> Hausaufgaben.>> Auch dafür darf man die Aufgabe(n) sinnvoll stellen, also hier z.B.> Fahrenheit nach Celsius :-)
Vielleicht war ja die Idee, dass man dabei noch gleich lernt, dass es
noch mehr Temperaturskalen als Fahrenheit und Celsius gibt.
Wolfgang schrieb:> Und um letztere geht es hier offensichtlich.
Das ist aber nur dann offensichtlich, wenn man es kennt. Ich kannte es
bisher nicht und hab mich anfangs auch gefragt, wie man eine Temperatur
in eine Kraft umrechnen soll. Meine Lehrer sind damals nicht auf die
Idee gekommen, mir die Newton-Temperaturskala beizubringen. ;-)
Joe F. schrieb:> Oder mit der Hand auf die Herdplatte drücken. Je höher die Temperatur,> desto geringer die Kraft.
Umgekehrt: Die Hand von jemandem auf die Herdplatte drücken. Je höher
die Temperatur, desto höher die Kraft, mit der er versuchst, die Hand da
wegzubekommen.
Rolf M. schrieb:> Meine Lehrer sind damals nicht auf die Idee gekommen, mir die> Newton-Temperaturskala beizubringen. ;-)
Meine Lehrer auch nicht. Und ich bin bisher überall in der Welt prima
ohne ausgekommen. Wikipedia wird wohl recht haben, wenn da als
Verbreitungsgebiet für Grad Newton angegeben ist: keineshttps://de.wikipedia.org/wiki/Newton-Skala