Menu
Coddy logo textTech

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]
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腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド