Я пишу программу для вычисления квадратного уравнения на MASM, но есть проблема:программа нормально ничего не вычисляет, почему - немогу понять(в ассемблере я не очень) Если кто сможет заставить эту прогу работать то я был бы очень рад. P.S. Если у кого есть исходник квадратного уравнения на MASM то поделитесь пожайлуста,если не жалко Код (Text): invoke GetDlgItemInt,hWnd,Edit1ID,0,1;текст из Edit1 в регистр eax и отуда в sA mov sA,eax invoke GetDlgItemInt,hWnd,Edit2ID,0,1;Аналогично как и с Edit1 mov sB,eax invoke GetDlgItemInt,hWnd,Edit3ID,0,1 mov sC,eax mov sB,eax;т.к. mul требует чтобы один из множителей находился в eax mul sB;возводим sB в квадрат mov kv,eax;записывает результат в переменную kv mov eax,4;помещаем в eax число 4 mul sA;умножаем sA на 4 mul sC;и умножаем на sC (произведение sA и 4 в регистре eax) sub eax,kv;вычитаем из kv(здесь находится sB^2) произведение 4*sA*sC(находится в eax) mov Diskriminant,eax;Помещаем результат в Diskriminant .IF Diskriminant == 0;если дисриминант ноль то mov eax,-1;ставим перед sB минус умножив на -1 mul sB mov ebx,sB;помещаем sB в регистор ebx mov eax,2;2 в регистор eax mul sA;умножаем sA на 2 div sB;делим sB на sA invoke wsprintf,addr MyText,addr Format,eax;т.к. x1 = x2 то выводим значения в Edit4 и Edit5 invoke SetWindowText,hwndEdit4,addr MyText invoke SetWindowText,hwndEdit5,addr MyText .ENDIF .IF Diskriminant > 0;если дискриминант отличен от нуля то finit;инициализируем FPU fild Diskriminant;выбрали число из памяти fsqrt;получили квадратный корень fist result;записали результат в result mov eax,-1;ставим перед sB минус умножив на -1 mul sB mov ecx,eax mov ebx,sB;помещаем sB в регистор ebx mov eax,result sub eax,sB;из sB вычитаем result mov kv,eax;результат заносим в kv mov eax,2 mul sA;посчитаем 2*sA mov edx,eax div kv mov x1,eax invoke wsprintf,addr MyText,addr Format,eax invoke SetWindowText,hwndEdit4,addr MyText add result,ebx;sB складываем с result mov eax,edx div result mov x2,eax invoke wsprintf,addr MyText,addr Format,eax invoke SetWindowText,hwndEdit5,addr MyText .ENDIF .IF Diskriminant < 0 invoke MessageBox,hWnd,addr TextMessg,0,MB_ICONINFORMATION .ENDIF
;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
Blackbeam Квадратное уравнение -- решение, как правило, не в целых, а в вещественных числах. Проверяют не только дискриминант на отрицательность, а еще на равенство нулю коэффициентов А, В, С (Ах2+Вх+С=0) при А=0 решают линейное уравнение Вх+С=0 при В=0 Ах2+С=0 либо мнимые корни при A>0 C>0 либо x=sqrt(-A/C) либо x(Ax+B)=0 при С=0, либо нет решения при А=В=0, либо бесчисленное множество решений при А=В=С=0
Blackbeam я отправил S9 решение для ДОСа, с вводом выводом вещественного числа, но он разбираться не стал, а полез на ассемблерные сайты за готовым решением
Mikl___! Посмотрите WASM.ASSEMBLER. Эту тему S9 выставил 18.04.11, а 25.04 - здесь. Но 25.04 вечером я выложил ему решение на FPU, и он ушел переваривать. Чисто профессиональный вопрос, Вы решили задачу с применением FPU или использовали только CPU? Если посчитаете возможным, то пришлите Ваше решение и на мой адрес: pechatnikov@bk.ru. Если Вы решили с применением только CPU, то какой алгоритм вычисления квадратного корня Вы применили? Заранее благодарю. Как Вы относитесь к предложению открыть хотя бы тему, а может быть и большой раздел "Программирование на ассемблере вычислительных алгоритмов" ? Судя по Вашим собственным темам и по участиям Вас в других темах, это предложение должно заинтересовать Вас! Я с большим удовольствием поучаствовал бы в обсуждении многих тем из этого направления применения ассемблера.