Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- format PE GUI 4.0 ; GUI-приложение для
- ; Windows (EXE-файл)
- include "\fasm\INCLUDE\win32ax.inc" ; путь к
- ; подкаталогу /include/
- .data
- lpCommLine dd ? ; указатель на командную строку
- form_str db "arg[0]: s=%s",10,10,"arg[1]: a=%.3f",10,10, "arg[2]: b=%.3f",0 ; строка формата вывода
- res_str db 512 dup(?) ; строка форматированного вывода
- s db 256 dup("Командная строка",0) ; командная строка (default)
- a dq 0.5 ; "плавающее" число (default);
- b dq 1.0 ; "плавающее" число (default)
- n dq 1000.0; Кол-во разбиений интервала
- h dq ?; Шаг по X
- two dq 2.0; Два
- three dq 3.0; Три
- i dq ?;
- x dq ?;
- result dq ?; Ответ
- msg db 256 dup ? ; строка вывода
- .code
- start: ; точка старта программы
- cinvoke GetCommandLine ; взять командную строку: eax < указатель на командную строку
- MOV [lpCommLine],eax ; запомнили указатель на
- ; командную строку по адресу в lpCommLine
- ;
- cinvoke MessageBox,0,[lpCommLine],"Командная строка полностью",MB_OK ; eax < код нажатой кнопки
- ;
- cinvoke sscanf, [lpCommLine], "%s %lf %lf", s,a,b ; из
- ; строки согласно форматам читаются поля
- cinvoke sprintf, res_str, form_str, s,dword[a],dword[a+4], dword[b],dword[b+4]
- cinvoke MessageBox,0,res_str,"Аргументы командной строки",MB_OK ; eax < код нажатой кнопки
- ; Считали значения a и b
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- ;st0 - значение шага цикла
- ;st1 - значение x
- ;st2 - значение площади S
- fldz;S=0
- fld[a];X=a S=0
- fldz;i=0 X=a S=0
- ; Вычислим h и закинем ее в соответствующую переменную
- fld[b]
- fld[a]
- fsubp st1, st0; вычислили b-a
- fld[n]
- fdivp st1, st0; вычислили (b-a)/n
- fstp [h];закинули в h
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- fld st1; закинули x
- fld st2; закинули x
- fmulp st1, st0; вычислили x^2
- fld1; закинули 1
- fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
- fstp st1;
- fld[b]; закинули b
- fmulp st1,st0; вычислили b*x^(-2)
- fld[a]; закинули а
- faddp st1,st0; вычислили a + b*x^(-2)
- faddp st3, st0; S = f(x0)
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- ; основной цикл программы
- loop_start:
- fld1
- faddp st1,st0; увеличиваем значение i на 1
- fld [h]
- faddp st2,st0; увеличиваем значение x на h
- jmp func; Вычисляем f(x), сохраняем в st0
- func_counted:
- fld[two]
- fmulp st1, st0; Вычисляем 2*f(x)
- fld st1
- fcomip st2;
- jnp multi_two; если i нечетное, то умножаем значение функции на 2
- multi_two_counted:
- faddp st3,st0; Вычисляем S = S + k*f(x), k = 2 если i четное и 4, если i нечетное
- fld[n]; закинули n
- fld1
- fsubp st1, st0; n-1
- fcomip st1; сравниваем n с i
- jae loop_start ; выходит когда i = n
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- fld st1; закинули x
- fld st2; закинули x
- fmulp st1, st0; вычислили x^2
- fld1; закинули 1
- fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
- fstp st1;
- fld[b]; закинули b
- fmulp st1,st0; вычислили b*x^(-2)
- fld[a]; закинули а
- faddp st1,st0; вычислили a + b*x^(-2)
- faddp st3, st0; S = f(xn)
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- ;jmp res_output
- fld [h]
- fld [three]
- fdivp st1, st0 ; Вычислили h/3
- fmulp st3, st0 ; Вычислили h/3*(...)
- res_output:
- fstp [i] ; i
- fstp [x] ; X
- fstp [result] ; S
- ; Вывод с помощью sprintf()
- ;cinvoke sprintf, msg, "Result = %f", dword[result], dword[result+4]
- cinvoke sprintf, msg, "I = %f, X = %f, Result = %f", dword[i], dword[i+4] , dword[x], dword[x+4] , dword[result], dword[result+4]
- ; Вывод полученной строки в Виндовую-форму
- invoke MessageBox, 0, msg, "Result", MB_OK
- ; Выход из программы
- invoke ExitProcess, 0
- entry start
- ; Вычисляет F(X) = a + b*x^(-2)
- ; Результат записывает в st0
- func:
- fld st1; закинули x
- fld st2; закинули x
- fmulp st1, st0; вычислили x^2
- fld1; закинули 1
- fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
- fstp st1;
- fld[b]; закинули b
- fmulp st1,st0; вычислили b*x^(-2)
- fld[a]; закинули а
- faddp st1,st0; вычислили f(x) = a + b*x^(-2)
- jmp func_counted
- ; Умножает значение в st0 на 2
- multi_two:
- fld[two]
- fmulp st1, st0; Вычисляем 2*f(x)
- jmp multi_two_counted
- ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- data import ; импортируем стандартные функции Windows
- library user32,'USER32.DLL',\
- msvcrt,'MSVCRT.DLL' ,\
- kernel32,'KERNEL32.DLL'
- import kernel32, \
- ExitProcess,'ExitProcess', \
- GetCommandLine,'GetCommandLineA' ; ANSI-функция
- import user32, \
- MessageBox, 'MessageBoxA'
- import msvcrt, \
- sprintf, 'sprintf', \
- sscanf, 'sscanf'
- end data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement