我刚接触汇编,并且有一些非常基本的问题。
这四个命令有什么区别?
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/