我尝试使用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
返回fld
和fstp
行的上一个错误。
数组以这种方式声明:
yArray resq 10
xArray resq 10
我还尝试使用寄存器作为指向数组的指针,但是,例如,fstp qword[ax]
也会失败。
有没有办法在16位汇编中使用索引浮点数组?我是否需要使用任何特定的FPU指令?
答案 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