2013-01-20 45 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

相關問題