Forum: Mikrocontroller und Digitale Elektronik Assembler: Fahrenheit nach Newton


von Peter93 (Gast)


Lesenswert?

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!

von Georg (Gast)


Lesenswert?

Peter93 schrieb:
> ich habe folgenden Code zur Umwandlung von Fahrenheit nach
> Newton

Woher? Es gibt keinen Umrechnungsfaktor dafür.

Georg

von Peter93 (Gast)


Lesenswert?

Georg schrieb:
> Umrechnungsfaktor

Algorithmus:  Newton = (11 * Fahrenheit - 352) / 60

von Wolfgang (Gast)


Lesenswert?

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.

von Heinz V. (heinz_v)


Lesenswert?

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

von Kaj (Gast)


Lesenswert?

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.

von Peter93 (Gast)


Lesenswert?

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?

von Heinz V. (heinz_v)


Lesenswert?

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.

von Achim S. (Gast)


Lesenswert?

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.

von Peter93 (Gast)


Lesenswert?

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?

von Peter93 (Gast)


Lesenswert?

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.

von Heinz V. (heinz_v)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

reine vermutung, ohne den code im detail zu verstehen: evtl. ist das 
nötig um die nachkommastellen von negativen newton temperaturen korrekt 
zu berechnen?

von my2ct (Gast)


Lesenswert?

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.

von Föhnaufsteher (Gast)


Lesenswert?

Unglaublich was hier manchmal abgeht.

Manchmal traut man wirklich seinen Augen nicht.

von Achim S. (Gast)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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

von Carl D. (jcw2)


Lesenswert?

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.

von Achim S. (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

S. R. schrieb:
> Hausaufgaben.

Auch dafür darf man die Aufgabe(n) sinnvoll stellen, also hier z.B. 
Fahrenheit nach Celsius :-)

von Heinz V. (heinz_v)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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. ;-)

von c-hater (Gast)


Lesenswert?

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

von W.A. (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

Wobei es einen Unterschied zwischen Newton und Grad Newton gibt. ;-)

von Wolfgang (Gast)


Lesenswert?

S. R. schrieb:
> Wobei es einen Unterschied zwischen Newton und Grad Newton gibt. ;-)

Und um letztere geht es hier offensichtlich.

von Rolf M. (rmagnus)


Lesenswert?

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
von Heinz V. (heinz_v)


Lesenswert?

Rolf M. schrieb:
> wie man eine Temperatur in eine
> Kraft umrechnen soll.

mit einem Bimetall?
SCNR

von Joe F. (easylife)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.