Menu
Coddy logo textTech

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]
challenge icon

チャレンジ

メモリアドレス 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン