Home > Blockchain >  how to merge multiple arrays to one array in masm32
how to merge multiple arrays to one array in masm32

Time:06-26

I want to concatenate array1 array2 ... to one array how is fast way:

.data
array1      db  0CFh, 0C2h, 0ABh, 01Bh, 0C1h, 007h, 0F7h, 06Dh, 0DAh, 0F2h, 0DCh, 03Ch....; about 2000 dup
...
array2      db  0BFh, 03Dh, 087h, 0F1h, 0A6h, 097h, 0A6h, 05Bh, 010h, 0F2h, 051h, 05Eh ...

.data ?
arrayOut        dd    ?
.code
        invoke crt_memcpy, array, addr array1, sizeof array1
        mov ecx, [arrayOut]
        add ecx,sizeof array1
        invoke crt_memcpy,dword ptr[ecx], addr array2, sizeof array2    ???

I also try use code as below:

        mov eax, 0                             
        mov ecx, sizeof array1 *2   
        mov edi, 0
        mov esi, 0
L1:
        mov al, [array1   esi * TYPE BYTE]      
        movsx eax, al    
        mov arrayOut[esi], eax 
        cmp ecx,esi
        jbe GoOnNext
        inc esi     
        loop L1
GoOnNext:
        mov ecx, sizeof array2 *2
        mov edi,0
L2:                       
        mov bl, [array2   edi * TYPE BYTE]    
        movsx ebx, bl   
        mov arrayOut[esi], ebx   
        cmp ecx,edi
        jbe nextstep
        inc esi          
        add edi,1
        loop L2
nextstep:
        mov eax, arrayOut

But if the size of the array is large, I get the wrong result。

CodePudding user response:

But if the size of the array is large, I get the wrong result

With a declaration like arrayOut dd ?, there's not enough room to copy to! Based on the mention that both arrays contain about 2000 bytes, you could make this something like:

arrayOut db 4096 dup ?

Next is a basic way to copy a block of memory:

cld                         ; Makes the addresses ESI and EDI increment
mov  edi, OFFSET arrayOut   ; Destination
mov  esi, OFFSET array1     ; Source
mov  ecx, SIZEOF array1     ; Count
rep movsb

In order to concatenate, you then copy the second array but you don't modify the value in the destination register EDI. This way the second copy continues where the first copy left off.

mov  esi, OFFSET array2     ; Source
mov  ecx, SIZEOF array2     ; Count
rep movsb
  • Related