Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primer_kontr._raboty_208_FGOS_.doc
Скачиваний:
12
Добавлен:
16.11.2019
Размер:
318.98 Кб
Скачать

Тема №5 «Программирование на языке ассемблера задач с использованием системных ресурсов bios. Работа в графическом режиме»

Условие задачи

Построить и визуализировать график функции согласно варианту. Для расчета значения функции использовать математический сопроцессор. Должны быть также визуализированы оси координат.

Исходный текст программы

.586p

masm

model use16 small

.stack 100h

.data

mem16 dw 0 ; Буфер для сопроцессора

xMin dd -300e0 ; Минимальное значение x

xReal dd 0e0 ; Используемое значение

PixelIN1 dw 50 ; Количество пикселей в единице

xx dw 0 ; Координаты для вывода точки

yy dw 0

x23 dd 23.0 ; переменные для расчета функции

x76 dd 76.0

x12 dd 12.0

x49 dd 49.0

x10 dd 10.0

odin dd 1.0 ; Для операция сложения для сопроцессора

color db 0Fh ; Цвет прорисовки графика

xPol db '1 2 3 4 5$' ; Для вывода на экран координат

xOtr db '-5 -4 -3 -2 -1$'

.code

start:

mov ax,@data

mov ds,ax

mov ax,0012h ; установка графического режима

int 10h

call osiXY ; рисование осей

mov color,05h

call DrawGraph ; рисование графика

exit:

int 16h

mov ax,0003h

int 10h

mov ah,4Ch

int 21h

osiXY proc ; процедура рисования осей

mov dx,240

mov cx,9

mov ax,0C0Fh

xor bh,bh

X: ; рисуем ось X

int 10h

inc cx

cmp cx,631

mov cx,320

mov dx,10

Y: ; рисуем ось Y

int 10h

inc dx

cmp dx,470

jb Y

mov cx,627 ; рисуем стрелочку у оси X

mov dx,238

int 10h

mov dx,242

int 10h

mov cx,628

mov dx,238

int 10h

mov dx,239

int 10h

mov dx,241

int 10h

mov dx,242

int 10h

mov cx,629

mov dx,239

int 10h

mov dx,241

int 10h

mov dx,11 ; рисуем стрелочку у оси X

mov cx,319

int 10h

mov cx,321

int 10h

mov cx,318

int 10h

mov cx,319

int 10h

mov cx,321

int 10h

mov cx,322

int 10h

mov dx,13

mov cx,318

int 10h

mov cx,322

int 10h

mov ah,02h ; букву эY'

mov dx,0026h

int 10h

mov ah,0Ah

mov al,'Y'

mov bl,0Fh

mov cx,1

int 10h

mov ah,02h ; букву 'X'

mov dx,0D4Eh

int 10h

mov ah,0Ah

mov al,'X'

int 10h

mov dx,0E2Eh ; Положительные числа на оси X

mov ah,02h

int 10h

mov ah,9h

lea dx,xPol

int 21h

mov ah,02h ; Отрицительные числа на оси X

mov dx,0E08h

int 10h

mov ah,9h

lea dx,xOtr

int 21h

mov ah,02h ; Положительные числа на оси Y

mov dx,0C29h

int 10h

mov ah,0Ah

mov al,'1'

int 10h

mov ah,02h

mov dx,0929h

int 10h

mov ah,0Ah

mov al,'2'

int 10h

mov ah,02h

mov dx,0629h

int 10h

mov ah,0Ah

mov al,'3'

int 10h

mov ah,02h

mov dx,0329h

int 10h

mov ah,0Ah

mov al,'4'

int 10h

mov ah,02h

mov dx,1229h

int 10h

mov ah,0Ah

mov al,'-'

int 10h

mov ah,02h

inc dl

int 10h

mov ah,0Ah

mov al,'1'

int 10h

mov ah,02h ; Отрицительные числа на оси Y

mov dx,1529h

int 10h

mov ah,0Ah

mov al,'-'

int 10h

mov ah,02h

inc dl

int 10h

mov ah,0Ah

mov al,'2'

int 10h

mov ah,02h

mov dx,1829h

int 10h

mov ah,0Ah

mov al,'-'

int 10h

mov ah,02h

inc dl

int 10h

mov ah,0Ah

mov al,'3'

int 10h

mov ah,02h

mov dx,1C29h

int 10h

mov ah,0Ah

mov al,'-'

int 10h

mov ah,02h

inc dl

int 10h

mov ah,0Ah

mov al,'4'

int 10h

ret

osiXY endp

DrawGraph proc

mov xx,20

finit

fld xMin ; Текущее значение - минимальное

fstp xReal

DrawPixel:

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fmul ; x^2

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fmul x23

fadd ; x^2 + 23x

fsub x76 ; x^2 + 23x - 76

fcos ; cos(x^2 + 23x - 76)

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fmul

fmul ; x^3

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fmul x12

fsub ; x^3-12x

fsin ; sin(x^3 - 12x + 49)

fadd ; cos(x^2 + 23x - 76) + sin(x^3 - 12x + 49)

fld xReal ; Заносим в стек текущее значение

fidiv PixelIn1; Маштабируем

fldl2e

fmul

fsub x10

f2xm1 ; e^(x-10)-1

fadd odin ; e^(x-10)

fmul ; (cos(x^2 + 23x - 76) + sin(x^3 - 12x + 49))*e^(x-10)

fimul PixelIn1; Опять маштабируем

fstcw mem16

and mem16,1111001111111111b

fldcw mem16

frndint ; Округляем до ближайшего целого

fistp yy ; сохраняем из стека

fld xReal ; Увеличиваем текущее значение

fadd odin

fstp xReal

neg yy

add yy,240

cmp yy,480

ja NotOut

mov dx,yy

mov cx,xx

mov ah,0Ch

mov al,color

xor bh,bh

int 10h ; Рисуем точку

NotOut:

inc xx

cmp xx,620

jb DrawPixel

ret

DrawGraph endp

end start

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]