Как загрузить в FPU число без знака?

Тема в разделе "WASM.ASSEMBLER", создана пользователем AsmGuru62, 1 июн 2010.

  1. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1. hlt
    2.         stdcall AsmGuru62_i2f,$ffff'ffff,$ffff'ffff
    3.         push    ecx ebx eax
    4.         fld     tbyte[esp]
    5.  
    6.         stdcall AsmGuru62_i2f,$ffff'ffff,$7fff'ffff
    7.         push    ecx ebx eax
    8.         fld     tbyte[esp]
    9.  
    10.         stdcall AsmGuru62_i2f,$ffff'ffff,$3fff'ffff
    11.         push    ecx ebx eax
    12.         fld     tbyte[esp]
    13.  
    14.         stdcall AsmGuru62_i2f,$ffff'ffff,$0000'0000
    15.         push    ecx ebx eax
    16.         fld     tbyte[esp]
    17.  
    18.         stdcall AsmGuru62_i2f,$ffff'ffff,$0000'0001
    19.         push    ecx ebx eax
    20.         fld     tbyte[esp]
    21.  
    22.         stdcall AsmGuru62_i2f,0,0
    23.         push    ecx ebx eax
    24.         fld     tbyte[esp]
    25.  
    26.         stdcall AsmGuru62_i2f,1,0
    27.         push    ecx ebx eax
    28.         fld     tbyte[esp]
    29.  
    30.         stdcall AsmGuru62_i2f,65'535,0
    31.         push    ecx ebx eax
    32.         fld     tbyte[esp]
    33.  
    34.         add     esp,8*10
    35.         ret
    36.  
    37.  
    38.  
    39.  
    40. ;ecx:ebx:eax <- нормализированное int64
    41. ;edx         <- степень 2'х
    42. ;flags       <- ?
    43. proc AsmGuru62_i2f; int64.low, int64.high
    44.         mov     eax,[esp+4]         ;int64.low
    45.         mov     ebx,[esp+8]         ;int64.high
    46.         xor     edx,edx             ;степень 2'х
    47.         cmp     ebx,edx
    48.         jnz     .1                  ;int64.high<>0
    49.         cmp     eax,edx
    50.         jnz     .2                  ;int64.low<>0
    51.         mov     ecx,edx             ;ecx:ebx:eax=0.0
    52.         ret     8
    53. .2:     xchg    ebx,eax             ;частичная нормализация
    54.         sub     edx,32              ;учтем в показатель
    55. .1:     add     edx,63              ;припустим, кома за числом
    56.         bsr     ecx,ebx             ;проверим
    57.         neg     ecx                 ;показатель правильности припущения :), представьте, что bsr дал 31: легче так
    58.         add     ecx,31              ;-31+31=0 <- ничего двигать не надо, так легче
    59.         shld    ebx,eax,cl          ;окончательная нормализация
    60.         shl     eax,cl              ;...
    61.         neg     ecx                 ;учтем
    62.         lea     ecx,[$3fff+edx+ecx] ;$3fff+0..63
    63.         ret     8                   ;04:42
    64. endp
     
  2. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    "add esp,12" - для push ecx
    "add esp,10" - для push cx
    старшая половинка ecx=0=const