在一段系统代码中(在Delphi中),我找到了这个序列($表示" hex"):
DB $49,$C7,$C0,$80,$00,$00,$00 // MOV R8, 128
实际上,它在调试器中将R8设置为128。但不会:
MOV R8D,$80 // or $00000080
做同样的事情?有没有什么特别的关于前一个字节序列(速度,设置一些标志,等等)可能使代码的作者喜欢它使用R8D的方式?
根据要求,提供更多代码:
// RAX/XMM : 16BYTES VALUE. RDX: COUNT. RCX: DEST. ADDRESS. (16BTYES ALIGNED)
@@COPY128:
DB $49,$C7,$C0,$80,$00,$00,$00 // MOV R8, 128
CMP RDX,R8
JL @@COPY64
SUB RDX,R8
DB $0F,$1F,$80,$00,$00,$00,$00 // NOP DWORD PTR [EAX + 00000000H] ; NOP(7)
@@COPY128LOOP:
MOVDQA [RCX ],XMM0
MOVDQA [RCX + $10],XMM0
MOVDQA [RCX + $20],XMM0
MOVDQA [RCX + $30],XMM0
MOVDQA [RCX + $40],XMM0
MOVDQA [RCX + $50],XMM0
MOVDQA [RCX + $60],XMM0
MOVDQA [RCX + $70],XMM0
ADD RCX,R8
SUB RDX,R8
JG @@COPY128LOOP
ADD RDX,R8
@@COPY64:
这是一个名为_FillChar
的例程的一部分,它用一个字节(或字符)的倍数填充一块内存,或多或少像其他语言中的memset()
。