MOV メモリからレジスタへ
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 17/45。
これまで、数値を直接registerに移動する(即値)方法と、register間で値をコピーする方法を学びました。ここでは、memoryからregisterにdataを読み込む方法を学びます。
なぜこれが重要なのか:
第0章で学んだように、CPUはメモリを直接操作できません。まずデータをレジスタに読み込む必要があります。その方法は次のとおりです。
構文:
mov register, [address]角括弧 [ ] は、「このメモリアドレスに移動して、そこに stored されている値を取得する」という意味です。
次のように考えてみましょう:
メモリアドレス number に箱があると想像してください。その箱の中には値があり、たとえば数字の 5 が入っています。次のように書くと:
mov al, [number] ; メモリアドレス "number" から値を al にロードするCPUに次のように指示しています:「numberという名前の箱へ行き、その中にある値(この場合は5)を取り出して、alレジスタにコピーせよ。」
この命令が実行されると、値5はalに保存されます。アドレスnumberの箱の中にある元の値は、そのまま残ります。削除されることはありません。
重要なルール:
| ルール | 説明 |
|---|---|
| source は memory address でなければならない | [label] または [address] |
| 角括弧は必須 | mov al, myNumber は値ではなくaddressを読み込む |
| サイズを一致させる必要がある | memory にバイトが格納されている場合は、raxではなくalを使用する |
よくある間違い:
; 誤り: 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド