我对集会很新,并且有一些非常基本的问题。
这四个命令有什么区别?
mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
他们说括号表示"得到地址的值"。但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果确实如此,那么括号的重点是什么?
答案 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("通用寄存器")。它们可以包含32位值或 32位地址。他们的名字"是EAX
,EBX
,ECX
,EDX
,ESI
,EDI
,ESP
,EBP
。< / p>
mov ebx,eax
会将EAX
中的值移至EBX
。
mov [ebx],eax
确实将EAX
中的值移动到EBX
mov ebx,[eax]
确实将EAX
中32位地址指向的32位DWORD值移动到EBX
mov [ebx],[eax]
是32位Intel汇编中的无效指令,因为基本x86汇编在一(双操作数)指令中不支持两个内存操作数。具有三个或四个操作数的较新指令(SSE,AVX)能够使用多个内存操作数。这是更复杂的指令编码(使用指令前缀)的结果。