我有一个64位变量,想要计算其二进制表示中的1和0的数量。我不想更改变量中的值,所以我想使用Test运算符来计算变量中的1的数量。我的问题是,在使用32位寄存器时,我不确定如何处理64位变量。
.data
aBigVar QWORD ?
.code
mov ecx, 63 ; use as loop counter
mov eax, 0b
Begin:
add eax, 01b;
test aBigVar, eax ; error: instruction operands must be same size
jz LoopToStart
inc dl
loop Start
LoopToStart:
loop Start
答案 0 :(得分:1)
您应该分别处理值的上半部分和下半部分,因为此任务是位计数,您可以在其中单独处理每个位。
此代码显示了一个概念,但我不擅长MASM,并且我收到此代码的链接错误。
.486
.model flat,stdcall
.data
aBigVar QWORD ?
.code
mov ecx, 32 ; use as loop counter
mov eax, 1b
xor dl, dl ; dl = 0
Begin:
test DWORD PTR aBigVar, eax
jz NoInc1
inc dl
NoInc1:
test DWORD PTR (aBigVar + 4), eax
jz NoInc2
inc dl
NoInc2:
shl eax, 01b;
loop Start
Start:
END
答案 1 :(得分:0)
X86具有bt
指令,可以对内存中的位串进行操作。您的 aBigVar 是64位的比特串。
.data
aBigVar QWORD ?
.code
mov ecx, 63
mov ebx, offset aBigVar
mov eax, 0
Begin:
bt [ebx], ecx
adc eax, 0
dec ecx
jns Begin
1位的数量在EAX中。