NASM x86 16位索引浮点数组

时间:2014-11-15 18:57:43

标签: arrays assembly x86 nasm 16-bit

我尝试使用NASM x86 16位中的循环指令填充一个双精度(64位)实数数组,但是我得到了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

返回fldfstp行的上一个错误。

数组以这种方式声明:

yArray resq 10
xArray resq 10

我还尝试使用寄存器作为指向数组的指针,但是,例如,fstp qword[ax]也会失败。

有没有办法在16位汇编中使用索引浮点数组?我是否需要使用任何特定的FPU指令?

1 个答案:

答案 0 :(得分: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,则表示列表的第11个元素,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