Computer Architecture
이름 | 용도 |
---|---|
rax | 함수의 반환 값 |
rbx | x64에서는 주용도 없음 |
rcx | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
rdx | x64에서는 주된 용도 없음 |
rsi | 데이터를 옮길 때 원본을 가리키는 포인터 |
rdi | 데이터를 옮길 때 목적지를 가리키는 포인터 |
rsp | 사용중인 스택의 위치를 가리키는 포인터 |
rbp | 스택의 바닥을 가리키는 포인터 |
cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재.
CPU가 어느 부분의 코드를 실행할 지 가리키는 역할.
rip
: 크기는 8바이트
플래그 | 의미 |
---|---|
CF (Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정된다. |
ZF (Zero Flag) | 연산의 결과가 0일 경우 설정 된다. |
SF (Sign Flag) | 연산의 결과가 음수일 경우 설정 된다. |
OF (Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 된다. |
Linux Memory Layout
x86 Assembly
opcode operand1 operand2
=operand1
에 operand2
를 opcode
해라
명령 코드 | |
---|---|
데이터 이동 | mov. lea |
산술 연산 | inc, dec, add, sub |
논리 연산 | and, or, xor, not |
비교 | cmp, test |
분기 | jmp, je, jg |
스택 | push, pop |
프로시져 | call, ret, leave |
시스템 콜 | syscall |
push val
val
을 스택 최상단에 쌓음결론적으로 rsp-=8을 하고, [rsp]=val인 셈임
pop reg
reg
에 대입결론적으로 rsp+=8을 하고 reg=[rsp-8]인 셈임
프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다.
call addr
addr
에 위치한 프로시저 호출push return_address
jmp addr
leave
mov rsp, rbp
pop rbp
ret
return address
로 반환pop rip