Assembler: Fahrenheit nach Newton

Gast #4731276
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!
Gast #4731296
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.
Gast #4731298
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?
Gast #4731312
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.
Gast #4731322
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?
Gast #4731326
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.
Gast #4731392
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.
Gast #4731520
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.
#4731620
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.
Gast #4731787
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.
#4731794
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.
Gast #4731812
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...
Gast #4731822
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren