2013-01-20 48 views
1

我是编程汇编的初学者。我想在图形模式下绘制f(x)= x * sin(1/x)曲线。 我可以画f(x)= sin(x)曲线,但我无法绘制f(x)= x * sin(1/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 *罪(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]必须等于在此代码[角度]和公式为[Y ] =([馅饼] * [角])* SIN(1/[馅饼]/[角]),[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] 
+0

我更新根据您的建议我的代码,但它只能绘制一条线而不是预期的X *罪(1/x)的曲线。请看看我的问题的编辑部分。 – Fract

+1

我错了。 fidiv,fimul将source转换为Integer,但[pie](这个整数表示为0)是一个浮点数,在[pie]存在的行中尝试'fdiv dword [pie]'和'fmul dword [pie]'。对不起,我无法检查代码给你100%正确的答案。 – clover

+0

Yeahh,这是解决方案! :-) 非常感谢您的帮助! – Fract

相关问题