2015-06-08 4 views
1

В одной части моего приложения мне нужно прочитать байтыЧтение байтов из Dump в MASM

invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT, eax; eax = size 
mov hMemory,eax 
invoke GlobalLock,hMemory 
mov pMemory,eax 

Как «двигаться» первые 4 байта pMemory в EAX ?? а затем переместить следующие 2 байта в ebx ??

Пример:

1A5288 .... 12 34 56 78 12 34

так

eax = 12345678 
ebx = 000

ответ

2

Согласно вашему примеру, вы боретесь с "Little Endian" порядком байтов. Последовательность байтов 12 34 56 78 загружается в 32-разрядный регистр как 78563412. Вы можете изменить порядок байтов в 32/64-битном регистре с помощью BSWAP. Во втором случае вам нужно отменить порядок байтов в нижних двух байтах 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 = 000
    ; 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 

 Смежные вопросы

  • Нет связанных вопросов^_^