BT无效指令操作数

时间:2014-03-11 21:11:01

标签: assembly x86

回到BT,我得到: IOfinSICB.asm(248):错误A2070:无效的指令操作数

IOfinSICB.asm(251):错误A2070:无效的指令操作数

IOfinSICB.asm(257):错误A2070:无效的指令操作数

我有450位阵列需要测试。我把它定义为: TabDeComp字节58 Dup(0) 从我的红色开始,您可以测试由寄存器中保存的数字替换的存储器位,每8个是下一个字节,第一个是0到7从右到左。

正如我所说的,我也将这个错误排除在外。 IOfinSICB.asm(266):错误A2024:指令

的操作数大小无效
            Mov Esi, pFfin2              ; Origen dat
            Mov Edi, pMemory
            Mov Ebx, 7
          LoopDeCmp:
       248  Bt TabDeComp, Ebx
            Jnc DorQ
            Dec Ebx
       251  Bt TabDeComp, Ebx
            Jc PassBump                   ; Es Dup
            Fldz                          ; pongo cero
            Jmp PassBump
          DorQ:
            Dec Ebx
       257  Bt [TabDeComp], Ebx
            Jnc esQW
            Fild DWord Ptr [Esi]
            Add Esi, 4
            Jmp PassBump
          esQW:
            Fild QWord Ptr [Esi]
            Add Esi, 8
          PassBump:
       266  Fist QWord Ptr [Edi]
            Add Edi, 8
            Bt Ebx, 2               ; Test 7
            Jnc LoopDeCmp           ; 3 o 1
            Bt Ebx, 1
            Jnc LoopDeCmp           ; 5
            Add Ebx, 8
            Cmp Ebx, 450
            Jl LoopDeCmp

我对答案有点困惑。 在装配艺术中我找到了

QUOTE:

6.6.4.2位测试指令:BT,BTS,BTR和BTC

在80386或更高版本的处理器上,您可以使用bt指令(位测试)来测试单个位。它的第二个操作数指定第一个操作数的位索引。 Bt将寻址的位复制到进位标志中。例如,指令         bt ax,12 将第12位斧头复制到进位标志中。

bt / bts / btr / btc指令仅处理16或32位操作数。这不是指令的限制。毕竟,如果你想测试al寄存器的第三位,你可以很容易地测试ax寄存器的第三位。另一方面,如果索引大于寄存器操作数的大小,则结果是未定义的。

如果第一个操作数是内存位置,则bt指令将测试内存中给定偏移量的位,而不管索引的值。例如,如果bx包含65则         bt TestMe,bx 将位置TestMe + 8中的第一位复制到进位标志中。再一次,操作数的大小无关紧要。对于所有意图和目的,内存操作数是一个字节,您可以使用适当的索引测试该字节后的任何位。实际位bt测试位于位位置索引mod 8和存储器偏移有效地址+ index / 8。

bts,btr和btc指令还将寻址的位复制到进位标志中。但是,这些指令在将第一个操作数中的位复制到进位标志后,还会置位,复位(清除)或补码(反转)该位。这提供了一些并发算法所需的测试和设置,测试和清除,以及测试和反转操作。

bt,bts,btr和btc指令不会影响进位标志以外的任何标志。

引文结束

看起来我正在做的事情是正确的吗?

2 个答案:

答案 0 :(得分:2)

在248和251,我认为你的问题是忘了dword []。实际上,没有TabDeComp的{​​{1}}基本上是一个直接值。

在257,我唯一的想法是你需要在dword []前使用dword。 IIRC,一些汇编程序需要大小说明符。除此之外,它看起来是正确的。

这次我用FASM测试了上面的内容,以确保它至少组装好。

在266,[TabDeComp]存储和dword,您尝试将其存储到qword中。因此,只需将fist更改为qword

答案 1 :(得分:1)

谢谢,它编译没有错误“Bt Word Ptr TabDeComp,Bx”或“Bt Word Ptc [TabDeComp],Bx”。我的下一步将是验证它是否符合我的需要,但这是另一个故事。