微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在程序集中初始化位数组对象

作为(入门)练习,我正在尝试实现汇编类之类的东西。为此,我想创建一个大小为N的BitArray,并进行init(size)set(idx)unset(idx)get(idx)print()的操作。 / p>

我从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 $0b110110110110110110,-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 $12,%edi # size of the bitarray
lea -4(%rbp),%rsi # where the bitarray starts at
call bit_array_init

它只会故意分配12位而不是“ 2字节”之类的东西,而其他所有东西保持不变(再次用于练习/学习,而不是实际的东西)。

我对此有一些疑问:

  • 以上内容看起来像是init位数组的可接受方法吗?还是有更好的方法来做到这一点?
  • 我正在传递堆栈中某些内容的内存地址。大多数init函数将以这种方式工作吗?还是我应该传(1)其他?还是(2)init将传回分配给它的内存地址?

解决方法

您有一个初始化程序,但没有构造函数。

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

如果使用构造函数,它将分配内存,但是多少呢?始终使用64位可以避免上述问题(写到您不一定拥有的内存中)的安全性,但是即使只有12位,也需要64位来存储任何向量。

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


可以使用各种更复杂的技术来创建长度可变的位向量,以达到使用客户所需的大小,但这将带来新的问题和答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。