Assembly 无效指令操作数
回到英国电信,我得到: IOfinSICB.asm(248):错误A2070:指令操作数无效 IOfinSICB.asm(251):错误A2070:指令操作数无效 IOfinSICB.asm(257):错误A2070:指令操作数无效 我有450位的数组,我需要测试。我将其定义为: TabDeComp字节58 Dup(0) 根据我的红色,你可以测试内存位被寄存器中的数字替换,每8个字节是下一个字节,第一个字节是0到7,从右到左 当我这么做的时候,我也对这个错误感到奇怪。 IOfinSICB.asm(266):错误A2024:指令的操作数大小无效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
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位,从零开始计数。我推断第二个操作数可以是寄存器,而不是立即数。你说得对。我在维基百科上查过(