Построение графика функции. - Assembler
Формулировка задачи:
Дорогие знатоки, можете ли вы, по возможности, указать ссылкой на программу с построением графиков в Assembler. Заранее благодарен.
Решение задачи: «Построение графика функции.»
textual
Листинг программы
.286 .model small .stack 100h .data sAmp db 'A = $' sOmega db 13,10,'w = $' sFi db 13,10,'fi = $' sSin db "y = Asin(wt + fi)", 13, 10, "$" Mx dd 21.0 My dd 21.0 Amp dq 2.0 omega dq 1.0 faza dq 0.0 Tx dd -15.0 delta dd 0.001 midx dd 320.0 midy dd 240.0 xr dw 0 yr dw 0 sNum db 10 sLen db ? sString db 10 dup (?) .code .486 start: mov ax, @DATA mov ds, ax enters: finit mov ax,12h;устанавливаю графический режим 640х480х16 цветов int 10h lea dx, sSin;вывожу на экран приглашение "y = Asin(wt + fi)" mov ah, 09h int 21h lea dx, sAmp;вывожу на экран приглашение 'A = ' int 21h lea di, Amp call StrToFloat ;перевожу строку в вещественное число lea dx, sOmega mov ah, 9 int 21h lea di, omega call StrToFloat;перевожу строку в вещественное число lea dx, sFi mov ah, 9 int 21h lea di, faza call StrToFloat ;перевожу строку в вещественное число mov cx,30000 ;буду выводить точку 30000 раз finit fld Tx l1: fld st fld st fmul Mx ;st(0)=Tx*Mx frndint ; выделили целую часть из Tx*Mx fadd midx fistp word ptr xr; xr:=midx + целая часть(Tx*Mx) fmul omega ;st(0)=Tx*omega fadd faza ;st(0)=Tx*omega+faza fsin ;st(0)=Sin(Tx*omega+faza) fmul My fmul Amp frndint ; выделили целую часть из Amp*My*Sin(Tx*omega+faza) fsubr midy fistp word ptr yr;yr:=midy - (целая часть (Amp*My*Sin(Tx*omega+faza))) pusha mov ax, 0C0Ah ;вывожу точку на экран mov bh, 0h mov cx, xr; в указанные координаты mov dx, yr int 10h popa fadd delta;Tx:=Tx+deltа loop l1 mov ah,1h ;жду нажатия на клавиатуру int 21h mov ax,3; устанавливаю текстовый режим int 10h exit: mov ah,4Ch ;выхожу из программы int 21h ;процедура для перевода строки в вещественное число StrToFloat proc local Sign:word, Digit:word, C10:word, Base:word lea dx, sNum mov ah, 0Ah;ввод с клавиатуры int 21h lea si, sString finit mov Sign, 1 mov C10, 10 mov Base, 10 fldz xor cx, cx SearchStart: lodsb cmp al, '-' je NegativeNum cmp al, '+' je NextDigit jmp CmpDigit NegativeNum: mov Sign,-1 NextDigit: lodsb CmpDigit: cmp al, '.' je Point cmp al, ',' je Point cmp al, '0' jb StrToFloatRet cmp al, '9' ja StrToFloatRet and ax, 0fh mov Digit, ax jcxz PartInteger cmp cx,3 je StrToFloatRet fild Digit fidiv Base faddp st(1),st mov ax, Base imul c10 mov Base, ax inc cx jmp NextDigit PartInteger: fimul c10 fiadd Digit jmp NextDigit Point: test cx,cx jnz StrToFloatRet inc cx jmp NextDigit StrToFloatRet: fimul Sign fstp qword ptr [di] ret StrToFloat endp END start
Объяснение кода листинга программы
- Объявление и инициализация переменных:
sAmp
- строкаA = $
sOmega
- строка с символами перевода строки иw = $
sFi
- строка с символами перевода строки иfi = $
sSin
- строкаy = Asin(wt + fi)
Mx
- вещественное число 21.0My
- вещественное число 21.0Amp
- вещественное число 2.0omega
- вещественное число 1.0faza
- вещественное число 0.0Tx
- вещественное число -15.0delta
- вещественное число 0.001midx
- вещественное число 320.0midy
- вещественное число 240.0xr
- двоичное слово 0yr
- двоичное слово 0sNum
- байт 10sLen
- байт ?sString
- массив байтов, 10 элементов
- Устанавливается графический режим 640x480x16 цветов.
- Выводится на экран строка
y = Asin(wt + fi)
. - Выводится строка
A =
. - Происходит считывание вещественного числа в переменную
Amp
. - Выводится строка с
w =
. - Происходит считывание вещественного числа в переменную
omega
. - Выводится строка с
fi =
. - Происходит считывание вещественного числа в переменную
faza
. - Инициализация цикла вывода точек.
- Вычисления для построения графика функции.
- Вывод точки на экран.
- Увеличение значения
Tx
наdelta
. - Ожидание нажатия клавиши на клавиатуре.
- Установка текстового режима.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д