11월에 공부하고 메모장에 적어둔거 옮기기.. 까먹었을 때 보려고 간단하게 정리
레지스터
- 범용 레지스터 (32bit)
- 데이터 레지스터
- EAX : 누산기레지스터, 곱셈 나눗셈
- EBX : 베이스 레지스터, 메모리 주소 지정
- ECX : 계수기, 반복 명령
- EDX : 곱셈 나눗셈, 부호 확장 명령
- 인덱스 레지스터
- ESI : 다량 메모리 옮기거나 비교할 때 소스 주소
- EDI : “ 목적지 주소
- 포인터 레지스터
- ESP : 스택포인터, 스택 최종점
- EBP : 스택 함수 지역변수 주소
- 데이터 레지스터
- 세그먼트 레지스터 (16bit)
- ES : 보조, 두 곳 이상의 저장영역 가리킬 때 DS 와 사용
- CS : 코드 세그먼트, 프로그램 코드 시작 주소
- SS : 스택 세그먼트, 스택 시작 주소
- DS : 데이터 시작 주소
- FS, GS : 보조 세그먼트 레지스터
- 상태 레지스터 (32bit)
- EIP : 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리 주소, 자동으로 증가 및 변경
- EFLAGS : 플래그 저장
주소 지정 방식
- 즉시 지정방식 (앞 → 뒤)
- mov $0x1, %eax
- 레지스터 지정방식 (앞 → 뒤)
- mov%esp, %ebp
- 직접 주소 지정방식 (뒤 → 앞)
- mov %eax, 0x80482f2
- 레지스터 간접 주소 지정방식 (앞 → 뒤)
- mov (%ebx), %eax
- () 안에 들어간 값의 주소
- 베이스 상대 주소 지정 방식 (앞 → 뒤)
- 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
- PUSH RIP
- JMP 0x400500
- PUSH RBP
- MOV RBP, RSP (함수 프롤로그)
- SUB RSP, size (MOV RAX, QWORD [RBP - 0x8])
- MOV QWORD [RBP - 0x8], RAX (지역변수 공간 확보)
- MOV RSP, RBP
- POP SFP (함수 에필로그)