使用TASM和DOSBox组装80386正弦

时间:2014-04-17 17:34:18

标签: assembly x86 x86-16 tasm sin

我必须编写一个程序,显示某种(可能)复杂的形状,可以旋转和移动。问题是,对于我能想到的任何解决方案,我都需要正弦和余弦函数。

首先,我有一个太早设置为386模式的问题(可执行文件应该是16位,用TASM编译)。

现在问题是我的循环得到了奇怪的值:

.data

_180 dw 180
_25 dw 25
degrad dd ?
tempvar dw ?
alpha dw ?

.386
.code

start:

finit

fldpi
fidiv word ptr _180
fstp dword ptr degrad

    mov word ptr alpha, 0

calcsin:
mov ax, word ptr alpha
mov word ptr tempvar, ax
    fild tempvar
    fsin
    fimul word ptr _25
    fistp word ptr tempvar
mov DX,word ptr tempvar


inc word ptr alpha
cmp word ptr alpha,360
jne calcsin

    mov ax, 4c00h
    int 21h
end start

之后如果我在DOSBox中打开Turbo Debugger,我会在DX中获得奇怪的巨大价值。我也尝试过复制(并修复,因为他们不会编译)来自网上的一些例子,看看它们是否有效,它们通常最终无法正常工作......

2 个答案:

答案 0 :(得分:1)

您在代码开头至少没有初始化DS。看:

.MODEL small
.486

.STACK 1000h

.DATA
    _180 dw 180
    _25 dw 25
    degrad dd ?
    tempvar dw ?
    alpha dw ?
    buf dw 8 dup (?)

.CODE
start PROC
    mov ax, @data
    mov ds, ax
    mov es, ax

    finit
    fldpi
    fidiv word ptr _180
    fstp dword ptr degrad
    mov word ptr alpha, 0

    calcsin:
    mov ax, word ptr alpha
    mov word ptr tempvar, ax
    fild tempvar
    fsin
    fimul word ptr _25
    fistp word ptr tempvar

    mov dx, word ptr tempvar

    mov ax, tempvar
    mov di, OFFSET buf
    call int2dez
    mov dx, OFFSET buf
    mov ah, 09h
    int 21h

    inc word ptr alpha
    cmp word ptr alpha, 360
    jne calcsin

    mov ax, 4C00h       ; Exit(0)
    int 21h
start ENDP

int2dez PROC
    test ax, 10000000b
    jz Convert
    mov byte ptr [di], '-'
    inc di
    neg ax

    Convert:
    mov bx, 10
    xor cx, cx
  Loop_1:
    xor dx, dx
    div bx
    push dx
    add cl, 1
    or  ax, ax
    jnz Loop_1
  Loop_2:
    pop ax
    or ax, 00110000b
    stosb
    loop Loop_2

    mov al, 10
    stosb
    mov al, '$'
    stosb
    ret
int2dez ENDP

end start

程序有效,但我没有检查计算和结果。我想没有正弦(http://en.wikipedia.org/wiki/Midpoint_circle_algorithm)的旋转更快。

答案 1 :(得分:0)

你忘了在你的循环中从度数转换为弧度。在fsin之前,请放置fmul dword ptr degrad

相关问题