Построение графика функции. - Assembler

Узнай цену своей работы

Формулировка задачи:

Дорогие знатоки, можете ли вы, по возможности, указать ссылкой на программу с построением графиков в Assembler. Заранее благодарен.

Решение задачи: «Построение графика функции.»

textual
Листинг программы
  1. .286
  2. .model small
  3. .stack 100h
  4. .data
  5. sAmp db 'A = $'
  6. sOmega db 13,10,'w = $'
  7. sFi db 13,10,'fi = $'
  8. sSin db "y = Asin(wt + fi)", 13, 10, "$"
  9. Mx dd 21.0
  10. My dd 21.0
  11. Amp dq 2.0
  12. omega dq 1.0
  13. faza dq 0.0
  14. Tx dd -15.0
  15. delta dd 0.001
  16. midx dd 320.0
  17. midy dd 240.0  
  18. xr dw 0
  19. yr dw 0
  20. sNum db 10
  21. sLen db ?
  22. sString db 10 dup (?)
  23. .code
  24. .486
  25. start:  mov ax, @DATA
  26.     mov ds, ax
  27. enters: finit  
  28.     mov ax,12h;устанавливаю графический режим 640х480х16 цветов
  29.     int 10h
  30.     lea dx, sSin;вывожу на экран приглашение "y = Asin(wt + fi)"
  31.     mov ah, 09h
  32.     int 21h
  33.     lea dx, sAmp;вывожу на экран приглашение 'A = '
  34.     int 21h
  35.     lea di, Amp
  36.     call StrToFloat ;перевожу строку в вещественное число
  37.     lea dx, sOmega
  38.     mov ah, 9
  39.     int 21h
  40.     lea di, omega
  41.     call StrToFloat;перевожу строку в вещественное число
  42.     lea dx, sFi
  43.     mov ah, 9
  44.     int 21h
  45.     lea di, faza    
  46.     call StrToFloat ;перевожу строку в вещественное число
  47.     mov cx,30000 ;буду выводить точку 30000 раз
  48.     finit
  49.         fld Tx
  50. l1: fld st
  51.         fld st
  52.     fmul Mx ;st(0)=Tx*Mx
  53.     frndint ; выделили целую часть из Tx*Mx
  54.     fadd midx
  55.     fistp word ptr xr; xr:=midx + целая часть(Tx*Mx)
  56.     fmul omega  ;st(0)=Tx*omega
  57.     fadd faza   ;st(0)=Tx*omega+faza
  58.     fsin ;st(0)=Sin(Tx*omega+faza)
  59.     fmul My
  60.     fmul Amp
  61.     frndint ; выделили целую часть из Amp*My*Sin(Tx*omega+faza)
  62.     fsubr midy
  63.     fistp word ptr yr;yr:=midy - (целая часть (Amp*My*Sin(Tx*omega+faza)))
  64.     pusha  
  65.     mov ax, 0C0Ah   ;вывожу точку на экран
  66.     mov bh, 0h  
  67.     mov cx, xr; в указанные координаты  
  68.     mov dx, yr  
  69.     int 10h
  70.     popa    
  71.     fadd delta;Tx:=Tx+deltа
  72.     loop l1
  73.     mov ah,1h ;жду нажатия на клавиатуру
  74.     int 21h
  75.     mov ax,3; устанавливаю текстовый режим
  76.     int 10h
  77. exit:   mov ah,4Ch ;выхожу из программы
  78.     int 21h
  79. ;процедура для перевода строки в вещественное число
  80. StrToFloat proc
  81. local Sign:word, Digit:word, C10:word, Base:word
  82.     lea dx, sNum
  83.     mov ah, 0Ah;ввод с клавиатуры
  84.     int 21h
  85.         lea si, sString
  86.     finit
  87.     mov Sign, 1
  88.     mov C10, 10
  89.     mov Base, 10
  90.     fldz
  91.     xor cx, cx
  92. SearchStart: lodsb
  93.     cmp al, '-'
  94.     je NegativeNum
  95.     cmp al, '+'
  96.     je NextDigit
  97.     jmp CmpDigit
  98. NegativeNum: mov Sign,-1
  99. NextDigit: lodsb
  100. CmpDigit: cmp al, '.'
  101.     je Point
  102.     cmp al, ','
  103.     je Point
  104.     cmp al, '0'
  105.     jb StrToFloatRet
  106.     cmp al, '9'
  107.     ja StrToFloatRet
  108.     and ax, 0fh
  109.     mov Digit, ax
  110.     jcxz PartInteger
  111.     cmp cx,3
  112.     je StrToFloatRet
  113.     fild Digit
  114.     fidiv Base
  115.     faddp st(1),st
  116.     mov ax, Base
  117.     imul c10
  118.     mov Base, ax
  119.     inc cx
  120.     jmp NextDigit
  121. PartInteger: fimul c10
  122.     fiadd Digit
  123.     jmp NextDigit
  124. Point:  test cx,cx
  125.     jnz StrToFloatRet
  126.     inc cx
  127.     jmp NextDigit
  128. StrToFloatRet: fimul Sign
  129.     fstp qword ptr [di]
  130.     ret
  131. StrToFloat endp
  132. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут