我必须编写一个程序,显示某种(可能)复杂的形状,可以旋转和移动。问题是,对于我能想到的任何解决方案,我都需要正弦和余弦函数。
首先,我有一个太早设置为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中获得奇怪的巨大价值。我也尝试过复制(并修复,因为他们不会编译)来自网上的一些例子,看看它们是否有效,它们通常最终无法正常工作......
答案 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
。