System

Assembly [1] (var, add, print)

hololo 2019. 10. 13. 02:59

1. print

차례대로 push, mov, sub

- 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 호출