我使用SSE在组装中对Imdel mandelbrot进行编程。我使用中断:
mov ax,0x4F02
mov bx,0x107
int 0x10
将视频模式设置为1280x1024像素(256种颜色),然后启用A20门并正确切换到32位保护模式,并在cr0和cr4中允许fpu和sse。我测试了一些简单的SSE指令,它们正常工作。但是随后我进行了mandelbrot设置,并且启动时未呈现任何内容(绘制像素/线条效果很好)。我也尝试使用调试器执行代码,但没有发现任何错误,有人可以看看我的代码吗?感谢您的任何帮助(在nasm中编译,在freedos中运行)
mov edx,0xA0000
xorps xmm7,xmm7
repeat:
movupd xmm0,xmm7
movupd xmm5,[centerimage]
subpd xmm0,xmm5
movupd xmm5,[zoom]
divpd xmm0,xmm5
movupd xmm6,xmm0
xorps xmm0,xmm0
xor ecx,ecx
nextiteration:
movupd xmm1,xmm0
mulpd xmm1,xmm1
hsubpd xmm1,xmm1
movupd xmm2,xmm0
shufpd xmm2,xmm2,0x1
mulpd xmm0,xmm2
haddpd xmm0,xmm0
movsd xmm0,xmm1
addpd xmm0,xmm6
movupd xmm1,xmm0
mulpd xmm1,xmm1
haddpd xmm1,xmm1
ucomisd xmm1,[double4]
ja getcolor
inc ecx
cmp ecx,0xFF
jb nextiteration
xor al,al
jmp drawpixel
getcolor:
mov al,cl
drawpixel:
movupd xmm0,xmm7
movupd xmm5,[double1double1280]
mulpd xmm0,xmm5
haddpd xmm0,xmm0
cvtsd2si edi,xmm0
mov [edx+edi],al
movupd xmm5,[double1double0]
addpd xmm7,xmm5
ucomisd xmm7,[screenX]
jb repeat
movsd xmm7,[double0]
movupd xmm5,[double0double1]
addpd xmm7,xmm5
movupd xmm0,xmm7
shufpd xmm0,xmm0,1
ucomisd xmm0,[screenY]
jb repeat
;movhpd xmm7,[double0]
cli
infloop:
hlt
jmp infloop
centerimage dq 640.0,512.0
zoom dq 50.0,50.0
double1double1280 dq 1.0,1280.0
double1double0 dq 1.0,0.0
double0double1 dq 0.0,1.0
screenX dq 1280.0
screenY dq 1024.0
double0 dq 0.0
double4 dq 4.0