I'm very new to assembly, and have some very basic questions.
What is the difference between these four commands?
mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
They say that the brackets mean "get the value of the address". But what, then, does that very first line really do? Does it not move the value of eax into ebx? If it does, then what are the point of the brackets?
Let's make a very simple example and imagine we have a CPU with only two registers, EAX and EBX.
mov ebx, eax
Simply copies the value in eax
to the ebx
register
| EAX : 0123456 | ----> | EAX : 0123456 |
| EBX : 0000000 | ====> | EBX : 0123456 |
Now let's add some memory space
ADDRESS VALUE
000000 6543210
000004 5189784
000008 1698791
00000C 9816517
000010 9816875
000014 5498156
mov [ebx], eax
Moves the value in eax
to the memory address contained in ebx
.
| EAX : 0123456 | --no--> | EAX : 0123456 |
| EBX : 0000008 | --change--> | EBX : 0000008 |
ADDRESS VALUE VALUE
000000 6543210 ----> 6543210
000004 5189784 ----> 5189784
000008 1698791 ====> 0123456
00000C 9816517 ----> 9816517
000010 9816875 ----> 9816875
000014 5498156 ----> 5498156
mov ebx, [eax]
Moves the value from the memory address contained in eax
to ebx
.
| EAX : 0000008 | ----> | EAX : 0000008 |
| EBX : 0123456 | ====> | EBX : 1698791 |
ADDRESS VALUE
000000 6543210
000004 5189784
000008 1698791
00000C 9816517
000010 9816875
000014 5498156
mov [ebx], [eax]
This, finally, you would think would move the value from the memory address contained in eax
to the memory address contained in ebx
.
| EAX : 0000008 | --no--> | EAX : 0000008 |
| EBX : 000000c | --change--> | EBX : 000000c |
ADDRESS VALUE VALUE
000000 6543210 ----> 6543210
000004 5189784 ----> 5189784
000008 1698791 ----> 1698791
00000C 9816517 ====> 1698791
000010 9816875 ----> 9816875
000014 5498156 ----> 5498156
But this combination is disallowed by the x86 architecture. You cannot move from memory to memory.
The use of brackets is therefore equivalent to a dereferencing operation.