Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
05.08.2002, 16:05
Diablo_bth



an alle ASM-Freaks unter euch:

wie sicherlich allgemein bekannt ist, kann mit dem FPU ControlWord
z.B. das Rundungsverhalten zu Ganzzahlen eingestellt werden. Dies
sieht z.B. bei der Implementierung der funktion floor() [also eine
Gleitkommazahl komplett nach dem Punkt abrunden] folgendermaßen
aus:

Quellcode:
__forceinline static
__declspec( naked ) float __fastcall
_floorf( float )
{
  __asm {
    fld     dword ptr [esp+4]     ; float-Parameter (4 Bytes) nach st0 laden
    fstcw   word ptr [esp+4]      ; FPU ControlWord abspeichern (2 Bytes)
    mov     ax, word ptr [esp+4]  ; ControlWord nach ax
    or      ah, 0Ch               ; ControlWord ändern
    mov     word ptr [esp+6], ax  ; geändertes ControlWord abspeichern
    fldcw   word ptr [esp+6]      ; geändertes ControlWord laden
    frndint                       ; st0 abrunden
    fldcw   word ptr [esp+4]      ; altes ControlWord wiedererstellen
    ret     4                     ; zurückgehen
  }
}

/*
             ah          al
   027Fh: 0000 0010 | 0111 1111 ==> altes ControlWord
or 000Ch:      1100
   ----------------------------
   0e7fh: 0000 1110 | 0111 1111 ==> neues ControlWord

*/

wie das ControlWord geändert werden muss habe ich einfach beim Dissaembling
von float -> long beobachtet.

Mine Frage: wie muss ich das ControlWord für eine implementierung der ceil()-Funktion
ändern?

--

zum Seitenanfang zum Seitenende Profil || Suche
001
05.08.2002, 16:20
Tron



ich wuerde sagen bits 10+11 auf 10 setzen.
ein hoch auf google... http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_14/CH14-3.html

imho stimmt etwas mit dieser floor funktion nicht, die schneidet die nachkommastellen ab (runden gegen 0) anstatt gegen -infinity zu runden (bits 10+11 auf 01)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
002
05.08.2002, 19:04
Diablo_bth



@Tron: jo danke für den Link - das is genau das was ich suche!

aber was ist an meiner floor-Finktion falsch? Wie ich gerade lese steht ein "11" für die bits 10+11 für "Truncate result" -> also "abschneiden" steht und es funtzt außerdem perfekt.

Aber andererseits empfinde ich meine Methode - einfach die vier Bytes des Parameters zu überschreiben - als unschön. Irre ich mich da oder kann ich das so lassen?

--

zum Seitenanfang zum Seitenende Profil || Suche
003
05.08.2002, 20:35
Tron



floor rundet (imho) gegen minus unendlich, truncate rundet aber gegeb 0
also:
floor(2.7) == 2; truncate(2.7) == 2;
aber
floor(-2.7) == -3; truncate(2.7) == -2;

du ueberschreibst doch keine bits (net bytes)
du setzt (flags | zu_setzende_bits) oder loeschst (flags | ~zu_loeschende_bits) die entsprechenden flags, was ist daran unschoen? so setzt und loescht man flags...

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche