1. print
- push %rbp
: rbp의 데이터를 스택의 최상위에 밀어넣는다
sp 레지스터는 포인터의 크기인 8byte만큼 증가
(64bit의 경우 8byte, 32bit의 경우 4byte)
- mov %rsp, %rbp
: mov = 데이터를 복사하는 명령어
위의 경우엔 rsp의 값을 rbp로 복사 -> rsp와 rbp의 위치가 같아짐
- sub $0x10, %rsp
: rsp의 주소를 0x10 (=16) 뺀다
미리 코드에 있는 변수들의 크기를 보고, 필요한 공간을 할당
- movl $0x1, -0xc(%rbp)
: movl = 32bit를 다룬다는 의미, mov와 movl은 크게 다르지 않음
rbp에서 0xc만큼 떨어진 곳에 1을 저장한다
(12에서 4byte = 16byte , 즉 sub해 준 범위가 이해가 가기 시작)
- movl $0x2, -0x8(%rbp)
: rbp에서 0x8만큼 떨어진 곳에 2를 저장
- mov -0xc(%rbp), %edx
: 앞의 데이터를 뒤의 레지스터에 복사
eax = 산술 연산을 수행하기 위해 사용, 함수의 리턴값을 전달하기 위해 사용, 범용 목적의 저장소
edx = eax의 확장 개념, 복잡한 연산을 위해, 범용 목적의 저장소로도 사용되지만 대부분 eax와 함께 연동해서 사용
(ecx = 반복 카운터로 사용, 반복할 횟수를 지정해 높고 반복 작업을 수행)
- add %edx, %eax
: eax = eax + edx (AT&T 문법)
- mov %eax, -0x4(%rbp)
: eax의 값을 rbp-0x4에 저장
- mov -0x4(%rbp), %eax
: 그걸 다시 eax에 옮긴다...왜 반복하는 건지는 모르겠음
- mov %eax, %esi
: eax의 주소값을 esi에 옮긴다
esi = (extended source index) 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장됨
- lea 0x9d(%rip), %rdi
: lea = 레지스터에 주소값을 입력
rdi = 목적지 인덱스 레지스터
x/s $rdi -> "sum is %d\n"
- callq 0x520
: printf 호출
'System' 카테고리의 다른 글
ㅂ ㅏ ㅁ ㄹ ㅐ ㅂ 0+1 (0) | 2019.10.08 |
---|---|
16진수 (0) | 2019.10.03 |
리눅스 권한3 (보충) (0) | 2019.10.01 |
sudo와 root (0) | 2019.09.28 |
리눅스 권한 2 (0) | 2019.09.26 |