레지스터가 뭔데 - CS:APP 3.4

2025. 4. 7. 19:20·CS:APP

이거 아니다

C 코드가 변수, 포인터, 배열 등 사용할 때
실제 어셈블리에서는 어떻게 데이터에 접근하는지

개요

  • CPU에는 16개의 64비트 범용 레지스터가 있음
  • 레지스터는 포인터, 정수, 인자, 지역변수 등을 담는다
  • 한 레지스터는 다양한 크기로 쪼개서 접근이 가능(%rax, %eax, %ax, %al)
  • 어떤 명령어들은 8바이트 전부를 쓰고, 어떤 명령어는 일부만 씀
  • 그 일부만 쓸 때 상위 바이트들이 어떻게 처리되는지가 중요

Caller, Callee saved 레지스터가 7종 더 있으나 이 9가지를 외우자


참고

레지스터 뷰 계열의 차이

  • 전통 계열 (8086 때 부터 존재)
    • %ax, %bx, %cx, %dx 계열
    • 하위 8비트 : %al, %bl, %cl, %dl
    • 특징 : 레거시 구조, OS/컴파일러 호환성 높음
  • 64비트 확장 계열 (x86-64부터)
    • %rsi, %rdi, %rbp, %r8~%r15
    • 하위 8비트 : %sil, %dil, %bpl, %spl, %r8b ~ %r15b
    • 특징 : 최신 아키텍처로, 특정 상황에만 적용

왜 알아야 하나?
”전혀 다른 뿌리를 가진 하위 레지스터”는 혼용이 불가함

📌출처 : Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1, Section 3.4.1.1

“In 64-bit mode, an instruction cannot reference legacy high-bytes (AH, BH, CH, DH) and one of the new byte registers at the same time (e.g., the low byte of RAX, or R8B).”

  • 레거시 상위 바이트 레지스터 (%ah, %bh, %ch, %dh)는 REX prefix가 포함된 명령어에서 사용 불가능함.
  • 동시에 REX 계열 바이트 레지스터 (%sil, %dil, %spl, %bpl, %r8b ~ %r15b) 와 혼용 불가.
  • 코드 짤 때 혼용 시도하면 assembler 에러 뜸

레지스터 뷰 계층 구조

%rax 레지스터를 통한 예제

64비트 - %rax, 32비트 - %eax, 16비트 - %ax, 8비트 - %al

  • 이는 레지스터 하나가 여러 크기의 데이터를 담을 수 있음을 보임
  • 어셈블리 연산은 이 하위조각 들 중 일부만 사용
      • 하위조각 들 중 일부만 사용한다
        → 레지스터 전체를 쓰지 않고, 일부분만 연산 대상으로 삼을 수 있다. 동시에 서로 쓰지못한다는 뜻은 아님
      • 즉 “%rax를 쓰고있으면 %al을 쓰지 못한다” 가 아닌
        ”%rax, %eax, %ax, %al은 물리적으로 같은 레지스터의 다른 길이 뷰임”
        상황 가능 여부 주의할 점
        %rax 쓰는 중에 %al 접근 ✅ 가능 같은 레지스터의 하위 조각이라 값 꼬일 수 있음
        %rax, %eax, %ax 동시 사용 ✅ 가능 근데 영향을 주고받으니까 주의해서 써야 함
        %eax에 쓰면 상위 초기화? ✅ 맞음 %rax 상위 32비트 자동 0으로 초기화됨
        %al, %ax는 상위 영향 없음 ✅ 맞음 위험할 수 있음 (기존 쓰레기값 남아 있음)
  %rax = 64비트 전체
  %eax = 하위 32비트
  %ax  = 하위 16비트
  %al  = 하위 8비트 (LSB)
  %ah  = 상위 8비트 (16비트 중 상위)

32비트 mov는 zero-extend됨

“왜 %eax에 값을 넣으면 %rax 상위 비트가 0으로 초기화될까?”

x86-64 채택 방식임(IA32)

  • 즉, 32비트 레지스터에 값을 저장하면 상위 32비트가 0이 됨
  • 반면, 8비트(%al)이나 16비트(%ax)는 상위 비트 안건드림
728x90

'CS:APP' 카테고리의 다른 글

mov 인스트럭션 - CS:APP 3.4.2  (0) 2025.04.07
오퍼랜드 식별자(operand specifier 어셈블리의 시작과 끝 - CS:APP 3.4.1  (0) 2025.04.07
GCC는 C를 어떻게 기계어로 짜깁기할까? - CS:APP 3.2 요약과 인사이트  (0) 2025.04.07
암달의 법칙 (Amdahl's law)  (0) 2025.04.07
캐시와 저장장치의 상관관계  (0) 2025.03.21
'CS:APP' 카테고리의 다른 글
  • mov 인스트럭션 - CS:APP 3.4.2
  • 오퍼랜드 식별자(operand specifier 어셈블리의 시작과 끝 - CS:APP 3.4.1
  • GCC는 C를 어떻게 기계어로 짜깁기할까? - CS:APP 3.2 요약과 인사이트
  • 암달의 법칙 (Amdahl's law)
ahpicl64
ahpicl64
in the clouds
  • ahpicl64
    구름
    ahpicl64
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • WIL (4)
      • Jungle (36)
      • AWS (2)
      • SQL (2)
      • CS:APP (17)
      • Algorithm (10)
      • K8s (7)
      • 자료 구조 (10)
      • Spring (4)
      • React (0)
      • 운영체제 (1)
      • 기타등등 (2)
      • 이야기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Spring
    어셈블리
    CSAPP
    queue
    알고리즘
    DB
    IAM
    부하테스트
    자료구조
    python
    DevOps
    github actions
    AWS
    k8s
    Spring boot
    EC2
    트러블슈팅
    컴퓨터시스템
    CloudFront
    S3
  • 02-21 08:19
  • hELLO· Designed By정상우.v4.10.3
ahpicl64
레지스터가 뭔데 - CS:APP 3.4
상단으로

티스토리툴바