在程序集中初始化位数组对象

Initializing a bitarray object in assembly

作为(初学者)练习,我正在尝试在汇编中实现类似 class 的东西。为此,我想创建一个大小为 N 的 BitArray,并进行 init(size)set(idx)unset(idx)get(idx)print() 的操作。

我从 init() 开始,这是我目前的情况:

bit_array_init:
    # all this has to do is clear N bits (%rdi) starting at address (%rsi)
    mov $-1, %rax   # mask of all 1's
    mov %dil, %cl
    shl %cl, %rax       # shift left by the number of bits, filling right-side with 0's
    andq %rax, (%rsi)   # because the mask is all 1's above the bit count, it doesn't matter
    ret                 # if we 'extend too far' since &1 will have no affect

它可以这样称呼:

movl [=11=]b110110110110110110, -4(%rbp) # add bogus values to stack to confirm function's ok
    
# 1. Init the bitArray, b = BitArray(BIT_SIZE, address); allocated locally on the stack
mov ,      %edi # size of the bitarray
lea -4(%rbp), %rsi # where the bitarray starts at
call bit_array_init

它会故意只分配 12 位而不是“2 字节”之类的东西,并保持其他一切不变(同样是为了 practice/learning 而不是现实世界的东西)。

我对此有几个问题:

你有初始化器但没有构造器。

区别在于构造函数会分配内存,然后(可能内联)使用初始化程序。

如果你使用构造函数,它会分配内存,但是多少?始终使用 64 位可以避免上面讨论的问题(写入您不一定拥有的内存)——但即使只有 12 位,也需要 64 位来存储任何向量。

此外,如果构造函数分配了 64 位,则无需 and 清除那些新分配的位,只需将(四字)零存储到其中即可。


可以使用各种更复杂的技术来创建消费客户端所需的足够大小的可变长度位向量,但这需要一个新的问题和答案。