arrays - NASM x86 16 位中的索引 float 组

标签 arrays assembly x86 nasm 16-bit

我尝试使用 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

返回 fldfstp 行处的上一个错误。

数组是这样声明的:

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/

相关文章:

assembly - 如何在不等待的情况下读取 key ,汇编 8086

arrays - Angular 为 2 的 Immutable.js

c++ - 如何计算实例数组中未删除的实例?

javascript - jquery中基于动态变量声明动态数组

assembly - 如何在 RISC-V 汇编中使用数组

linux - 我可以在汇编源代码和 ld 脚本中声明自己的部分吗?

c - 越界访问数组有多危险?

assembly - 奥利数据库 : sign extending with Movsx

c++ - 方法调用后返回值是否总是进入 eax 寄存器?

optimization - Intel Skylake 的统一调度器与 AMD Zen 的单独调度器