使用Test Operator MASM Assembly

时间:2015-10-31 22:36:49

标签: assembly masm

我有一个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

2 个答案:

答案 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中。