Search code examples
arraysassemblyindexingmasmirvine32

Assembly How should I increment the array if I want to switch values?


This is being compiled on Visual Studios 2015 with Kip Irvine.

The code is supposed to switch the 1st element with the 2nd element and the 3rd element with the 4th element and so on. It switches the values forward instead of just switching the two values. I added the index register with 2 to skip the 2nd element since it should not be switched. Is there something I am missing? Am I supposed to increment the array index differently or am I putting the wrong values in the wrong registers? Thanks in advance! Please don't just give me the answer.

The output is

Dump of offset 00AD6880


00020000 00050000 00090000 0000000A 0000000C

INCLUDE Irvine32.inc
.data
dwarray dword  0,2,5,9,10,12


.code
main proc
mov ebx, OFFSET dwarray
mov ecx, LENGTHOF dwarray
L1: cmp ebx, ecx
mov eax, [ebx]
mov edx, [ebx+1]
mov [ebx+1], eax 
mov [ebx], edx
add ebx, 2
loop L1

; The four instructions below are fixed, the only variable is the name of the array  
mov    esi,OFFSET dwarray
mov    ecx,LENGTHOF dwarray
mov    ebx,TYPE dwarray
call   DumpMem
call WaitMsg
exit
main ENDP
END main

Solution

  • Your array elements are dword, double word, that means 4 bytes. So, in order to point to the elements you need to increase your pointer by 4 :

    dwarray dword  0,2,5,9,10,12
    .code
    main proc
    mov ebx, OFFSET dwarray
    mov ecx, 3                    ◄■■■ THE ARRAY CONTAINS 6 ELEMENTS, BUT THEY ARE PROCESSED
                                       IN PAIRS, SO THE LOOP SHOULD REPEAT HALF 6 (3).
    L1: ;cmp ebx, ecx             ◄■■■ UNNECESSARY?
    mov eax, [ebx]
    mov edx, [ebx+4]              ◄■■■ THE NEXT ELEMENT IS 4 BYTES AWAY.
    mov [ebx+4], eax              ◄■■■ AGAIN, THE NEXT ELEMENT IS 4 BYTES.
    mov [ebx], edx
    add ebx, 8                    ◄■■■ INCREASE BY 8 (THE SIZE OF 2 ELEMENTS PROCESSED).
    loop L1