Assembly 在程序集中查找列表的结尾
我是x86汇编的新手。在我学习的书中,我遇到了一个问题: 我们讨论了三种查找列表结尾的方法:使用特殊数字、使用结束地址和使用长度计数。你认为哪种方法最好?为什么?如果知道列表已排序,您会使用哪种方法?为什么? 使用一个特殊的数字是指将一个数字放在列表的末尾,当到达该数字时停止Assembly 在程序集中查找列表的结尾,assembly,Assembly,我是x86汇编的新手。在我学习的书中,我遇到了一个问题: 我们讨论了三种查找列表结尾的方法:使用特殊数字、使用结束地址和使用长度计数。你认为哪种方法最好?为什么?如果知道列表已排序,您会使用哪种方法?为什么? 使用一个特殊的数字是指将一个数字放在列表的末尾,当到达该数字时停止 我想不出答案。哪种方法更有效?为什么?排序列表与普通列表在查找结尾方面有什么不同?提前感谢。最好的目的是什么?尺寸效率?隐式长度的C字符串非常紧凑,只需为终止符额外花费1个字节,而不是一个完整的额外指针 但为了提高性能,显
我想不出答案。哪种方法更有效?为什么?排序列表与普通列表在查找结尾方面有什么不同?提前感谢。最好的目的是什么?尺寸效率?隐式长度的C字符串非常紧凑,只需为终止符额外花费1个字节,而不是一个完整的额外指针 但为了提高性能,显式长度字符串和数组更容易使用,特别是使用SIMD:在进入展开循环之前,可以检查是否至少还有N个元素。比较glibc的x86-64 SSE2对
memchr
和strchr
的实现:如果字符串的末尾正好位于页面的末尾,您确实必须使用strchr
跳过环,以确保您不会读入未映射的页面
对于大于等于16字节的大小,对齐处理可能更简单,但实际上glibc选择避免缓存线拆分。但请注意,一旦它达到64字节对齐边界:基于缓冲区结束的循环条件只是
/子$64,%rdx
,没有任何每字节的工作jbe L(exit_loop)
注意
/和L$4095、%eax
以检查是否靠近跨页,以及额外的SIMD工作以检查cmpl$4032、%eax
以及并行检查的16个字节中的每个字节中的目标字符0