어셈블리 기초, 스택 프레임

11월에 공부하고 메모장에 적어둔거 옮기기.. 까먹었을 때 보려고 간단하게 정리

 

레지스터

  • 범용 레지스터 (32bit)
    • 데이터 레지스터
      • EAX : 누산기레지스터, 곱셈 나눗셈
      • EBX : 베이스 레지스터, 메모리 주소 지정
      • ECX : 계수기, 반복 명령
      • EDX : 곱셈 나눗셈, 부호 확장 명령
    • 인덱스 레지스터
      • ESI : 다량 메모리 옮기거나 비교할 때 소스 주소
      • EDI : “ 목적지 주소
    • 포인터 레지스터
      • ESP : 스택포인터, 스택 최종점
      • EBP : 스택 함수 지역변수 주소
  • 세그먼트 레지스터 (16bit)
    • ES : 보조, 두 곳 이상의 저장영역 가리킬 때 DS 와 사용
    • CS : 코드 세그먼트, 프로그램 코드 시작 주소
    • SS : 스택 세그먼트, 스택 시작 주소
    • DS : 데이터 시작 주소
    • FS, GS : 보조 세그먼트 레지스터
  • 상태 레지스터 (32bit)
    • EIP : 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리 주소, 자동으로 증가 및 변경
    • EFLAGS : 플래그 저장

 

주소 지정 방식

  1. 즉시 지정방식 (앞 → 뒤)
    • mov $0x1, %eax
  2. 레지스터 지정방식 (앞 → 뒤)
    • mov%esp, %ebp
  3. 직접 주소 지정방식 (뒤 → 앞)
    • mov %eax, 0x80482f2
  4. 레지스터 간접 주소 지정방식 (앞 → 뒤)
    • mov (%ebx), %eax
    • () 안에 들어간 값의 주소
  5. 베이스 상대 주소 지정 방식 (앞 → 뒤)
    • mov 0x4(%esi), %eax
    • 4바이트 더한 주소의 값 (보통 다음 주소 의미)

 

명령어

  • mov S, D : S 위치의 데이터 복사해 D 위치에 저장
  • lea S, D : S 에서 지정된 주소를 D 로 로드
  • add opr1, opr2 : opr2 = opr1+opr2
  • sub opr1, opr2 : opr1 = opr1-opr2
  • inc D : 1++
  • dec D : 1--
  • jmp proc : proc 주소로 가서 명령어 실행
  • cmp value, value : 비교하고 결과에 따라 분기
  • call Target : eip 변경 후 target 으로 이동
  • ret : 함수 복귀, eip 이전으로 변경
  • pop D : 스택 최상단 D 에 로드, esp 변경
  • push D : 스택에 데이터 저장, esp 증가
  • int (interrupt-type) : 운영체제에 할당된 인터럽트 영역(ctr c)을 syscall

 


 

스택 프레임

  • RIP : 다음에 실행할 명령어 주소
  • RSP : 현재 스택의 최상단 
  • RBP : 함수 시작 지점을 가리킴
  • SFP : 스택에 저장했던 이전 함수의 RBP
  • RAX : 64비트 범용 레지스터 (32비트 EAX)
  • QWORD : 8 바이트 크기의 데이터
CALL 0x400500

 

  1. PUSH RIP
  2. JMP 0x400500
  3. PUSH RBP
  4. MOV RBP, RSP (함수 프롤로그)
  5. SUB RSP, size (MOV RAX, QWORD [RBP - 0x8])
  6. MOV QWORD [RBP - 0x8], RAX (지역변수 공간 확보)
  7. MOV RSP, RBP
  8. POP SFP (함수 에필로그)