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.