LEA - 주소 로드
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 19번째.
지금까지 여러분은 메모리에서 레지스터로 값을 로드하기 위해 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 레지스터에 로드하는 어셈블리 코드 한 줄을 작성하세요.
직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.