LEA - アドレスのロード
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 19/45。
これまで、メモリからレジスターに値をロードするためにmovを使用してきました。しかし、値そのものが必要ない場合もあります。必要なのはaddress自体です。
LEA は Load Effective Address を意味します。メモリーにアクセスせずにメモリーの address を計算し、その address を register に入れます。
構文:
lea register, [address]MOV vs LEA:
| Instruction | 動作 |
|---|---|
mov al, [number] | メモリに移動し、内部の値を取得して、alに入れます |
lea rsi, [number] | メモリには移動しません。numberのaddressを計算して、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 バイトのアドレスこれは配列やデータ構造を扱う際に役立ちます。
チャレンジ
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド