What do square brackets mean in x86 assembly?

前端 未结 2 1222
逝去的感伤
逝去的感伤 2020-12-28 17:27

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 eb         


        
2条回答
  •  别那么骄傲
    2020-12-28 17:57

    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.

提交回复
热议问题