我刚接触汇编,并且有一些非常基本的问题。

这四个命令有什么区别?

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


他们说方括号的意思是“获取地址的值”。但是,那第一行实际上是做什么的呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的意义是什么?

最佳答案

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


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操作。

关于assembly - 方括号在x86汇编中意味着什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48608423/

10-11 18:44