我尝试使用 NASM x86 16 位中的循环指令填充 double (64 位)实数数组,但收到有效地址无效
错误。操作系统是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 位汇编中使用索引 float 组?我需要使用任何特定的 FPU 指令吗?
最佳答案
在 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
关于arrays - NASM x86 16 位中的索引 float 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949507/