Небольшой вопрос по FPU.

Тема в разделе "WASM.BEGINNERS", создана пользователем Black9_byte, 21 авг 2006.

  1. Black9_byte

    Black9_byte New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2006
    Сообщения:
    3
    Вот в чем суть вопроса - у меня в стеке сопроцесора есть число ,например,71262427,как мне его перевести в регистры общего назначения?а потом и в текст
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    что нить типа
    Код (Text):
    1. push eax
    2. fistp dword [esp]
    3. pop eax
    ну а в текст батенька ишем - тема не раз подымалась
     
  3. Black9_byte

    Black9_byte New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2006
    Сообщения:
    3
    Спасибо получилось..А вот с текстом пробелммы -в факах надыбал ссылочки на темы в форуме но они либо устарели либо стерты...
     
  4. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Black9_byte
    упрощенно так:
    -делиш в цикле на основание системы в которой надо,
    -остатки от деления переводиш в аски например так:
    Код (Text):
    1. cmp al, 0Ah
    2. sbb al, 69h
    3. das
    -записываеш остаток переведенный в аски в строку
    -когда в цикле получиш ноль выводиш строку задом на перед и все=)))
     
  5. Garthower

    Garthower New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2006
    Сообщения:
    9
    Вот перевод в хексы:
    Код (Text):
    1. HexToStr proc Buff:dword,Numm:dword ;Конвертит число в хекс-строку
    2.                     ;в EAX возвращает длинну скопированной
    3.                     ;строки
    4. local @@Buffer:byte:8
    5.  
    6.     pushad
    7.     pushfd
    8.  
    9.     mov ebx,Numm
    10.     bswap ebx
    11.     push 4
    12.     pop ecx
    13.     lea edi,@@Buffer
    14.     push edi
    15.   @@Next_Byte:
    16.     mov al,bl
    17.     mov ah,al
    18.     shr al,4
    19.     add al,90h
    20.     daa
    21.     adc al,40h
    22.     daa
    23.     stosb
    24.  
    25.     mov al,ah
    26.     and al,0Fh
    27.     add al,90h
    28.     daa
    29.     adc al,40h
    30.     daa
    31.     stosb
    32.     shr ebx,8
    33.     loop @@Next_Byte
    34.     pop edi
    35.  
    36.     mov al,'0'
    37.     push 8
    38.     pop ecx
    39.     bt Status,0
    40.     jc @@No_Scasb
    41.  
    42.     rep scasb
    43.     dec edi
    44.     inc ecx
    45.   @@No_Scasb:
    46.     mov [esp+1Ch+4],ecx
    47.     mov esi,edi
    48.     mov edi,Buff
    49.     rep movsb
    50.     xor al,al
    51.     stosb
    52.  
    53.     popfd
    54.     popad
    55.     ret
    56. HexToStr endp
    Вот в десятичные:
    Код (Text):
    1. DecToStr proc Buf1:dword,Num1:dword ;Конвертит число в дец-строку
    2.                     ;в EAX возвращает длинну скопированной
    3.                     ;строки
    4. local @@Buffer:byte:10,@@Number:dword,@@Buffer1:byte:20
    5.  
    6.     pushad
    7.     pushfd
    8.  
    9.     mov eax,Num1
    10.     lea ebx,@@Number
    11.     mov [ebx],eax
    12.     lea esi,@@Buffer
    13.  
    14.     fild 4 ptr [ebx]
    15.     fbstp 10 ptr [esi]
    16.  
    17.     lea edi,@@Buffer1
    18.     push 10
    19.     pop ecx
    20.     push edi
    21.     add esi,9
    22.   @@Next_Convert:
    23.     std
    24.     lodsb
    25.     mov ah,al
    26.     shr al,4
    27.     or al,30h
    28.     cld
    29.     stosb
    30.     mov al,ah
    31.     and al,0Fh
    32.     or al,30h
    33.     stosb
    34.     loop @@Next_Convert
    35.     pop edi
    36.  
    37.     mov al,'0'
    38.     push 20
    39.     pop ecx
    40.     bt Status,1
    41.     jc @@No_Scasb
    42.  
    43.     rep scasb
    44.     dec edi
    45.     inc ecx
    46.   @@No_Scasb:
    47.     mov [esp+1Ch+4],ecx
    48.     mov esi,edi
    49.     mov edi,Buf1
    50.     rep movsb
    51.     xor al,al
    52.     stosb
    53.  
    54.     popfd
    55.     popad
    56.     ret
    57. DecToStr endp
     
  6. Black9_byte

    Black9_byte New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2006
    Сообщения:
    3
    Garthower
    Спасибо конечно.Но эти процедуру случаем не на TASM'e?А то мазм принимать не хочет...
     
  7. Garthower

    Garthower New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2006
    Сообщения:
    9
    Да, они скомпилены на TASM'е. Для успешной компиляции на MASM'е тебе изменить всего пару вещей - MASM'ское описание процедур и локальных переменных плюс заменить выражения типа "fild 4 ptr [ebx]" на "fild dword ptr [ebx]". Цифра в такой записи обозначает размер операнда работы с памятью. 1 = byte, 2 - word, 4 - dword, 8 - qword, 10 - tbyte. А сам код менять не надо.
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    А что, TASM такое:
    ест? Не знал, всегда писал dword ptr :dntknw:
     
  9. Garthower

    Garthower New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2006
    Сообщения:
    9
    Да, ещё как ест :) Начиная с версии TASM 3.2
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    tasm пытается есть всё, что ест масм, но это зачастую оканчивается несварением ;) Потом ещё насм имеет ключик для подражания тасму, но с кучей ограничений. А фасм вообще через макросы всё что угодно кушает. Поэтому так сразу и не скажешь на чём этот код написан.