Индексиран плаващ масив в NASM x86 16-bit

Опитвам се да попълня масив от реални числа с двойна точност (64 бита), като използвам инструкциите за цикъл в NASM x86 16 бита, но получавам грешката invalid effective address. Операционната система е Windows XP 32 бита, но всъщност програмата работи като MS-DOS 16-битова.

Например:

    mov cx, 10
fill_array:
    fld qword[yArray + cx*8]
    fstp qword[xArray + cx*8]
    loop fill_array

Връща предишната грешка в редовете fld и fstp.

Масивите се декларират по следния начин:

yArray resq 10
xArray resq 10

Опитах също да използвам регистър като указател към масива, но например fstp qword[ax] също се проваля.

Има ли начин да се използват индексирани плаващи масиви в 16-битово асемблиране? Трябва ли да използвам някакви конкретни FPU инструкции?


person Ikuzen    schedule 15.11.2014    source източник
comment
Няма мащабиране при 16-битово адресиране. И също така без адресиране с cx.   -  person harold    schedule 15.11.2014
comment
@harold Благодаря. И така, единственото решение ли е твърдото кодиране на адресирането (fld qword[yArray + 8]) и повтарянето му N пъти?   -  person Ikuzen    schedule 15.11.2014
comment
О, не, има решения.. можете да използвате ecx (трябва да генерира замяна на размера на адреса) или можете да използвате някое от изброените неща за 16-битово адресиране тук   -  person harold    schedule 15.11.2014


Отговори (1)


На CPU >= 386 можете да използвате мащабиране дори в 16-битов режим, но само с 32-битови регистри:

    mov ecx, 10
fill_array:
    fld qword[yArray + ecx*8]
    fstp qword[xArray + ecx*8]
    loop fill_array

Но имате грешка "изключено по едно". Ако ECX=10 адресирате единадесетия елемент от списъка и ECX=0 ще прекрати цикъла, т.е. няма да бъде обработен. Можете да избегнете това с "ръчно изработен" цикъл:

    mov ecx, 9
fill_array:
    fld qword[yArray + ecx*8]
    fstp qword[xArray + ecx*8]
    sub cx, 1
    jnc fill_array

Решението "чист 8086":

    mov cx, 10
    mov bx, 0
fill_array:
    fld qword[yArray + bx]
    fstp qword[xArray + bx]
    add bx, 8
    loop fill_array
person rkhb    schedule 15.11.2014