回到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指令不会影响进位标志以外的任何标志。
引文结束
看起来我正在做的事情是正确的吗?
答案 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”。我的下一步将是验证它是否符合我的需要,但这是另一个故事。