Бесконечный цикл при работе с FPU. Помогите правильно реализовать.

Тема в разделе "WASM.ASSEMBLER", создана пользователем vitalik, 6 дек 2009.

  1. vitalik

    vitalik New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2009
    Сообщения:
    5
    Программа написана при помощи компилятора Radasm.
    Задание
    Реализовать проверку достоверности математического выражения с использованием сопроцессора для 100 значений в промежутке от 0 до 2pi.
    [​IMG]
    Значения проверяются правильно, только я попадаю в бесконечный цикл проверки. Использовать для реализации цикла loop не могу (ошибка компилятора при прыжке на 28 строчек), а цикл .while выдает бред. Пожалуйста, помогите.
    Код
    Код (Text):
    1. .386
    2. .387
    3. .model flat,stdcall
    4. option casemap:none
    5. include FPU_Lab.inc
    6. .data
    7. t dq 2.0
    8. a dq 0.0
    9. b dq 0.0
    10. rpt dq 100.0
    11. .data?
    12. rez dq ?
    13. .code
    14. start:
    15. invoke Main
    16. invoke ExitProcess,0
    17. Main Proc
    18.    
    19.     invoke ClearScreen
    20.     finit
    21.     fldpi ;pi
    22.     fldpi ;pi,pi
    23.     fadd ;2*pi
    24.     fdiv rpt
    25.     fstp rez
    26.     mov ecx,5
    27.     .while (ecx!=0)
    28.     fld a ;a
    29.     fcos; cos(a)
    30.     fld b;b,cos(a)
    31.     fcos ;cos(b),cos(a)
    32.     fadd ;cos(b)+cos(a)
    33.     fld a;a,cos(b)+cos(a)
    34.     fld b;b,a,cos(b)+cos(a)
    35.     fadd;b+a,cos(b)+cos(a)
    36.     fld t;t,b+a,cos(b)+cos(a)
    37.     fdiv;(b+a)/2),cos(b)+cos(a)
    38.     fcos;cos(b+a)/2),cos(b)+cos(a)
    39.     fld a;a,cos(b+a)/2),cos(b)+cos(a)
    40.     fld b;b,a,cos(b+a)/2),cos(b)+cos(a)
    41.     fsub;a-b,cos(b+a)/2),cos(b)+cos(a)
    42.     fld t;t,a-b,cos(b+a)/2),cos(b)+cos(a)
    43.     fdiv;(a-b)/t,cos(b+a)/2),cos(b)+cos(a)
    44.     fcos;cos((a-b)/t),cos(b+a)/t),cos(b)+cos(a)
    45.     fmul;cos((a-b)/t)*cos(b+a)/t),cos(b)+cos(a)
    46.     fld t;t,cos((a-b)/t)*cos(b+a)/t),cos(b)+cos(a)
    47.     fmul;2*cos((a-b)/2)*cos(b+a)/2),cos(b)+cos(a)
    48.     fcomp
    49.     fstsw ax
    50.     sahf
    51.     .if ZERO?
    52.     invoke MessageBox,0,$CTA0("Equal"),0,MB_OK
    53.     .else
    54.       invoke MessageBox,0,$CTA0("NOT equal"),0,MB_OK
    55. .endif
    56.  fld a ;a
    57.  fld b ;b,a
    58.  fadd rez ;b+rez,a
    59.  fstp b ;a
    60.  fadd rez; a+rez
    61.  fstp a ;bye :)
    62.         dec ecx
    63. .endw
    64.       ret
    65. Main endp
    66. end start
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    м.б MessageBox затирает ecx?
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    вместо ecx используйте ebx, MessageBox его не затирает.
     
  4. vitalik

    vitalik New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2009
    Сообщения:
    5
    Да не должен вроде как. Была лаба, где он у меня в цикле классно работал. Мистика :rolleyes
     
  5. vitalik

    vitalik New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2009
    Сообщения:
    5
    Ураааа! Заработало! Ну что это за фигня, а? Все знают, что это регистр-счетчик. Зачем его трогать? Что там мелкомягкие думали?
     
  6. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    vitalik

    API-функции не затирают только ebx,esi,edi и ebp - остальные регистры будут затёрты.
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    vitalik
    stdcall :)

    если с loop, то просто укладывай ecx в стек перед мессаджбоксом, а после - извлекай
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    vitalik
    Ну просто некошерно не выругать мелкомягких. :) А между тем у пингвинов точно так же - ecx is scratch register. :):)
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    winapi засирает вам регистры ??? - оберните их вызов в отдельную функцию с push ECX и pop ECX
    никто же не пытается использовать loop и rep непосредственно вместе
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    mymessage proc
    push ecx

    .if ZERO?
    invoke MessageBox,0,$CTA0("Equal"),0,MB_OK
    .else
    invoke MessageBox,0,$CTA0("NOT equal"),0,MB_OK
    .endif
    pop ecx
    mymessage endp

    все остальное сами допишите