Menu
Coddy logo textTech

LEA - 주소 로드

Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 19번째.

지금까지 여러분은 메모리에서 레지스터로 을 로드하기 위해 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 레지스터에 로드하는 어셈블리 코드 한 줄을 작성하세요.

직접 해보기

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실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨