목차
어셈블리어라는 말을 들어보신분들도 혹은 못들어보신분들도 계실겁니다. 하지만 이 글을 보러 오신 분들은 어셈블리어에 대해 조금은 알거나 어셈블리어라는 단어를 알고 들어오셨겠지요. 오늘은 도대체 어셈블리어가 뭐냐? 라는 주제로 시작해보려고합니다. 그럼 시작에 앞서 어떻게 컴퓨터에게 이렇게 실행하라는 명령을 보내는 지 알고계신가요? 컴퓨터개론에서 배우다시피 컴퓨터는 우리가 내린 명령을 0혹은 1이라는 2진수로 명령을 바꾸어서 전달을 합니다. 명령을 0 혹은 1로 바꾸어 놓은 2진수를 기계어라고 부릅니다.
프로그래밍 수업을 들어보신분들은 고급언어, 저급언어라는 말을 많이 들어보셨을겁니다. 여기서 고급언어란 고급 프로그래밍언어의 줄임말로써 사람이 이해하기 쉽게 작성된 프로그래밍언어를 뜻합니다. 대부분의 프로그래밍언어가 영어로 되어있기 때문에 영어를 잘 하시면 해당 명령어가 무엇을 뜻하는지 이해하기 수월해지실겁니다. 이야기가 다른곳으로 샜는데요. 고급언어는 사람에게 가까운 언어입니다.
그럼 저급언어는 무엇일까요? 전에 이야기 드렸던 기계어같이 컴퓨터가 이해하기 쉽게 작성된 프로그래밍언어로, 기계어와 어셈블리어를 일컫습니다. 고급언어를 써도 되는데 왜 굳이 저급언어라는 것을 만들어서 사용할까요? 그 이유는 이렇습니다. 고급언어는 사람이 사용하기 편하지만, 사람의 자연어에 가까운 언어를 사용하다보니 이를 컴퓨터가 알아들을 수 있도록 컴파일을 해주어야합니다. 코드가 짧으면 그 실행시간이 짧겠지만, 코드가 길어졌을 때는 컴파일 시간이 정말 길어집니다. 대형 프로젝트의 경우는 컴파일만 하루라는 시간이 소요됩니다. 때문에 컴파일을 시켜놓고 퇴근한뒤 다음날 출근했을때 컴파일이 잘 되었는지 확인하는 것이지요.
이처럼 고급언어는 컴파일하는 시간이 오래걸리는 단점이 있는 반면에 저급언어는 컴퓨터와 가까운 언어이기때문에 컴파일을 해도 간단한 명령으로 실행하기때문에 실행속도가 정말 빠릅니다. 하지만 학교에서도 고급언어의 과목은 있지만 저급언어의 과목은 없지요. 저급언어는 배우기가 힘들고 유지보수가 힘들다는 이유로 특수한 경우를 제외하고는 사용되지 않고 있습니다.
그럼 기계어와 어셈블리어는 뭐가 다른걸까? 기계어는 앞서 말했다시피 0혹은 1로 이루어진 언어로써, 다음의 n번째 피보나치수를 구하는 예를 통해서 알수있다. 편의상 32비트 x86기계어를 표현한 16진수를 사용하였습니다.
8B542408 83FA0077 06B80000 0000C383 FA027706 B8010000 00C353BB 01000000 C9010000 008D0419 83FA0376 078BD98B B84AEBF1 5BC3
이와는 다르게 어셈블리어는 간단한 명령어들로 구성되어있다. 다음의 예는 앞선 예와 같이 n번째 피보나치수를 구하는 예를 MASM(어셈블러:어셈블리어를 기계어로 번역해주는 프로그램)으로 보여줍니다.
fib: mov edx, [esp+8] cmp edx, 0 ja @f mov eax, 0 ret @@: cmp edx, 2 ja @f mov eax, 1 ret @@: push ebx mov ebx, 1 mov ecx, 1 @@: lea eax, [ebx+ecx] cmp edx, 3 jbe @f mov ebx, ecx mov ecx, eax dec edx jmp @b @@: pop ebx ret
이번엔 고급언어중 하나인 C언어로 예를 들어보겠다.
unsigned int fib(unsigned int n) { if (n <= 0) return 0; else if (n <= 2) return 1; else { unsigned int a,b,c; a = 1; b = 1; while (1) { c = a + b; if (n <= 3) return c; a = b; b = c; n--; } } }
어떤가요? 고급언어가 이해하기 훨씬 쉽지않나요? 기계어는 16진수로 표현해서 저렇게 간단해보이는거지, 저 16진수를 2진수로 바꾸면 이게 무슨 문자지... 하는 생각이 드실겁니다. 그러면 저 어려운 저급언어를 배워야하는 걸까?라는 생각이 드실 수도 있을텐데요. 더 자세한 내용은 다음장에서 하겠습니다.
'프로그램 개발' 카테고리의 다른 글
[어셈블리어] 3장 명령어: mov (0) | 2016.09.27 |
---|---|
[어셈블리어] 어셈블리어는 왜 사용하는 걸까? (0) | 2016.09.26 |
[파이썬 배우기] 제어문 if 조건문 (0) | 2016.09.25 |
명품 Java Programming(개정판) 2장 실습문제 (0) | 2016.09.25 |
쉽게 풀어쓴 C언어 express 12장 연습문제 (0) | 2016.09.25 |