x86架构允许字符串指令使用或不使用重复前缀。但是如果没有重复前缀,他们似乎没有做任何有趣的事情。例如,没有REP的MOVS可以用简单的MOV替换。
有没有充分的理由在没有REP的情况下使用MOVS(和STOS,SCAS,CMPS)?或者这只是x86指令集的无用特性?
答案 0 :(得分:3)
是。不一定是故意的,但你可以使用它们进行某种优化。
例如,使用movs
而不是
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
在这里不起作用,但由于视频内存中的两个连续字节之一是特定字符的属性字节。在这种情况下,它是一个预期的功能。