Menu
Coddy logo textTech

LEA - アドレスのロード

CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 19/45。

これまで、メモリからレジスターにをロードするためにmovを使用してきました。しかし、値そのものが必要ない場合もあります。必要なのはaddress自体です。

LEALoad Effective Address を意味します。メモリーにアクセスせずにメモリーの address を計算し、その address を register に入れます。

構文:

lea register, [address]

MOV vs LEA:

Instruction動作
mov al, [number]メモリに移動し、内部のを取得して、alに入れます
lea rsi, [number]メモリには移動しません。numberaddressを計算して、rsiに入れます

次のように考えてみましょう:

  • mov = 箱を開けて、中に入っているものを取り出す
  • lea = 箱の番号(address)を紙に書き留める

例:

number db 42        ; 値42はあるアドレスに格納されています

mov al, [number]    ; al = 42(値)
lea rsi, [number]   ; rsi = numberのアドレス(例: 0x402000)

なぜ LEA が必要なのでしょうか?

アセンブリで文字列を出力したり、メモリ位置を関数に渡したりする場合、必要なのは値ではなくaddressです。write syscall(第5章で学びます)は、rsiにaddressが格納されていることを想定しています。

LEA でできること(単純なアドレス以外):

LEA はアドレスを使って基本的な計算もできます。例:

lea rsi, [number + 5]   ; rsi = number + 5 バイトのアドレス

これは配列やデータ構造を扱う際に役立ちます。

challenge icon

チャレンジ

message のアドレスを rsi レジスタに読み込むアセンブリコードを 1 行書いてください。

自分で試してみよう

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; 学生の lea 命令が最初に実行される
    ; rsi は現在 message のアドレスを含んでいるはずです
    
    ; プレフィックスを出力
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; 学生がロードしたアドレスを使って文字列を出力する
    mov rax, 1
    mov rdi, 1
    ; rsi はすでにアドレスを持っている(学生のコードから)
    mov rdx, 6                    ; "Hello" + 改行 = 6 バイト
    syscall
    
    ; 終了
    mov rax, 60
    mov rdi, 0
    syscall
quiz icon腕試し

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

基礎のすべてのレッスン

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