Индексированный массив с плавающей запятой в NASM x86 16-бит

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

Например:

    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
@гарольд спасибо. Итак, является ли единственным решением жесткое кодирование адресации (fld qword[yArray + 8]) и ее повторение N раз?   -  person Ikuzen    schedule 15.11.2014
comment
О нет, есть решения... вы можете использовать ecx (должно сгенерировать переопределение размера адреса) или вы можете использовать любую из перечисленных 16-битных адресаций здесь   -  person harold    schedule 15.11.2014


Ответы (1)


На процессорах >= 386 вы можете использовать масштабирование даже в 16-битном режиме, но только с 32-битными регистрами:

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

Но у вас есть ошибка "off-by-one". Если 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