Построение графика функции. - 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

Объяснение кода листинга программы

  1. Объявление и инициализация переменных:
    • sAmp - строка A = $
    • sOmega - строка с символами перевода строки и w = $
    • sFi - строка с символами перевода строки и fi = $
    • sSin - строка y = Asin(wt + fi)
    • Mx - вещественное число 21.0
    • My - вещественное число 21.0
    • Amp - вещественное число 2.0
    • omega - вещественное число 1.0
    • faza - вещественное число 0.0
    • Tx - вещественное число -15.0
    • delta - вещественное число 0.001
    • midx - вещественное число 320.0
    • midy - вещественное число 240.0
    • xr - двоичное слово 0
    • yr - двоичное слово 0
    • sNum - байт 10
    • sLen - байт ?
    • sString - массив байтов, 10 элементов
  2. Устанавливается графический режим 640x480x16 цветов.
  3. Выводится на экран строка y = Asin(wt + fi).
  4. Выводится строка A =.
  5. Происходит считывание вещественного числа в переменную Amp.
  6. Выводится строка с w =.
  7. Происходит считывание вещественного числа в переменную omega.
  8. Выводится строка с fi =.
  9. Происходит считывание вещественного числа в переменную faza.
  10. Инициализация цикла вывода точек.
  11. Вычисления для построения графика функции.
  12. Вывод точки на экран.
  13. Увеличение значения Tx на delta.
  14. Ожидание нажатия клавиши на клавиатуре.
  15. Установка текстового режима.
  16. Завершение программы.

Оцени полезность:

10   голосов , оценка 3.7 из 5