Your code seems to be doing something much more complicated than necessary. After mov eax, some_str
, we have that eax
points to one of the bytes that wants to be swapped, and eax+4
points to the other. So just load them into two 8-bit registers and then store them back the other way around.
mov eax, some_str
mov cl, [eax]
mov dl, [eax + 4]
mov [eax + 4], cl
mov [eax], dl
And you’re done and can proceed to write out the result.
Note it isn’t necessary to load the pointer into eax
first; you could also do
mov cl, [some_str]
mov dl, [some_str + 4]
mov [some_str + 4], cl
mov [some_str], dl
If you really wanted to have two different registers to point to the two different bytes: first of all, they need to be 32-bit registers. Trying to address memory in 32-bit mode using 16-bit registers si, di
is practically never going to work. Second, mov edi, [eax]
would load edi
with the contents of the memory at location eax
, which is some bytes of your string, not a pointer. You’d want simply mov edi, eax
. For the second one, you can use lea
to do the arithmetic of an effective address calculation but keep the resulting pointer instead of doing a load. So I think the way to turn your code into something in the original (inefficient) spirit, but correct, would be
mov edi, eax
lea esi, [eax+4]
mov dl, [edi]
mov al, [esi]
mov [esi], dl
mov [edi], al
CLICK HERE to find out more related problems solutions.