Assembly 无效指令操作数

Assembly 无效指令操作数,assembly,x86,Assembly,X86,回到英国电信,我得到: IOfinSICB.asm(248):错误A2070:指令操作数无效 IOfinSICB.asm(251):错误A2070:指令操作数无效 IOfinSICB.asm(257):错误A2070:指令操作数无效 我有450位的数组,我需要测试。我将其定义为: TabDeComp字节58 Dup(0) 根据我的红色,你可以测试内存位被寄存器中的数字替换,每8个字节是下一个字节,第一个字节是0到7,从右到左 当我这么做的时候,我也对这个错误感到奇怪。 IOfinSICB.asm

回到英国电信,我得到: 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
我对答案有点困惑。 在组装艺术中,我发现

引述:

6.6.4.2位测试指令:BT、BTS、BTR、BTC

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

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

如果第一个操作数是内存位置,则bt指令将在内存中给定的偏移量处测试该位,而与索引的值无关。例如,如果bx包含65,则 bt-TestMe,bx 将位置TestMe+8的第1位复制到进位标志中。同样,操作数的大小也无关紧要。出于所有目的,内存操作数都是一个字节,您可以使用适当的索引测试该字节之后的任何位。实际位bt测试位于位位置索引mod 8和内存偏移有效地址+索引/8处

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

bt、bts、btr和btc指令不影响除进位标志以外的任何标志

取消报价


看来我所做的是正确的?

在248和251,我想你的问题是你忘记了
dword[]
。同样地,
TabDeComp
,没有
dword[]
,基本上是一个立即值

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

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


在266,
first
存储和dword,然后您尝试将其存储到qword。所以只需将248和251处的
qword
更改为
dword
,我想你的问题是你忘记了
dword[]
。同样地,
TabDeComp
,没有
dword[]
,基本上是一个立即值

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

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


在266,
first
存储和dword,然后您尝试将其存储到qword。所以只需将248和251处的
qword
更改为
dword
,我想你的问题是你忘记了
dword[]
。同样地,
TabDeComp
,没有
dword[]
,基本上是一个立即值

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

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


在266,
first
存储和dword,然后您尝试将其存储到qword。所以只需将248和251处的
qword
更改为
dword
,我想你的问题是你忘记了
dword[]
。同样地,
TabDeComp
,没有
dword[]
,基本上是一个立即值

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

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


在266,
first
存储和dword,然后您尝试将其存储到qword。因此,只需将
qword
更改为
dword
谢谢,它可以无误地编译“Bt-Word-Ptr-TabDeComp,Bx”或“Bt-Word-Ptc[TabDeComp],Bx”。我的下一步将是验证它是否按我的需要运行,但这是另一个故事。

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

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

谢谢,它编译时没有错误“Bt Word Ptr TabDeComp,Bx”或“Bt Word Ptc[TabDeComp],Bx”。我的下一步将是验证它是否按我需要的方式运行,但这是另一回事。

对于266,我将不得不使用接受QWord的Fistp。至于BT,我看到了“BT MyTest,65”,其中指出第八个字节的第1位,从零开始计数。我推断第二个操作数可以是寄存器,而不是立即数。你说得对。我在维基百科上查过(