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

时间:2014-10-22 17:08:46

标签: assembly x86

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

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

1 个答案:

答案 0 :(得分: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在这里不起作用,但由于视频内存中的两个连续字节之一是特定字符的属性字节。在这种情况下,它是一个预期的功能。