본문 바로가기
C언어/C언어

[C언어]어셈블(Assemble) 단계

by Oliver_Candy 2023. 2. 16.

어셈블-(Assemble)-단계

 


 

 

 

 어셈블이란?

 

전처리와 컴파일을 거쳐서 나온 어셈블리어 코드를 이용해서 어셈블단계에 대해서 설명해 보도록 하겠다.

어셈블 단계에서는 어셈블러가 담당을 하고 그 결과로 오브젝트 코드가 나오게 된다.

기계어와 1:1 대응이 되는 어셈블리어 코드를 어셈블러가 오브젝트 코드로 변환을 시키는데 이 오브젝트 코드가 이제야 기계가  읽을 수 있는 언어인 이진코드, 기계어로 변환이 된다. 

 

 

 

 오브젝트 코드

기계가 곧바로 이해가 가능한 기계코드로 이진코드(binary code)로 되어있다.

하지만 어셈블단계에서 입력을 받을 때 구멍이 뚫린 어셈블리어 코드를 받았기 때문에 오브젝트 코드도 아직까지는 구멍이 메꿔지지 않았다. 그 구멍을 메꾸는 것은 링커가 해준다.

 

 오브젝트 코드 보는 방법(.o) (Clang 기준)

-c 플래그를 넣어서 컴파일하면 .o 파일이 저장이 된다.

clang -std=c89 -W -Wall -pedantic-errors -c main.c

오브젝트 파일은 일반 텍스트 편집기로는 볼 수 없기 때문에 16진수 편집기인 hex나 Hx편집기로 봐야 한다.

 

실제로 내가 만든 main.c, do_something.c, do_something.h 파일들을 이용해서 main.o 파일 안에 do_something 함수 레이블이 있는지 보여주겠다.

 

/* main.c */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "do_something.h"


int main(void)
{
    int list[10] = { 0, };
    int min;
    int max;
    int i;
    
    for (i = 0; i < 10; ++i) {
        scanf("%d", &list[i]);
    }
    
    printf("짝수 번째에 입력된 값 : ");
    min = list[1];
    max = list[1];
    do_something(list, &min, &max);
    
    printf("최댓값 : %d 최솟값 : %d", max, min);     
    
    
    return 0;
}
/* do_something.h */
void do_something(int* list, int* min, int* max);
/* do_something.c */
#include "do_something.h"

void do_something(int* list, int* min, int* max)
{
    int i;
    
    for (i = 0; i < 5; ++i) {
            printf("%d ",list[i * 2 + 1]);
            if (*min > list[i * 2 + 1]) {
                *min = list[i * 2 + 1];
            }
            if (*max < list[i * 2 + 1]) {
                *max = list[i * 2 + 1];
            }
        }
}

main.o 파일안에 do_something레이블이 있다.

 

 

 

 

이 처럼 main.o 안에 구멍을 만들어 놓은 do_something 레이블 구멍이 여기에 있다.

 

2023.02.16 - [POCU/COMP2200(C언어)] - [C]전처리(Preprocessing) 단계

 

[C언어]전처리(Preprocessing) 단계

전처리 단계에 대해서 설명해 보겠다. 전처리 과정의 뜻은 대략적으로 소스코드를 확장된 소스 코드(=트랜스레이션 유닛)로 바꿔주는 과정을 말한다. 이전 글에서도 간단하게 #include 가 어떤 식

olivertree-cs.tistory.com

2023.02.16 - [POCU/COMP2200(C언어)] - [C]컴파일(Compilation) 단계

 

[C언어]컴파일(Compilation) 단계

2023.02.15 - [POCU/COMP2200(C언어)] - [C]C프로그램 빌드 과정(컴파일,링크,빌드의 차이) [C]C프로그램 빌드 과정(컴파일,링크,빌드의 차이) 빌드(build)란? 소스코드를 기계가 이해할 수 있는 기계어로 변환

olivertree-cs.tistory.com

 

출처 : POCU Academy COMP2200

댓글