본문 바로가기
정글

TIL(8일차) 어셈블리어

by 진득한진드기 2023. 4. 28.

기계어 수준의 코드를 파악하기 위해 간단한 어셈블리어를 공부하려고한다.

 

C언어의 기초가 어느정도 있다고 가정하에 보면 복잡하긴 하지만 못읽을 정도는 아니었던 것 같다.

 

유튜버 동빈나 님의 영상을 찾아보고 따로 정리하려고 한다.

 

어렵다고 생각와중에 진짜 알기 쉽게 설명해준다.

 

영상 시리즈를 보고 정리한 내용을 적으려 한다.

 

https://www.youtube.com/watch?v=uOIq-P2eQXs&list=PLRx0vPvlEmdAXwJnNtKIVeC27UmwljRYA&index=3 

 

 

기본 문법

 

rax : 시스템 콜에 실직적 번호를 가르키고 함수가 실행되고 그 결과가 감기는 명령어

rbx : 베이스 레지스터 -> 메모리 주소 지정

rcx: 주로 반복문에 사용되고 계산용

rdx: 데이터 레지스터이고 연산수행시 rax와 자주 같이 사용함

 

위 4개는 데이터 레지스터이고

 

rsi: 메모리 이동,비교시 출발지 주소 포인트

rdi: 메모리 이동,비교시 목적지 주소 포인트

rdp: 함수의 파라미터, 변수의 주소 포인트

rsp: 스택에 이벤트 발생시 변경되는 스택에 가장 위 주소 포인트

 

r8~15는 메모리 포인트

 


스택 프레임

 

영상에서 동빈나 님은 아래와 같은 코드를 설명하셨다.

 

 

#include <stdio.h>

int sum(int a,int b){
	return a + b;
}

int main(void) {
	int c = sum(1,2);
    return c;
}

 

간단한 메모리 구조와 stack frame

 

 

먼저 main() 함수 실행시

 

RET : 함수 종료시 돌아갈 장소를 말한다.

RBP : 베이스 포인터

변수 C

버퍼 

 

순서로 스택 프레임에 쌓이게 된다.

 

여기서 sum을 호출시 그 위에 

 

변수 x

변수 y

RET

RBP

버퍼

 

순서로 다시 스택 프레임 안에 들어가게 된다.

 

여기서 sum 함수가 return 이 된다면 버퍼부터 변수 x 스택 프레임에서 없어지게 된다.

 

그렇게 되면 변수 x,y가 계산되어 변수 c에 담겨 출력되게 된다.

 

다시 main 함수는 return 을 만나 스택 프레임에서 사라지면서 RET를 만나게 되면 원초적인 메모리 주소로 돌아가게 된다.

 

 

영상에서 재밌게 해보길래 한번 따라해 봤다.

 

최적화가 되기 때문에 위에서 배운 내용과 조금은 다를 수 있지만 흐름은 비슷하기 때문에 상관없다고 한다. ㅇㅇㅇ...

 

 

컴파일하고 최적화된 파일의 어셈블러다.

 

스택 프레임에 rbp를 넣고

 

rsp를 점프 시켜 공간을 확보한다. 1과 2를 잡고

 

call로 sum을 호출한다.

 

 

sum 실행시

 

 

똑같이 rbp를 스택프레임에 넣으면 아래와 같이 된다.

 

 

sum 실행시 스택프레임

 

edi 에 -4를 넣어서 1과 eax에 2를 담고 값을 더해서 eax를 반환한다.

 

그러면 위에 메인에서 call sum 아래 쪽으로 와서 eax를 스택프레임에서 없어진 부분 윗쪽

 

즉, RBP위에 return된 eax 3을 넣게 된다.

 

그리고 마지막으로 main 이 종료되면서 3을 return eax인 3을 return 하게 된다.

 

 

아래 그림은 printf를 넣어서 확인된 결과이다.

 

결과 출력

 

'정글' 카테고리의 다른 글

TIL(10일차) 어셈블리어 간단한 계산 명령어와 연습문제  (1) 2023.05.01
TIL(9일차) 기계어 인스트럭션 보기  (0) 2023.04.30
TIL(7일차) CSAPP(Computer Systems)  (0) 2023.04.28
TIL(6일차)  (0) 2023.04.27
TIL(5일차)  (1) 2023.04.26