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: > ich habe folgenden Code zur Umwandlung von Fahrenheit nach > Newton Woher? Es gibt keinen Umrechnungsfaktor dafür. Georg
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
Fahrenheit to Newton http://www.metric-conversions.org/temperature/fahrenheit-to-newton.htm
1 | Fahrenheit |
2 | |
3 | Fahrenheit is a thermodynamic temperature scale, where the freezing point |
4 | of water is 32 degrees Fahrenheit (℉) and the boiling point 212℉ (at |
5 | standard atmospheric pressure). This puts the boiling and freezing points |
6 | of water exactly 180 degrees apart. Therefore, a degree on the Fahrenheit |
7 | scale is 1/180 of the interval between the freezing point and the boiling |
8 | point of water. Absolute zero is defined as -459.67℉. |
9 | |
10 | A temperature difference of 1℉ is the equivalent of a temperature difference 0.556℃. |
11 | |
12 | ºN = (℉ - 32)* 0.18333 |
13 | |
14 | |
15 | Newton |
16 | |
17 | The Newton scale was devised by Isaac Newton. He defined the "zeroth |
18 | degree of heat" as melting snow and "33 degrees of heat" as boiling water. |
19 | His scale is thus a precursor of the Celsius scale, being defined by the |
20 | same temperature references. Thus the unit of this scale, the Newton |
21 | degree, equals 100⁄33 Kelvin conversion or degrees Celsius and has the |
22 | same zero as the Celsius scale. |
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.
Unglaublich was hier manchmal abgeht. Manchmal traut man wirklich seinen Augen nicht.
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.
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
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.
S. R. schrieb: > Hausaufgaben. Auch dafür darf man die Aufgabe(n) sinnvoll stellen, also hier z.B. Fahrenheit nach Celsius :-)
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.
Wobei es einen Unterschied zwischen Newton und Grad Newton gibt. ;-)
S. R. schrieb: > Wobei es einen Unterschied zwischen Newton und Grad Newton gibt. ;-) Und um letztere geht es hier offensichtlich.
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. ;-)
:
Bearbeitet durch User
Heinz V. schrieb: > mit einem Bimetall? > SCNR Oder mit der Hand auf die Herdplatte drücken. Je höher die Temperatur, desto geringer die Kraft.
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: keines https://de.wikipedia.org/wiki/Newton-Skala
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.