Kommazahlen in Assembler



  • Hallo, die Kommazahl 2.3 wird als 0x40133333 im Debugger angezeigt.
    Wie werden Kommazahlen in Hexzahlen umgerechnet? Ich kenne das bisher nur mit gerade Werten.

    Btw. dobule num =2.3; erzeugt bei mir:

    0040116E  |. C745 F8 666666>MOV DWORD PTR SS:[EBP-8],66666666
    00401175  |. C745 FC 666602>MOV DWORD PTR SS:[EBP-4],40026666
    
    float num = 2.3; erzeugt: MOV DWORD PTR SS:[EBP-4],40133333
    




  • Wie werden Kommazahlen in Hexzahlen umgerechnet? Ich kenne das bisher nur mit gerade Werten.

    Hallo,

    du musst zuerst in Binär umwandeln. Von da an nach Hex.
    Wenn du nicht zurecht kommst, melde dich nochmal...

    Gruß, Nicky



  • Halo ich hab schon rum gegoogelt aber keine Erklärung gefunden die mir weiter hilft. Ich bräuchte mal ein ausführliches Beispiel wie man das rechnet.

    Dezimal nach Binär und Hex etc. das kann ich ja. Aber wie das mit dem Kommastellen geht weiss ich nicht.

    Ich probier schon ein paar Tage rum jedoch ohne Erfolg.





  • Danke für den Link aber den hatte ich glaub ich auch schon.

    Aber hier komme ich nicht weiter:

    3. Normalisieren
    10010,011001100... * 2^0 = 1,0010011001100... * 2^4

    Wieso ist: 10010,011001100 * 2^0 = 1,0010011001100 ?

    2^0= 1
    x*1=x



  • Das steht in dem Link:

    3. Normalisieren
    10010,011001100... * 2^0 = 1,0010011001100... * 2^4



  • Das ist einfach eine Kommaverschiebung. Das ist wie im Dezimalsystem:

    12345 * 10^0 = 1,2345 * 10^4
    oder vielleicht verständlicher geschrieben:
    12345 * 1 = 1,2345 * 10000



  • Dezimal leuchtet mir das ein aber Binär kann ich das nicht nachvollziehen.

    Ich würde jetzt einfach sagen:

    10010,011001100 = 1,0010011001100 weil die Kommazahl ist 18,4

    Und wenn ich bei: 10010,011001100 4 (4 weil die Zahl hinter dem Kommae eine 4 ist [18,4] ) Stellen nach Links gehe lande ich bei 1,0010011001100

    Oder ist das sogar die Lösung?

    Aber ich habe auch mal geschaut was in den nächsten Schritten so steht, und ich sehe nicht wo da was von der Normalisierung verwendet wird.

    Z.b. Schritt 6. Die Gleitkommazahl bilden:

    00100110011001100110011 <-- Und woher nehmen die die Zahl ?

    Und laut diese Rechner: http://babbage.cs.qc.edu/IEEE-754/
    Ist die Zahl: 01000001100100110011001100110011 in Dezimal: 1.100165939E9
    und nicht 18,4

    Das ist alles verwirrend ...

    Eine Erklärung wo jeder kleine Schritt beschrieben ist das wäre mal was.



  • float_asm schrieb:

    Dezimal leuchtet mir das ein aber Binär kann ich das nicht nachvollziehen.

    Es ist einfach so, dass man durch die Multiplikation mit der Basis das Komma um eine Stelle verschiebt. Ist vielleicht ganz anschaulich wenn man sich mal überlegt wie die schriftliche Multiplikation mit 2 also binär 10 aussieht.

    float_asm schrieb:

    Ich würde jetzt einfach sagen:

    10010,011001100 = 1,0010011001100 weil die Kommazahl ist 18,4

    Und wenn ich bei: 10010,011001100 4 (4 weil die Zahl hinter dem Kommae eine 4 ist [18,4] ) Stellen nach Links gehe lande ich bei 1,0010011001100

    Oder ist das sogar die Lösung?

    Aber ich habe auch mal geschaut was in den nächsten Schritten so steht, und ich sehe nicht wo da was von der Normalisierung verwendet wird.

    Z.b. Schritt 6. Die Gleitkommazahl bilden:

    00100110011001100110011 <-- Und woher nehmen die die Zahl ?

    Die 4 wurde gewählt, weil man das Komma um 4 Stellen verschieben will. Das Ziel der Normalisierung ist es die Zahl in Form 1,... zu haben. Da vorne dann immer eine 1 steht, braucht man sie nicht mehr mitspeichern. Die Zahl die in Schritt 6 verwendet wird, ist dementsprechend das was hinter dem Komma steht. Ist im Kommentar ja auch erklärt.

    float_asm schrieb:

    Und laut diese Rechner: http://babbage.cs.qc.edu/IEEE-754/
    Ist die Zahl: 01000001100100110011001100110011 in Dezimal: 1.100165939E9
    und nicht 18,4

    Der Rechner wandelt soweit ich gesehen habe nicht aus der IEEE 754 in eine Dezimalzahl. Hab auf die schnelle da auch keinen anderen gefunden. Wenn du aber 18.4 eingibst, sieht du das das gleiche Ergebnis rauskommt.



  • Hallo,

    also ich fang mal von vorn an...

    Das musst du dir merken:
    1. Aufbau einer Float (32bit)

    0 00000000 00000000000000000000000

    ganz links das Vorzeichen, dann 8Bit Exponent und 23bit Mantisse.
    Das Vorzeichen sollte klar sein.
    Der Exponent gibt an wieviel Stellen das Komma verschoben werden soll.
    In der Mantisse steht der genaue Wert.

    Ganz wichtig und unsichtbar ist der BIAS Wert. Der ist bei 32 bit immer 127!!

    Beispiel Zahl 1,0

    O OIIIIIII OOOOOOOOOOOOOOOOOOOOOOO = 1.0

    Vorzeichen = 0 also positiv
    Exponent = 127 minus den BIAS (127) = 0 = das Komma wird nicht verschoben!

    Nun suchst du aber den Wert 1 in der Mantisse 😃

    vor der Mantisse steht eine unsichtbare 1 und zwischen der unsichtbaren 1 und den 23 Nullen seht das unsichtbare Komma. Also sieht die Mantisse so aus:

    0 01111111 1,00000000000000000000000 = 1,0

    Noch eins mit 2,0:

    O IOOOOOOO OOOOOOOOOOOOOOOOOOOOOOO = 2.0

    Vorzeichen 0 = positive Zahl
    Exponent = 128 - BIAS (127) = 1 also eine Kommastelle verschieben!
    Wieder vor die Mantisse die 1 setzen und das Komma und eine Stelle nach rechts:

    0 10000000 10,0000000000000000000000 = 2.0
    Es zählt nur die Zahl vor dem Komma in der Mantisse = 00000010

    Nun noch eins:

    O IOOOOIOI OOOOOOOOOOOOOOOOOOOOOOO = 64.0

    Vorzeichen = 0 also positiv
    Exponent = 133 - BIAS (127) = 6, also 6 Stellen nach rechts!
    Wieder die unsichtbare 1 vor der Mantisse dann das Komma:

    0 10000101 1000000,00000000000000000 = 64.0
    Die Zahl vor dem Komma in der Mantisse ist 0100000!

    Nun eins mit Nachkommastellen:

    0 10000010 00110000000000000000000 = 9.5
    Vorzeichen = 0 also positiv
    Exponent = 130 - BIAS (127) = 3 also 3 Kommastellen nach rechts!

    Unsichtbare 1 nicht vergessen!!

    0 10000010 1001,1000000000000000000 = 9.5
    Nun wirds interessant. Vor dem Komma steht nun 00001001 = 9
    Nach dem Komma steht der Wert 1.
    Hier ist es binär gesehen genau verkehrt rum. Mit jeder Zahl nach rechts halbiert sich ihr Wert!
    Die 1 nach dem Komma hat den Wert 0,5. Neun + 0,5 = 9,5.

    Hier nochmal fast die gleiche nur eine eins nach dem Komma mehr:
    0 10000010 1001,1100000000000000000 = 9.75

    Vor dem Komma wieder 00001001 = 9
    Nach dem Komma 11 = die erste 1 hat den Wert 0,5 und die zweite den Wert 0,25
    (die drittee hätte 0,125 die vierte 0,0625 usw...)

    Im Grunde ganz einfach...

    Bei 64 Bit Zahlen ist lediglich der BIAS anders (1024) glaub ich.

    hier noch mal eine Übersicht, so hab ich das gelernt:

    O OIIIIIII OOOOOOOOOOOOOOOOOOOOOOO ==== 1.0

    O OIIIIIII IOOOOOOOOOOOOOOOOOOOOOO ==== 1.5

    O IOOOOOOO OOOOOOOOOOOOOOOOOOOOOOO ==== 2.0

    O IOOOOOOI OOOOOOOOOOOOOOOOOOOOOOO ==== 4.0

    O IOOOOOIO OOOOOOOOOOOOOOOOOOOOOOO ==== 8.0

    O IOOOOOIO OOOIIIIIIOIOIIIOOOOIOIO ==== 8.99

    0 10000010 00110000000000000000000 ==== 9.5

    O IOOOOOII OOOOOOOOOOOOOOOOOOOOOOO ==== 16.0

    O IOOOOIOO OOOOOOOOOOOOOOOOOOOOOOO ==== 32.0

    O IOOOOIOI OOOOOOOOOOOOOOOOOOOOOOO ==== 64.0

    O IOOOOIIO OOOOOOOOOOOOOOOOOOOOOOO ==== 128.0

    O IOOOOIII OOOOOOOOOOOOOOOOOOOOOOO ==== 256.0

    O IOOOIOOO OOOOOOOOOOOOOOOOOOOOOOO ==== 512.0

    O IOOOOIIO IIOOOOIIOOOOOOOOOOOOOOO ==== 225.5

    O IOOOIOOI OOOOOOOOOOOOOOOOOOOOOOO ==== 1024.0

    O IOOOIOIO OOOOOOOOOOOOOOOOOOOOOOO ==== 2048.0
    O IOOOIOIO OOOOOOOOOOOOOOOIIOOIIOI ==== 2048.05

    Gruß

    Nicky 👍



  • Beispiel Zahl 1,0

    O OIIIIIII OOOOOOOOOOOOOOOOOOOOOOO = 1.0

    Vorzeichen = 0 also positiv
    Exponent = 127 minus den BIAS (127) = 0 = das Komma wird nicht verschoben!

    Nun suchst du aber den Wert 1 in der Mantisse

    vor der Mantisse steht eine unsichtbare 1 und zwischen der unsichtbaren 1 und den 23 Nullen seht das unsichtbare Komma. Also sieht die Mantisse so aus:

    0 01111111 1,00000000000000000000000 = 1,0

    Danke für deine Beispiele, ich denke damit könnte ich es verstehen.
    Aber eine Frage hab ich noch:

    Woher weiss ich z.b. bei 1,0 das der Exponent 127 ist? (Ok, ich kanns aus deinem Beispiel ablesen OIIIIIII aber das ist ja nicht sinn der Sache^^)

    Wie berechnet man den Exponenten?



  • float_asm schrieb:

    Danke für deine Beispiele, ich denke damit könnte ich es verstehen.
    Aber eine Frage hab ich noch:

    Woher weiss ich z.b. bei 1,0 das der Exponent 127 ist? (Ok, ich kanns aus deinem Beispiel ablesen OIIIIIII aber das ist ja nicht sinn der Sache^^)

    Wie berechnet man den Exponenten?

    Hallo,

    Weil der BIAS immer 127 ist... dann muss der Exponent auch 127 sein,
    da 127 - 127 = 0 ist.

    Der Exponent legt damit fest, daß das Komma um 0 Stellen verschoben wird.

    Gruß, Nicky



  • nochmal ich..

    der Exponent wird nicht berechnet. Er ergibt sich aus der Verschiebung des Kommas und dem BIAS.

    Wenn du die Zahl 5,5 als Float darstellen willst kannst du das auch sorum rechnen.

    5 = 00000101

    Dein Komma steht nun hinter der 101,

    Da bei den IEEE Zahlen immer nur eine Zahl vor dem Komma stehen darf musst du es zwei Stellen nach links schieben.

    BIAS + 2 = 129, dann ist der Exponent = 129 = 10000001
    Die Nachkommastelle (5) ist nur eine 1 hinter der 101 also 101,1.
    Nun zwei Stellen nach links bleibt 1,011.
    Die vordere 1 wird ja nicht angezeigt und entfällt hierbei.

    0 10000001 01100000000000000000000 = Float 5,5

    Gruß, Nicky



  • Danke das du nochmal geantwortet hast. Jetzt konnte ich auch alle Beispiele nachvollziehen. Bis auf die 9,5 da hab ich mich noch nicht dran versucht aber das kommt Morgen. 🙂


Anmelden zum Antworten