어셈블이란?
전처리와 컴파일을 거쳐서 나온 어셈블리어 코드를 이용해서 어셈블단계에 대해서 설명해 보도록 하겠다.
어셈블 단계에서는 어셈블러가 담당을 하고 그 결과로 오브젝트 코드가 나오게 된다.
기계어와 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 레이블 구멍이 여기에 있다.
2023.02.16 - [POCU/COMP2200(C언어)] - [C]전처리(Preprocessing) 단계
2023.02.16 - [POCU/COMP2200(C언어)] - [C]컴파일(Compilation) 단계
출처 : POCU Academy COMP2200
'C언어 > C언어' 카테고리의 다른 글
[C언어]링크(Link) 단계 (컴파일과 링크가 따로 되어있는 이유) (0) | 2023.02.16 |
---|---|
[C언어][Hex]헥스편집기 HxD editor 다운로드 방법 (0) | 2023.02.16 |
[C언어]컴파일(Compilation) 단계 (2) | 2023.02.16 |
[C언어]전처리(Preprocessing) 단계 (0) | 2023.02.16 |
[C언어]C언어에서 헤더파일이 필요한 이유?(헤더파일 필요성) (0) | 2023.02.16 |
댓글