Помогите
Добавлено: 29 ноя 2007, 09:35
Нужно написать на ассемблере прогу находящую корни квадратного уравнения ах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.
так де вывожу в помощь подобный пример:
Листинг программы на 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.