Квадратное уравнение

Тема в разделе "WASM.ASSEMBLER", создана пользователем S9, 17 апр 2011.

  1. S9

    S9 Сергей

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    6
    Адрес:
    Саратов 64
    Я пишу программу для вычисления квадратного уравнения на MASM, но есть проблема:программа нормально ничего не вычисляет, почему - немогу понять(в Assembler я нуб ) :dntknw: Если кто сможет заставить эту прогу работать то я был бы очень рад.
    P.S. Если у кого есть исходник квадратного уравнения на MASM то поделитесь пожайлуста,если не жалко
    Код (Text):
    1. invoke  GetDlgItemInt,hWnd,Edit1ID,0,1;текст из Edit1 в регистр eax и отуда в sA
    2. mov sA,eax
    3. invoke  GetDlgItemInt,hWnd,Edit2ID,0,1;Аналогично как и с Edit1
    4. mov sB,eax
    5. invoke  GetDlgItemInt,hWnd,Edit3ID,0,1
    6. mov sC,eax
    7. mov sB,eax;т.к. mul требует чтобы один из множителей находился в eax
    8. mul sB;возводим sB в квадрат
    9. mov kv,eax;записывает результат в переменную kv
    10. mov eax,4;помещаем в eax число 4
    11. mul sA;умножаем sA на 4
    12. mul sC;и умножаем на sC (произведение sA и 4 в регистре eax)
    13. sub eax,kv;вычитаем из kv(здесь находится sB^2) произведение 4*sA*sC(находится в eax)
    14. mov Diskriminant,eax;Помещаем результат в Diskriminant
    15. .IF Diskriminant == 0;если дисриминант ноль то
    16. mov eax,-1;ставим перед sB минус умножив на -1
    17. mul sB
    18. mov ebx,sB;помещаем sB в регистор ebx
    19. mov eax,2;2 в регистор eax
    20. mul sA;умножаем sA на 2
    21. div sB;делим sB на sA
    22. invoke  wsprintf,addr MyText,addr Format,eax;т.к. x1 = x2 то выводим значения в Edit4 и Edit5
    23. invoke  SetWindowText,hwndEdit4,addr MyText
    24. invoke  SetWindowText,hwndEdit5,addr MyText
    25. .ENDIF
    26. .IF Diskriminant > 0;если дискриминант отличен от нуля то
    27. finit;инициализируем FPU
    28. fild Diskriminant;выбрали число из памяти
    29. fsqrt;получили квадратный корень
    30. fist result;записали результат в result
    31. mov eax,-1;ставим перед sB минус умножив на -1
    32. mul sB
    33. mov ecx,eax
    34. mov ebx,sB;помещаем sB в регистор ebx
    35. mov eax,result
    36. sub eax,sB;из sB вычитаем result
    37. mov kv,eax;результат заносим в kv
    38. mov eax,2
    39. mul sA;посчитаем 2*sA
    40. mov edx,eax
    41. div kv
    42. mov x1,eax
    43. invoke wsprintf,addr MyText,addr Format,eax
    44. invoke SetWindowText,hwndEdit4,addr MyText
    45. add result,ebx;sB складываем с result
    46. mov eax,edx
    47. div result
    48. mov x2,eax
    49. invoke wsprintf,addr MyText,addr Format,eax
    50. invoke SetWindowText,hwndEdit5,addr MyText
    51. .ENDIF
    52. .IF Diskriminant < 0
    53. invoke MessageBox,hWnd,addr TextMessg,0,MB_ICONINFORMATION
    54. .ENDIF
     
  2. S9

    S9 Сергей

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    6
    Адрес:
    Саратов 64
    Если кому исходник не жалко, то киньте на мыло sss1992@mail.ru
    Заранее СПС)
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Код (Text):
    1. mov sC,eax
    2. mov sB,eax;т.к. mul требует чтобы один из множителей находился в eax
    3. mul sB;возводим sB в квадрат
    Вторая строчка копирует в sB значение из eax, т.е. то же, что и в sC.
    Дальше не читал, т.к. уже ошибка.

    PS
    Тему надо в WASM.BEGINNERS.
     
  4. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    S9 : приятно иметь дело с самокритичным и понимающим ситуацию человеком! Вы действительно тот, кем себя назвали! Но это не Ваша вина, а Ваше горе. А тому у кого горе надо, по возможности, помогать.
    Современных пособий программирования на ассемблере вычислительных задач, изданных серьезными тиражами, - НЕТ! Пользоваться старыми довольно сложно, но можно. Однако их надо еще найти.
    Ваша программа не работоспособна по многим причинам. Вот некоторые из них:
    Вы смешиваете в кучу числовые данные беззнаковые и знаковые;
    Для Вас нет разницы в представлении данных в формате фиксированной запятой и плавающей;
    Вы не узучили особенности выполнения операций умножения и деления знаковых числовых данных в системе команд ix86;
    Усли Вы желаете написать программу без применения FPU, то Вам следует, кроме исправления ошибок, перечисленных выше, хорошо изучить численные методы вычисления квадратного корня.
    Ваша задача легко решается с применением команд FPU. В этом случае ее решение очень похоже на решение на Паскале (во многих примитивных пособиях есть подобные примеры).
    Не отчаивайтесь, успехов Вам на избранном поприще!

    Согласен с qwe8013 необходимо открыть в WASM.BEGINNERS тему "Вычислительные задачи на ассемблере"
     
  5. S9

    S9 Сергей

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    6
    Адрес:
    Саратов 64
    1212
    Во-первых, если не знаете как помочь, то зачем писать всякую хрень?
    Во-вторых, я специализируюсь на Delphi

    З.Ы.1212 если с помощью FPU так легко сделать, то сделайте. Я буду очень благодарен
     
  6. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    S9:
    "Вполне понять человека могут только равные ему или выше его" - Марк Аврелий 121-180 г. н.э

    В прилагаемом файле - решение Вашей задачи с помощью FPU. Для отрицательного дискриминанта решение не предусмотрено.
    Решение под MS DOS, для экономии "бумаги". Потратил аж 1,5 часа. Желаю успехов!
     
  7. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    В торопях забыл прикрипить файл, прошу простить!
     
  8. S9

    S9 Сергей

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    6
    Адрес:
    Саратов 64
    Спасибо большое. Сейчас буду переделывать на MASM