X86-64 · EFFECTIVE ADDRESS · REGISTER WIDTH

LEA는 주소를 계산하지만 메모리를 읽지는 않습니다

대괄호가 같아도 LEA와 MOV의 결과는 다릅니다. 주소 크기·결과 크기·실행 비용을 나누어 읽습니다.

대괄호 안의 식을 결과로 받습니다

Intel 표기에서 lea rax, [rbx + rcx*4 + 8]은 주소의 offset을 계산합니다. rbx=0x1000, rcx=3이면 rax=0x1014입니다. 같은 주소 표현을 사용하는 mov rax, [rbx + rcx*4 + 8]은 그 위치에서 8바이트를 읽습니다. LEA가 성공했다고 해서 메모리 매핑이나 읽기 권한이 확인된 것은 아닙니다.

분기와 관측 지점을 나눈 자체 개념도
  1. 입력: rbx=0x1000, rcx=3

  2. 계산: 0x1000 + 3×4 + 8 = 0x1014

  3. LEA의 출력: rax=0x1014; 메모리 내용은 읽지 않음

Intel SDM 089 · LEA 표 3-58

주소 크기와 결과 크기는 별개입니다

64비트 모드의 lea eax, [rdi + rdi*4 + 3]은 64비트 주소 계산 결과의 하위 32비트를 EAX에 씁니다. 32비트 레지스터 쓰기 규칙에 따라 RAX 상위 32비트는 0이 됩니다. rdi=0x100000001이면 계산값 0x500000008에서 rax=8을 얻습니다. 이 기계 명령의 잘림을 C의 signed overflow 규칙과 동일시하지 않습니다.

LEA는 상태 플래그를 바꾸지 않습니다. 따라서 덧셈과 같은 숫자가 나오는 경우에도 ADD로 기계적으로 바꾸면 뒤의 조건 분기 의미가 달라질 수 있습니다.

64비트 모드 레지스터 결과 규칙

RIP 상대 주소는 다음 명령을 기준으로 합니다

RIP 상대 주소는 다음 명령의 RIP에 signed 32비트 변위를 더합니다. 범위는 약 ±2 GiB이며, 임의의 64비트 주소를 한 명령으로 담는 방식이 아닙니다. 심벌 표현의 문법과 relocation은 assembler·linker에 따라 확인해야 합니다.

RIP 상대 주소 형식

한 명령이라고 해서 더 빠른 것은 아닙니다

LEA의 latency와 사용 가능한 실행 포트는 CPU와 주소 형식에 따라 달라집니다. Intel VTune도 일부 형식의 Slow LEA를 별도 지표로 다룹니다. 컴파일러 옵션과 대상 CPU를 고정한 뒤 전체 루프의 실행 시간·의존 경로를 비교해야 합니다. 위 숫자는 계산 예시이며 실기 벤치마크가 아닙니다.

VTune 2024.2 CPU 지표