首页 文章

有没有理由使用没有重复前缀的MOVS / CMPS / STOS / SCAS?

提问于
浏览
3

x86架构允许字符串指令使用或不使用重复前缀 . 但是如果没有重复前缀,他们似乎没有做任何有趣的事情 . 例如,没有REP的MOVS可以用简单的MOV代替 .

没有REP,是否有充分的理由使用MOVS(和STOS,SCAS,CMPS)?或者这只是x86指令集的无用特性?

1 回答

  • 3

    是 . 不一定是故意的,但你可以使用它们进行某种优化 .

    例如,它比使用 movs 更快(假设rsi,rsi指向正确的位置)

    mov rax,[whatever1]
    mov [whatever2],rax
    

    对于其他人,我现在不确定,但我猜想可以查看执行时间 . 实际上,增量/减量 rsi, rdi 会产生副作用 .

    此外,在低级模式下打印C样式字符串(无格式或特殊字符;直接视频内存访问)如下所示:

    ; ...
    _load_char:
        lodsb
        or al,al
        jz _end_of_string
        stosw
        jmp _load_char
    _end_of_string:
        ; ...
    

    在这里,您需要检查加载的每个单个字符,并确定是否已达到字符串的结尾,因此您无法使用 rep . 虽然有人会想到 repz movsb 在这里不起作用,因为视频mem中的两个连续字节之一是特定字符的属性字节 . 在这种情况下,它是一个预期的功能 .

相关问题