Помогите кто чем может. Нужно написать на ассемблере прогу находящую корни квадратного уравнения ах2+bx+с и вывести корни в делфи или паскаль (для этого создается dll библиотека). а, b, с водится с клавиатуры. Очень большая просьба к тому к то решит помочь текс на ассемблере должен быть как можно проще! так де вывожу в помощь подобный пример: Листинг программы на Assembler:
| Код | format PE console 4.0
entry start include 'include/win32a.inc'
section '.idata' import data readable
library kernel,'KERNEL32.DLL'
import kernel,\ ReadConsole,'ReadConsoleA',\ WriteConsole,'WriteConsoleA',\ GetStdHandle,'GetStdHandle',\ ExitProcess,'ExitProcess',\ LoadLibrary,'LoadLibraryA',\ GetProcAddress,'GetProcAddress' ; Перечисляем процедуры, содержащиеся в библиотеке 'KERNEL32.DLL', которые мы будем использовать в нашей программе.
section '.data' data readable writeable
; сообщение к выводу перед вводом числа Msg db "Enter the number: ",0 ; буфер под строку с введенным числом ResStr db 255 dup (0),0 ; дескриптор стандартного потока вывода hStdOut dd ? ; дескриптор стандартного потока ввода hStdIn dd ? ; сколько байт прочитано WrBytes dd ? ; имя библиотеки dllFilename db "ExDouble.dll",0 ; имя процедуры ProcName db "Determinant",0 ; дескриптор динамической библиотеки hModule dd ? ; адрес функции динамической библиотеки Determinant dd ? ; строка ошибки (нету библиотеки или имя процедуры не найдено) LibErr db "Invalid library or library not found!",0
section '.code' code readable executable
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE mov [hStdOut],eax invoke GetStdHandle,STD_INPUT_HANDLE mov [hStdIn],eax
invoke LoadLibrary,dllFilename mov [hModule],eax test eax,eax jz errexit
invoke GetProcAddress,[hModule],ProcName mov [Determinant],eax test eax,eax jz errexit
invoke WriteConsole,[hStdOut],Msg,18,WrBytes,NULL
invoke ReadConsole,[hStdIn],ResStr,255,WrBytes,NULL
; заполнение последнего enter'a (это два байта 0x0D0A) нулем mov esi,ResStr add esi,[WrBytes] sub esi,2 mov byte[esi],0
; передаем указатель на обработанную строку в процедуру динамической библиотеки invoke Determinant,ResStr
; нормальный выход exit: invoke ExitProcess,0
; выход с ошибкой errexit: invoke WriteConsole,[hStdOut],LibErr,37,WrBytes,NULL invoke ExitProcess,1
|
Листинг программы (код DLL библиотеки):
| Код | library ExDouble; //Имя библиотеки
//Используемые модули uses Windows, SysUtils;
//Функция, вычисляющая детерминант
Function Determinant(a:matr;n:integer):longint;
type matr=array[1..10,1..10] of longint; var a,b:matr; i,j,dt,n:longint; ki,kj,di,dj, m,i,j:integer;
begin randomize; write('N= '); readln(n); for i:=1 to n do for j:=1 to n do a[i,j]:=random(5); for i:=1 to n do begin for j:=1 to n do write(m[i,j]:3); writeln; end;
d:=0; k:=1; if (n<1) then begin writeln('Determinant: Cann''t run. N=',n); halt; end; if (n=1) then d:=a[1,1] else if (n=2) then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2] else { n>2 } for i:=1 to n do begin di:=0; for ki:=1 to m-1 do begin if (ki=i) then di:=1; dj:=0; for kj:=1 to m-1 do begin if (kj=j) then dj:=1; b[ki,kj]:=a[ki+di,kj+dj]; end;
d:=d+k*a[i,1]*Determinant(b,n-1); k:=-k; end; Determinant:=d; end; //Вывод результата на экран по средствам API функции MessageBox d := Format('Детерминант"%0.3f" = "%0.3f"!', [Base, d]); MessageBox(HWND_DESKTOP, PChar(d), 'Результат вычисления', MB_ICONINFORMATION);
end;
exports Determinant index 1;
begin end.
|
|