Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在程序集中查找列表的结尾_Assembly - Fatal编程技术网

Assembly 在程序集中查找列表的结尾

Assembly 在程序集中查找列表的结尾,assembly,Assembly,我是x86汇编的新手。在我学习的书中,我遇到了一个问题: 我们讨论了三种查找列表结尾的方法:使用特殊数字、使用结束地址和使用长度计数。你认为哪种方法最好?为什么?如果知道列表已排序,您会使用哪种方法?为什么? 使用一个特殊的数字是指将一个数字放在列表的末尾,当到达该数字时停止 我想不出答案。哪种方法更有效?为什么?排序列表与普通列表在查找结尾方面有什么不同?提前感谢。最好的目的是什么?尺寸效率?隐式长度的C字符串非常紧凑,只需为终止符额外花费1个字节,而不是一个完整的额外指针 但为了提高性能,显

我是x86汇编的新手。在我学习的书中,我遇到了一个问题:

我们讨论了三种查找列表结尾的方法:使用特殊数字、使用结束地址和使用长度计数。你认为哪种方法最好?为什么?如果知道列表已排序,您会使用哪种方法?为什么?

使用一个特殊的数字是指将一个数字放在列表的末尾,当到达该数字时停止


我想不出答案。哪种方法更有效?为什么?排序列表与普通列表在查找结尾方面有什么不同?提前感谢。

最好的目的是什么?尺寸效率?隐式长度的C字符串非常紧凑,只需为终止符额外花费1个字节,而不是一个完整的额外指针

但为了提高性能,显式长度字符串和数组更容易使用,特别是使用SIMD:在进入展开循环之前,可以检查是否至少还有N个元素。比较glibc的x86-64 SSE2对
memchr
strchr
的实现:如果字符串的末尾正好位于页面的末尾,您确实必须使用
strchr
跳过环,以确保您不会读入未映射的页面


  • 对于大于等于16字节的大小,对齐处理可能更简单,但实际上glibc选择避免缓存线拆分。但请注意,一旦它达到64字节对齐边界:基于缓冲区结束的循环条件只是
    子$64,%rdx
    /
    jbe L(exit_loop)
    ,没有任何每字节的工作

  • 注意
    和L$4095、%eax
    /
    cmpl$4032、%eax
    以检查是否靠近跨页,以及额外的SIMD工作以检查
    0
    以及并行检查的16个字节中的每个字节中的目标字符

您需要定义正在使用的列表。序列表?链表?循环列表?这是链表还是数组?在这两种情况下,使用指向结尾的指针显然是找到结尾的最佳方式:)对于数组,长度几乎一样好,只需将其添加到开头即可。特殊编号始终意味着您必须扫描整个列表。对于排序列表,您不需要常数终止符,可以动态选择它,使其与排序顺序相反。这样做的好处是,您可以将所有数字存储在列表中,而不必指定一个本身不能作为列表一部分的特殊值。但空列表仍然存在问题。Book并没有指定它是数组还是链表。我想这两个问题都包括在内。谢谢,现在清楚了。这是一个开放式的问题。在不同的情况下,最好采用不同的方法。这个问题的目的是让您思考每种方法的优缺点,权衡是什么,以及在特定应用程序中如何选择它们。但是没有一个正确的答案。