MOV レジスタからメモリへ
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 18/45。
メモリからレジスタにデータを読み込む方法がわかったので、今度はその逆、レジスタからメモリにデータを格納することを学びます。
構文:
mov [address], registerbrackets [ ] は、「register から値を into この memory address に格納する」という意味です。
次のように考えてみてください:
メモリアドレス destination に空の箱があると想像してください。レジスタに値が入っています(たとえば、al には number 7 が含まれています)。
次のように書くと:
mov [destination], alCPU に、「al レジスタ(7)から値を取り出し、それを destination という名前の箱に入れてください」と伝えていることになります。
この命令が実行されると、メモリアドレス destination には値 7 が格納されます。al の値はそこに残ります。削除されることはありません。
例:
mov al, 7 ; alレジスタに7を入れる
mov [destination], al ; alからの値をメモリアドレス"destination"に格納する注: この演習では、メモリ内のデータは 1 バイト(8 ビット)です。そのため、al を使用します。これは、そのサイズに対応する 8 ビットレジスタです。レジスタのサイズについては、後でさらに詳しく学びます。
重要なルール:
| ルール | 説明 |
|---|---|
| brackets は必須です | mov destination, al は Wrong です |
| destination は memory address でなければなりません | [destination] のようなラベルを使用してください |
| サイズは一致していなければなりません | この演習では、al(8 ビット)を使用してください |
よくある間違い:
; 誤り: ブラケットが欠けている
mov destination, al
; 正しい: 値をメモリに格納する
mov [destination], al以下のチャレンジでは、メモリアドレス destination はすでに作成されています。独自のデータを作成する方法については、第3章で学びます。今は、MOV命令に集中してください。
チャレンジ
次の操作を行うアセンブリコードを2行記述してください:
- 数値9を
alレジスタに入れる alの値をメモリアドレスdestinationにStoreする
(メモリアドレス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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド