2015-10-31 42 views
1

我有一個64位變量,並且想要在其二進制表示中計算1和0的數目。我不想更改變量中的值,所以我想使用Test運算符來計算變量中1的個數。我的問題是,我不知道如何處理64位變量時使用32位寄存器。使用測試操作員MASM程序集計算1的數量

.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 
+1

我只是將變量放入寄存器,然後通過進位標誌重複旋轉它。 RCL或RCR指令可以做到這一點。您可以在變量的偏移量處加載32位並處理它們,然後在偏移+4加載32位並重復。我發現簡單地維護一個循環計數和一個累計計數比我發現維護它們和一個掩碼更容易。 – enhzflep

回答

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