x86架构允许字符串指令使用或不使用重复前缀 . 但是如果没有重复前缀,他们似乎没有做任何有趣的事情 . 例如,没有REP的MOVS可以用简单的MOV代替 .
没有REP,是否有充分的理由使用MOVS(和STOS,SCAS,CMPS)?或者这只是x86指令集的无用特性?
是 . 不一定是故意的,但你可以使用它们进行某种优化 .
例如,它比使用 movs 更快(假设rsi,rsi指向正确的位置)
movs
mov rax,[whatever1] mov [whatever2],rax
对于其他人,我现在不确定,但我猜想可以查看执行时间 . 实际上,增量/减量 rsi, rdi 会产生副作用 .
rsi, rdi
此外,在低级模式下打印C样式字符串(无格式或特殊字符;直接视频内存访问)如下所示:
; ... _load_char: lodsb or al,al jz _end_of_string stosw jmp _load_char _end_of_string: ; ...
在这里,您需要检查加载的每个单个字符,并确定是否已达到字符串的结尾,因此您无法使用 rep . 虽然有人会想到 repz movsb 在这里不起作用,因为视频mem中的两个连续字节之一是特定字符的属性字节 . 在这种情况下,它是一个预期的功能 .
rep
repz movsb
1 回答
是 . 不一定是故意的,但你可以使用它们进行某种优化 .
例如,它比使用
movs
更快(假设rsi,rsi指向正确的位置)对于其他人,我现在不确定,但我猜想可以查看执行时间 . 实际上,增量/减量
rsi, rdi
会产生副作用 .此外,在低级模式下打印C样式字符串(无格式或特殊字符;直接视频内存访问)如下所示:
在这里,您需要检查加载的每个单个字符,并确定是否已达到字符串的结尾,因此您无法使用
rep
. 虽然有人会想到repz movsb
在这里不起作用,因为视频mem中的两个连续字节之一是特定字符的属性字节 . 在这种情况下,它是一个预期的功能 .