
- •Контрольная работа
- •Тема №1 «Арифметические и логические команды в ассемблере».
- •Тема №3 « Работа с массивами и стеком на языке ассемблера»
- •Тема №4 «Работа с математическим сопроцессором в среде Assembler»
- •Тема №5 «Программирование на языке ассемблера задач с использованием системных ресурсов bios. Работа в графическом режиме»
- •Тема №6 «Работа с файлами в языке Assembler»
Тема №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