시스템 프로그래밍

안녕, 어셈블리

어셈블리 언어로 hello, world 프로그램을 쓰려면 어떻게 해야할까요? gcc 컴파일러가 알아서 번역해준 파일을 해석해봅시다.

프로그래밍 언어를 배울 때마다 항상 작성하는 Hello world 프로그램을 어셈블리 언어로 작성하면 어떨까? 컴파일러가 쓴 hello world 프로그램을 구경해보자.

우분투 환경에서 코드 에디터를 열어 위 코드를 hello.c라는 파일에 입력하여 저장하고, 커맨드라인에서 컴파일하자.

// hello.c

#include <stdio.h>
int main(void)
{
    printf("hello, world\n");
    return 0;
}
gcc hello.c -o hello

(gcc라는 컴파일러는 리눅스에서만 지원하는데, 나중에 실습 환경 소개를 할 때 VMware을 이용해서 우분투 운영체제를 사용하는 법을 서술하겠다. 인터넷 검색하면 바로 나오긴 한다.)

그리고 hello를 입력하여 방금 만든 프로그램을 실행한다.

hello, world

커맨드라인에 위와 같은 메세지가 나타난다면 성공이다.

 

다시 커맨드라인으로 돌아가 이번에는 이렇게 입력해보자.

gcc -S hello.c 

그리고 hello.s를 열어보자.

(.s 가 바로 어셈블리 언어로 작성된 코드의 확장자이다. )

작성한 C 코드를 어셈블리 언어로 번역한 모습을 확인할 수 있다!

(내 생각에는) 전혀 이해하지 못해도 된다.  

gcc는 똑똑한 프로그래머들이 열심히 만든 컴파일러로 hello.c를 최적화하여 어셈블리 언어로 번역한 것이기 때문이다.

 어셈블리 언어를 이해하기 위해, (필자가) 앞으로 짤 코드는 이것보다 훨씬 예쁘고 깔끔하다. 그냥 구경만 하자.

    .file	"hello.c"
	.text
	.section	.rodata
.LC0:
	.string	"hello, world"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	leaq	.LC0(%rip), %rdi
	call	puts@PLT
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
	.section	.note.GNU-stack,"",@progbits

 

모든 C언어 프로그램을 작성할 때 사용되는 중괄호나 세미콜론 따위는 없고, string "hello, world"라는 문자열과 @, $, % 가 눈에 띈다. 파일 이름과 컴파일러의 버전, 실행 환경까지 나와있는 것도 신기하다.

 

 

댓글

댓글 본문
버전 관리
레트로
현재 버전
선택 버전
graphittie 자세히 보기