Проблема с командами сопроцессора (я хотел бы нарисовать кривую 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]
Другие вопросы по тегам