在mandelbrot设置代码SSE汇编中找不到错误

时间:2018-06-26 14:31:20

标签: assembly nasm sse simd mandelbrot

我使用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

0 个答案:

没有答案