LEA - アドレスのロード
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 19/45。
これまで、mov を使用してメモリからレジスタに値をロードしてきました。しかし、時には値ではなく、アドレスそのものが必要な場合があります。
LEAはLoad 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バイトこれは配列やデータ構造を扱う際に便利です。
チャレンジ
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。