Не могу найти ошибку в наборе кода Мандельброта SSE сборки - PullRequest
0 голосов
/ 26 июня 2018

Я программирую Мандельброта, установленного в сборке с использованием SSE. Я использую прерывание:

mov ax,0x4F02
mov bx,0x107
int 0x10

, чтобы установить режим видео 1280x1024 пикселей с 256 цветами, затем я включаю вентиль A20 и правильно переключаюсь в 32-битный защищенный режим и разрешаю fpu и sse в cr0 и cr4. Я протестировал несколько простых инструкций 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
...