MOV メモリからレジスタへ
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 17/45。
これまでに、数値をレジスタに直接移動(即値)したり、レジスタ間で値をコピーしたりしてきました。これからは、メモリからレジスタにデータをロードする方法を学びます。
これが重要な理由:
第0章を思い出してください:CPUはメモリと直接やり取りすることはできません。データはまずレジスタにロードされる必要があります。これがその方法です。
構文:
mov register, [address]角括弧 [ ] は、「このメモリアドレスに移動し、そこに格納されている値を取得する」という意味です。
このように考えてみてください:
メモリ番地 number に箱があると想像してください。その箱の中には値が入っています。例えば、数値の 5 です。次のように記述すると:
mov al, [number] ; メモリ番地 "number" から値を al にロードするCPUに次のように伝えています。「numberという名前のボックスに行き、中にある値(この場合は5)を取り出し、それをalレジスタにコピーしなさい。」
この命令が実行された後、値5がalに格納されます。アドレスnumberにあるボックス内の元の値はそのまま残り、削除されることはありません。
重要なルール:
| ルール | 説明 |
|---|---|
| ソースはメモリアドレスである必要があります | [label] または [address] |
| ブラケット(角括弧)は必須です | mov al, myNumber は値ではなくアドレスをロードします |
| サイズが一致している必要があります | メモリがバイトを格納している場合は、al を使用します(rax ではなく) |
よくある間違い:
; 誤り: 値ではなく myNumber のアドレスをロードします
mov al, myNumber
; 正解: myNumber に格納されている値をロードします
mov al, [myNumber]チャレンジ
メモリアドレス value から値を al レジスタにロードするアセンブリを1行記述してください。
自分で試してみよう
section .data
msg db 'al = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; 生徒のコードが最初に実行されます (alに値をロードします)
%include "solution.asm"
; alからの値を保存します
mov r12, rax
; "al = " を表示します
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; alの値を表示します
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。