본문 바로가기
정글

TIL(9일차) 기계어 인스트럭션 보기

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

우리가 하는 말을 컴퓨터는 어떻게 알아 들을까?

라는 생각을 한 번쯤은 해본적이 있을 것이다.

 

우리는 쉽게 프로그래밍 언어를 사용해서 컴퓨터가 그걸 받아들이는 과정을 코딩이라고 생각할 수 있지만

 

그건 아닌 것을 우린 알고 있을 것이다.

 

실제로는 0,1 밖에 못알아 듣기 때문이다.

 

모든 사람이 그렇게 깊게 알필요 없으니까 그냥 알고만 넘어가자고 하지만

 

나 스스로 프로그래밍 한다고 하면 컴퓨터가 어떻게 내말을 알아 듣는지 까지는 알아야 한다고 생각이 들었다.

 


책을 보고 공부를 해보자

 

기계 수준의 표현의 부분을 보니 난해한 말들이 굉장히 많다.

 

처음 보면 굉장히 까다롭지만 천천히 따라가면 대강 이해는 간다.

 

다른 정글의 팀원들이 어셈블리어부터 기계어 인스트럭션 부분을 굉장히 어려워 하는 것같아서

 

따로 필요한 사람들을 모아서 간단하게라도 이해시켜줘야겠다 ㅎ......

 

간단하게 예제코드를 적어보자 책은 유명한 CSAPP를 참고하였다.

 

예제 CODE

 

long mult2(long,long);

void mulstore(long x,long y,long *dest) {
	long t = mult2(x,y);
	*dest = t;
}

 

 

 

코드중 가정 되어 있는 부분은 x = %rdi  y = %rsi. dest = %rdi

라고 할때  어셈블리어로 바꾸면 다음과 같이 나온다.

multstore:
	pushq %rbx
    movq %rdx, %rbx
    call mult2
    moveq %rax, (%rbx)
    popq %rbx
    ret

 

 

 

읽는것 자체는 그리 어렵지 않기에 헷갈릴만한 부분은 mul2이 ret되면 반환값이 rax에 담긴다는 것이다.

 

대충 스택 프레임 흐름을 보면 다음과 같다.

 

스택 프레임 흐름

 

 

위에서 흐름을 대충 파악 했으니 한번 실제로 만져 봐보자

 

 


 

기계어 인스트럭션

실제로 위의 코드 그대로 나오는지 확인을 해보자

 

mulstore 함수

 

글로써서 예상 했던 것처럼 실제로 나온것을 확인할 수 있다.

 

 

#include <stdio.h>

void mulstore(long,long, long *);

int main () {
    long d;
    mulstore(2,3,&d);
    printf("2 * 3 --> %ld",d);
    return 0;
}

long mult2(long a,long b) {
	long s = a * b;
    return s;
}

 

main 함수는 프로그램 실행시 필요하기 때문에 처음 나온 mulstore 함수를 정의한 코드와 실행가능 프로그램으로 만들고나서

 

어셈블리어와 기계어 인스트럭션을 확인해보면

 

main 함수는 다음과 같이 나온다.

 

 

main 함수

실제로 stack frame 에는 왼쪽 hex 값들이 들어간다고 예상을 할 수 있다.

 

offset은 옆에 나오지 않았지만 기계어 인스트럭션 갯수만큼 증가하는 것을 확인할 수 있다.

 

1개당 8비트(1바이트)에 offset이 1 증가하는 것이니 주소값이 1바이트마다 정해진다고 예상 할 수 있다.