Проблема с командами сопроцессора (я хотел бы нарисовать кривую f(x)=x*sin(1/x) в графическом режиме)
Я новичок в программировании сборки. Я хотел бы нарисовать кривую f(x)=x*sin(1/x) в графическом режиме. Я могу нарисовать кривую f (x) = sin (x), но я не могу нарисовать f(x)=x*sin(1/x). Как я мог это сделать?
Ниже вы можете увидеть мой рабочий код f (x) = sin (x). Он работает и отлично рисует синусоидальную кривую:
org 100h
mov al,13h
int 10h
xor bx,bx
loopage:
inc word [angle]
fld dword [pie]
fimul word [angle]
fsin
fimul word [xradius]
fistp word [x]
fimul word [yradius]
fistp word [y]
mov al,15
mov dx,[x]
add dx,ax
mov cx,[y]
add cx,bx
;xor ax,ax
;int 16h
inc bl
mov ah,0Ch
mov al,bl
int 10h
cmp word [angle],360
je endage
jb loopage
mov ax,0a000h
mov es,ax
xor ax,ax
mov cx,32000
rep stosw
endage:
xor ax,ax
int 16h
ret
y dw 0
x dw 0
angle dw 0
a dw -1
pie dd 0.01756
yradius dw 50
one dw 1
xradius dw 50
float dd 0
Я хотел бы изменить этот код, чтобы нарисовать кривую f(x)=x*sin(1/x).
Я пробовал несколько вещей, чтобы изменить следующий раздел в коде выше:
...
fld dword [pie]
fimul word [angle]
fsin
fimul word [xradius]
fistp word [x]
fimul word [yradius]
fistp word [y]
...
Однако пока безрезультатно.
Не могли бы вы мне помочь, пожалуйста?
=========== РЕДАКТИРОВАНИЕ: ====================
Я опробовал твой код. Теперь мой код выглядит так:
...
loopage:
;inc word [angle]
; FP0 <- 1
fld1
; FP0 = FP0 / [pie] / [angle], is equal to FP0 / ([pie] * [angle])
fidiv dword [pie]
fidiv word [angle]
fsin
fimul dword [pie]
fimul word [angle]
fimul word [yradius]
fistp word [y]
mov al,15
mov dx,[angle]
add dx,ax
mov cx,[y]
add cx,bx
...
Однако этот код рисует только одну линию вместо ожидаемой кривой x * sin (1 / x). Не могли бы вы помочь мне выяснить, в чем может быть проблема?
1 ответ
У вас есть ошибка в "рабочем" коде:
....
; FP0 <- [pie] ~ Pi/180
fld dword [pie]
; FP0 = FP0 * [angle]
fimul word [angle]
; FP0 = sin(FP0)
fsin
; FP0 = FP0 * [xradius]
fimul word [xradius]
; [x] <- FP0
fistp word [x]
; **ERROR: no FP0!**
fimul word [yradius]
fistp word [y]
....
Не спрашивайте, почему это работает;) на самом деле ваш [x] должен быть равен [angle] в этом коде, а формула имеет вид [y] = ([pie] * [angle]) * sin(1/[pie]/[ угол]), [х] = [угол]:
; FP0 <- 1
fld1
; FP0 = FP0 / [pie] / [angle], is equal to FP0 / ([pie] * [angle])
fidiv dword [pie]
fidiv word [angle]
fsin
fimul dword [pie]
fimul word [angle]
fimul word [yradius]
fistp word [y]
Так что удалите переменные [x] и [xradius] и измените эту строку:
mov dx,[x]
к этому:
mov dx,[angle]