User Tools

Site Tools


swapping_20the_20contents_20of_20two_20areas_20of_20memory

This is an old revision of the document!


Swapping the contents of two areas of memory

by Jon Ripley, August 2006

The Windows API provides several functions for manipulating blocks of memory but is missing a function to swap the contents of two areas of memory.

This function can be added to your programs by adding following routine:

      REM Call as: PROC_SwapMemory(addr1%, addr2%, size%)
      DEF PROC_SwapMemory(B%, D%, C%)
      PRIVATE memswap
      IF memswap=0 THEN
        LOCAL P%
        DIM P% 10
        [OPT 2
        .memswap
        mov al, [ebx]    ; load AL from byte in B%
        xchg al, [edx]   ; swap AL with byte at D%
        mov [ebx], al    ; store AL in byte at B%
        inc ebx          ; B%+=1
        inc edx          ; D%+=1
        loop memswap     ; C%-=1, if C% != 0 jump to memswap
        ret              ; return from the function
        ]
      ENDIF
      CALL memswap
      ENDPROC


To call this routine use the following code:

      PROC_SwapMemory(addr1%, addr2%, size%)

Here addr1% and addr2% are the addresses of the two blocks of memory to be swapped and size% is the number of bytes to swap.

SYS SwapMemory


This section is provided for advanced users and demonstrates techniques that may be of interest.

To provide a similar interface to other Windows API functions memory management functions it may be desirable to rewrite the SwapMemory function to be called using SYS. To do this add this alternative code to your program:

      DIM SwapMemory 27
      P% = SwapMemory
      [OPT 2
      ;entry sequence (using the _stdcall calling convention)
      push ebp           ; store the old base pointer
      mov ebp, esp       ; make the base pointer point to the current stack location
      ;                  ; which is where the parameters are
      mov ebx, [ebp+8]   ; load first parameter (addr1)
      mov edx, [ebp+12]  ; load second parameter (addr2)
      mov ecx, [ebp+16]  ; load third parameter (size)
      .mslp
      mov al,[ebx]       ; load AL from byte in addr1
      xchg al,[edx]      ; swap AL with byte at addr2
      mov [ebx],al       ; store AL in byte at addr1
      inc ebx            ; addr1 += 1
      inc edx            ; addr2 += 1
      loop mslp          ; size -= 1, loop until size = 0
      ;exit sequence
      mov esp, ebp       ; reset the stack
      pop ebp            ; restore the original base pointer
      ret 12             ; return from the function, clearing the stack
      ]


To call this routine from BASIC use the following code:

      SYS SwapMemory, addr1%, addr2%, size%


Here addr1% and addr2% are the addresses of the two blocks of memory to be swapped and size% is the number of bytes to swap.

To call this routine from assembler use the following code:

      push size%
      push addr2%
      push addr1%
      call SwapMemory


References


Core code suggested by Richard Russell on the BB4W Yahoo! Group. (Message)

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
swapping_20the_20contents_20of_20two_20areas_20of_20memory.1522502385.txt.gz · Last modified: 2024/01/05 00:16 (external edit)