Assembly 从Masm中的转储读取字节

Assembly 从Masm中的转储读取字节,assembly,masm32,Assembly,Masm32,在我的应用程序的一部分中,我需要读取一个字节 invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax; eax = size mov hMemory,eax invoke GlobalLock,hMemory mov pMemory,eax 如何将pMemory的前4个字节“移动”到eax??然后将接下来的2个字节移到ebx 例如: include \masm32\include\masm32rt.inc .data

在我的应用程序的一部分中,我需要读取一个字节

invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax; eax = size   
mov  hMemory,eax
invoke GlobalLock,hMemory
mov  pMemory,eax   
如何将pMemory的前4个字节“移动”到eax??然后将接下来的2个字节移到ebx

例如:

include \masm32\include\masm32rt.inc

.data
    hMemory DWORD ?
    pMemory DWORD ?
    myMemory DB 12h, 34h, 56h, 78h, 12h, 34h

.code
main PROC
    mov eax, 32
    invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax; eax = size
    mov  hMemory,eax
    invoke GlobalLock,hMemory
    mov  pMemory,eax

    mov ecx, LENGTHOF myMemory
    lea esi, myMemory
    mov edi, pMemory
    rep movsb                       ; [pMemory] = 12 34 56 78 12 34

    mov esi, pMemory
    mov eax, [esi]                  ; eax = 78563412
    bswap eax                       ; eax = 12345678

    movzx ebx, word ptr [esi+4]     ; ebx = 00003412
    xchg bh, bl                     ; ebx = 00001234
  ; ror bx, 8                       ; equivalent to `xchg bh, bl`

    printf ("eax = %08X\nebx = %08X\n", eax, ebx)

    xor eax, eax                    ; Return 0
    ret
main ENDP

END main
1A5288。。。。123456781234

所以


根据您的示例,您正在使用“little endian”字节顺序。
12 34 56 78
的字节序列作为
78563412
加载到32位寄存器中。您可以使用
BSWAP
反转32/64位寄存器中的字节顺序。在第二种情况下,需要反转32位寄存器下两个字节的字节顺序。以下是
XCHG
ROR 8 | ROL 8
的相应说明

例如:

include \masm32\include\masm32rt.inc

.data
    hMemory DWORD ?
    pMemory DWORD ?
    myMemory DB 12h, 34h, 56h, 78h, 12h, 34h

.code
main PROC
    mov eax, 32
    invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax; eax = size
    mov  hMemory,eax
    invoke GlobalLock,hMemory
    mov  pMemory,eax

    mov ecx, LENGTHOF myMemory
    lea esi, myMemory
    mov edi, pMemory
    rep movsb                       ; [pMemory] = 12 34 56 78 12 34

    mov esi, pMemory
    mov eax, [esi]                  ; eax = 78563412
    bswap eax                       ; eax = 12345678

    movzx ebx, word ptr [esi+4]     ; ebx = 00003412
    xchg bh, bl                     ; ebx = 00001234
  ; ror bx, 8                       ; equivalent to `xchg bh, bl`

    printf ("eax = %08X\nebx = %08X\n", eax, ebx)

    xor eax, eax                    ; Return 0
    ret
main ENDP

END main