Question

I'd written the function to swap two integers, I want to take both values and then place it to the variables:

inline void swap_fast(int32& a, int32& b)
{
    ASM // __asm {
        mov eax, [a]
        mov ebx, [b]
        mov [a], ebx
        mov [b], eax
    ENDASM // }
}

But it seems like I'm taking the addresses, not the values.

EAX = 0023FEB0 EBX = 0023FEA4

Where did I mistaken?

Was it helpful?

Solution

From compiled code point of view references are pointers (that's why they behave like pointers). It's compiler that doesn't let you manage them as pointers in your C++ code (C++, not C because C has not references).

For this reason yes, you have pointers then you have to deference them to swap variable values. For an example of (working) assembly code take a look to this post here on SO.

Moreover I'd suggest to use __declspec(naked) too so you can write your own short prolog/epilog (otherwise performance benefit of a custom assembly function is pretty small, if there is a benefit at all).

That said you don't even need to use a register for that and you can do it with stack, just pop in reverse order:

__declspec(naked) void swap_fast(int32& a, int32& b)
{
    __asm
    {
        push [a]
        push [b]
        pop [a]
        pop [b]
    }
}

Same can be done through a register (as temporary variable as you're doing, just do not deference pointers) or with xchg, I suppose out there there are a plethora of different algorithms to perform swap in C, C++ and assembly.

Important note about performance: actually I don't know which method is faster; probably a macro with a temporary (register?) variable has same speed as our smart assembly code because compiler will be free to optimize generated assembly much better...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top