1

我是编程汇编的初学者。我想在图形模式下绘制 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) 曲线。你能帮我弄清楚可能是什么问题吗?

4

1 回答 1

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]/[角度]),[x] = [角度]:

; 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]
于 2013-01-20T23:13:51.430 回答