将R8设置为128的异常字节序列

时间:2017-05-15 11:00:25

标签: assembly x86-64

在一段系统代码中(在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()

0 个答案:

没有答案