【问题标题】:Indexed float array in NASM x86 16-bitNASM x86 16 位中的索引浮点数组
【发布时间】:2015-01-12 23:54:54
【问题描述】:

我正在尝试使用 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 指令吗?

【问题讨论】:

  • 在 16 位寻址中没有缩放。也没有使用cx 寻址。
  • @harold 谢谢。那么,唯一的解决方案是对寻址 (fld qword[yArray + 8]) 进行硬编码并重复 N 次吗?
  • 哦不,有解决方案..你可以使用ecx(应该生成地址大小覆盖),或者你可以使用here列出的任何16位寻址东西

标签: arrays assembly x86 nasm 16-bit


【解决方案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 您寻址列表的 第十一个 元素,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

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多