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

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

  1. S9

    S9 Сергей

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    6
    Адрес:
    Саратов 64
    Я пишу программу для вычисления квадратного уравнения на MASM, но есть проблема:программа нормально ничего не вычисляет, почему - немогу понять(в ассемблере я не очень) Если кто сможет заставить эту прогу работать то я был бы очень рад.
    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. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    ;mov eax,4;помещаем в eax число 4
    ;mul sA;умножаем sA на 4
    ;mul sC;и умножаем на sC (произведение sA и 4 в регистре eax)

    mov eax, sa_
    shl eax, 2 ; умножаем на 4
    imul eax, sc_

    ; лучше все переменные поместить в регистры, в любом случае их надо обозвать подлиннее
    ; esi, edi, ecx - можно использовать если нет строковых команд + ebx,edx

    ; деление - написши на бумашке и повесь на стенку

    mov eax, var1
    mov ecx, var2
    xor edx, edx
    div ecx

    ; в eax var1: var2 , в едх остаток

    shr eax,1 ; делим на 2
    shr eax,2 ; делим на 4
    ........
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ; микродебаггер:

    .data

    lpFmt db "%d",0

    .data ?

    buffer1 db 256 dup (?)
    buffer2 db 256 dup (?)

    .code

    invoke wsprintf,addr buffer1,addr lpFmt, (REG) ; суёшь куда надо и смотришь что в (REG)

    invoke MessageBox,0,addr buffer1,addr buffer2,MB_OK


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    IDE для масма:

    http://blackbeam.narod.ru/asm.htm
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    Blackbeam
    Квадратное уравнение -- решение, как правило, не в целых, а в вещественных числах. Проверяют не только дискриминант на отрицательность, а еще на равенство нулю коэффициентов А, В, С (Ах2+Вх+С=0)
    при А=0 решают линейное уравнение Вх+С=0 при В=0 Ах2+С=0 либо мнимые корни при A>0 C>0 либо x=sqrt(-A/C) либо x(Ax+B)=0 при С=0, либо нет решения при А=В=0, либо бесчисленное множество решений при А=В=С=0
     
  4. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    сложная задача для начинаюсчего

    пусть смотрит исходники с OpenGL на масме
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.874
    Blackbeam
    я отправил S9 решение для ДОСа, с вводом выводом вещественного числа, но он разбираться не стал, а полез на ассемблерные сайты за готовым решением
     
  6. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    Mikl___!
    Посмотрите WASM.ASSEMBLER.
    Эту тему S9 выставил 18.04.11, а 25.04 - здесь. Но 25.04 вечером я выложил ему решение на FPU, и он ушел переваривать.
    Чисто профессиональный вопрос, Вы решили задачу с применением FPU или использовали только CPU? Если посчитаете возможным, то пришлите Ваше решение и на мой адрес: pechatnikov@bk.ru. Если Вы решили с применением только CPU, то какой алгоритм вычисления квадратного корня Вы применили?
    Заранее благодарю.

    Как Вы относитесь к предложению открыть хотя бы тему, а может быть и большой раздел "Программирование на ассемблере вычислительных алгоритмов" ? Судя по Вашим собственным темам и по участиям Вас в других темах, это предложение должно заинтересовать Вас! Я с большим удовольствием поучаствовал бы в обсуждении многих тем из этого направления применения ассемблера.