Assembly 정리
Assembly 정리
Registers
범용 레지스터
기본적으로 그냥 사용할 수 있지만 보통 용도가 정해져 있다
- rax
- 기존 EAX의 64비트에서의 확장버전
-
어떤 연산을 하고 났을때의 리턴값이 들어옴
- rcx
-
반복문의 반복 횟수를 가지고 있음
- rsi
source index
-
원본 데이터의 포인터를 가지고 있음
- rdi
destination index
-
목적지 데이터 포인터
- rsp
stack pointer
-
현재 사용중인 스택의 주소
- rbp
stack base pointer
- 스택의 바닥을 가지고 있음
이 외에도 AH AL 처럼 총 64비트중 뒤의 16비트를 다시 자른 것들이 있음
AH는 A레지스터의 High 8비트 부분(16비트 중)
AH는 A레지스터의 Low 8비트 부분(16비트 중)
32 비트 부분을 가리킬때는 eax 처럼 r대신 e가 붙음
명령어 포인터 레지스터 rip
instruction pointer
현재 실행중인 코드의 주소를 가리키고 있는 레지스터
이것도 마찬가지로 64비트라 r
이 붙은듯 함
플래그 레지스터
어떤 연산 하고 났을때의 결과에 관한 플래그를 저장하고 있음
- CF (Carry Flag)
-
부호없는 수의 연산이 범위 초과 했을때 올라감
- ZF (Zero Flag)
-
연산 결과가 0일때
- SF (Sign Flag)
-
연산 결과가 음수일때
- OF (Overflow Flag)
- 부호있는 수의 연산이 범위 초과 했을때
이외에도 많은데 일단 자주 쓰는건 위 4개라고 함
세그먼트 레지스터
-
Segment 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해 메모리를 보호하는 기법
- CS (Code Segment)
-
프로그래머는 기본적으로 rx 권한을 가짐
- DS (Data Segment)
- SS (Stack Segment)
이외에도 ES, FS, GS 등이 있다고 하는데 일단 자주 쓰는건 위 3개라고 함
Stack
-
push
VALUE sub rsp 8 mov [rsp] VALUE -
pop
VAR add rsp 8 mov VAR [rsp-8]
Procedure
call
SUB push ret_address jmp SUB
ret_address
는 call
하고나서 돌아올 위치가 저장되는 느낌임
아래의 코드에서 보면
1 call aaa
2 mov rax 1
2번 라인의 주소가 들어가는것
-
leave 스택 프레임 정리 (지역변수 삭제)
-
ret 함수에서 리턴
시스템콜 호출 순서
rax
에서 어떤 시스템 콜을 사용할지 저장
그 후 rdi
rsi
rdx
rcx
r8
r9
stack
순으로 데이터를 가져옴
rax
시스템 콜 중 자주 쓰는 것이라 함
0x00
read(UINT fd, char* buf, size_t count)
0x01
write(UINT fd, const char* buf, size_t count)
0x02
open(const char file_name, int flag, umode_t mode)
0x03
close(UINT fd)