Menu
Coddy logo textTech

LEA - アドレスのロード

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

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

LEALoad Effective Addressの略です。これはメモリアドレスを計算し、メモリにアクセスすることなく、そのアドレスをレジスタに格納します。

構文:

lea register, [address]

MOV vs LEA:

命令動作
mov al, [number]メモリにアクセスし、中のを取得して al に格納します
lea rsi, [number]メモリにはアクセスしません。numberアドレスを計算し、rsi に格納します

このように考えてみてください:

  • mov = 箱を開けて、中身を取り出す
  • lea = 箱の番号(アドレス)を紙に書き留める

例:

number db 42        ; 値42が特定のアドレスに格納されます

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

なぜLEAが必要なのですか?

アセンブリでは、文字列を表示したり、メモリの場所を関数に渡したりする場合、値ではなくアドレスが必要になります。writeシステムコール(第5章で学習します)は、rsiにアドレスが入っていることを想定しています。

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

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

基礎のすべてのレッスン