1. ホーム
  2. assembly

[解決済み] x86アセンブリの角括弧の意味は何ですか?

2022-02-28 22:16:45

質問

私はアセンブリの初心者で、非常に基本的な質問があります。

この4つのコマンドの違いは何ですか?

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

括弧は、"アドレスの値を取得する"という意味だそうです。しかし、では、この最初の行は実際に何をするのでしょうか?eaxの値をebxに移動しているのではないのでしょうか?もしそうなら、括弧の意味は何なのでしょうか?

どうすれば解決するのか?

非常に簡単な例として、EAXとEBXの2つのレジスタしかないCPUがあるとします。

<ブロッククオート

mov ebx, eax

の値を単純にコピーします。 eaxebx 登録

 | 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アーキテクチャで禁止されています。 メモリからメモリへの移動はできません .

そのため、括弧を使用することは 参照元 の操作になります。