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)曲線ではなく、1本の線のみを描画します。何が問題なのかを理解するのを手伝ってくれませんか。

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 に答える