MOV レジスタからメモリへ
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 18/45。
メモリからレジスタにデータをロードする方法を学んだので、次は、その逆であるレジスタからメモリへのデータのストア(保存)について学びます。
構文:
mov [address], registerかっこ [ ] は、「レジスタの値をこのメモリアドレスに格納する」ということを意味します。
次のように考えてみましょう:
メモリ番地 destination に空の箱があると想像してください。レジスタに値が入っています(例えば、al には数値の 7 が格納されています)。
次のように記述すると:
mov [destination], alCPUに対して次のように指示していることになります:「alレジスタの値(7)を取り出し、それをdestinationという名前のボックスに入れなさい。」
この命令が実行された後、メモリアドレス destination には値 7 が格納されます。al の値はそのまま残り、削除されません。
例:
mov al, 7 ; 7をalレジスタに格納
mov [destination], al ; alの値をメモリ番地 "destination" に格納注: この演習では、メモリ内のデータは1バイト(8ビット)です。そのため、alを使用します。これはサイズに一致する8ビットレジスタです。レジスタのサイズについては、後ほど詳しく学習します。
重要なルール:
| ルール | 説明 |
|---|---|
| ブラケット([])は必須です | mov destination, al は誤りです |
| 転送先はメモリアドレスである必要があります | [destination] のようなラベルを使用してください |
| サイズが一致している必要があります | この演習では、al(8ビット)を使用してください |
よくある間違い:
; 誤り: ブラケット(括弧)がありません
mov destination, al
; 正解: 値をメモリに格納します
mov [destination], al以下のチャレンジでは、メモリアドレス destination はあらかじめ作成されています。独自のデータを作成する方法については、第3章で学びます。今は、MOV命令だけに集中してください。
チャレンジ
以下の操作を行うために、アセンブリを2行記述してください:
- 数値の 9 を
alレジスタに格納する alの値をメモリアドレスdestinationに保存する
(メモリアドレス destination はあらかじめ作成されています。)
自分で試してみよう
section .data
msg db 'destination = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; solution.asm がここにインクルードされます
; これは destination と生徒の MOV 命令を定義します
%include "solution.asm"
; 表示のためにメモリから al に格納された値をロードします
mov al, [destination]
; それを保存します
mov r12, rax
; "destination = " を出力します
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; 値を出力します
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; 終了
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。