方括号在x86汇编中的含义是什么?

时间:2018-02-04 13:14:16

标签: assembly memory x86 intel-syntax

我对集会很新,并且有一些非常基本的问题。

这四个命令有什么区别?

mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]

他们说括号表示"得到地址的值"。但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果确实如此,那么括号的重点是什么?

2 个答案:

答案 0 :(得分:5)

让我们举一个非常简单的例子,假设我们有一个只有两个寄存器的CPU,EAX和EBX。

  

mov ebx,eax

只需将eax中的值复制到ebx寄存器

即可
 | EAX : 0123456 |   ---->   | EAX : 0123456 |
 | EBX : 0000000 |   ====>   | EBX : 0123456 |

现在让我们添加一些内存空间

ADDRESS         VALUE
000000          6543210
000004          5189784
000008          1698791
00000C          9816517
000010          9816875
000014          5498156
  

mov [ebx],eax

eax中的值移动到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]

将值从eax中包含的内存地址移动到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]

最后,您会认为会将eax中包含的内存地址的值移动到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 

但x86架构不允许这种组合。 You cannot move from memory to memory

括号的使用因此等同于dereferencing操作。

答案 1 :(得分:2)

您在说明中错过了操作数分隔符,。没有它,我还不知道任何汇编程序。我在引号中修正了它。

在x86汇编中,一些寄存器可用作数据寄存器作为地址寄存器(与其他架构不同)。这些寄存器称为GPR(&#34;通用寄存器&#34;)。它们可以包含32位值 32位地址。他们的名字&#34;是EAXEBXECXEDXESIEDIESPEBP。< / p>

  

mov ebx,eax

会将EAX中的值移至EBX

  

mov [ebx],eax

确实将EAX中的值移动到EBX

中32位地址指向的32位DWORD值
  

mov ebx,[eax]

确实将EAX中32位地址指向的32位DWORD值移动到EBX

  

mov [ebx],[eax]

是32位Intel汇编中的无效指令,因为基本x86汇编在一(双操作数)指令中不支持两个内存操作数。具有三个或四个操作数的较新指令(SSE,AVX)能够使用多个内存操作数。这是更复杂的指令编码(使用指令前缀)的结果。