카테고리 없음

요즘에 어셈블리어를 왜 배워야 할까?

사전관리자 2022. 9. 17. 03:32
반응형

어셈블리어를 배우는 것이 왜 여전히 필요한지와 배워야 할 이유에 대해 알아봅니다.

 

어셈블리어란?

 

이미 이 글을 읽고 있다면 어셈블리어 뜻에 대해 무엇인지 대략적으로 나마 알고 있겠지요.

 

어셈블리어는 저수준의 프로그래밍 언어로 거의 기계어와 1:1로 대응됩니다. 명령어 종류도 많지 않죠. 대부분의 프로그램을 개발할 때 어셈블리어로 작성하는 것은 비효율적이기 때문에 실제로는 C, C++와 같은 고수준 언어로 작성하고 이를 변환하는 프로그램, 즉 컴파일러를 통해 생성하게 됩니다. 실제로 어셈블리어로 코딩을 하는 경우는 장치 드라이버나 임베디드 시스템을 만드는 경우 등 한정적이죠.

 

게다가 어셈블러라는 것은 기계어와 대응되는 만큼 기계마다 동일하지 않습니다. 대체로 유사하지만 같은 코드를 다양한 기계에서 사용할 수 없다는 것이죠. 웹 브라우저만 있으면 실행되는 자바 스크립트나 JVM 만 있다면 실행되는 자바와 많이 다르죠. C, C++ 도 해당 플랫폼(기계)의 컴파일러로 컴파일하면 그에 맞는 어셈블리어 코드를 얻을 수 있는데 말이죠. 그러니까 어셈블리어는 이식성도 좋지 않습니다.

 

하지만 어셈블리어는 기계어와 가깝기 때문에 때문에 파이썬이나 자바 스크립트와 같은 고수준 프로그래밍 언어에서는 배울 수 없는 많은 것들을 경험하게 됩니다. 기계를 가까이서 다루게 되기 때문이죠. 이를 통해 실제 프로젝트에서 어셈블리어를 사용하지 않더라도 새로운 언어, 새로운 기술을 습득하는 바탕이 될 수 있습니다.

 

좀 더 자세히 살펴보겠습니다.

 

어셈블리어를 배워야 하는 이유

 

아키텍처에 대한 이해 향상

 

계속 어셈블리어는 기계를 직접 조작하는 명령어의 모음입니다. 이 때 기계라는 것은 단순히 '컴퓨터' 같은 것이 아니라 이 구성 요소인 CPU, 메모리 등을 말합니다. 단순한 계산 명령을 위해서도 프로세서의 레지스터를 조작해야 하고, 직접 메모리 주소를 지정해가며 모니터 화면에 출력하는 것과 같은 하드웨어 조작을 위한 입/출력도 세세하게 모두 지정해야 합니다. 

 

레지스터가 뭐고, 메모리에 무슨 주소가 있냐는 생각이 드신다면 어셈블리어를 배울 좋은 기회입니다. :)

 

개발 도구에 대한 이해 향상

 

자바 스크립트나 파이썬과 같은 스크립트 언어는 코딩하고 실행하면 결과가 나옵니다. 당연하죠.

 

당연한가요?

 

컴퓨터는 기계어 밖에 못하고 결국에는 어떤 언어가 되었든 기계어로 번역이 되어야 합니다. 추상화에 추상화를 거듭해서 편리한 IDE를 쓰면 빌드 버튼을 클릭하는 것으로 모든 게 한 번에 당연한 듯 처리되지 만요. 내가 작성한 코드가 빌드 버튼을 클릭했을 때 어떻게 변환되어 컴퓨터에게 전달되는지 궁금하지 않은가요? 

 

빌드 버튼 클릭 시 처리되는 컴파일, 어셈블, 링킹 등을 어셈블리어를 배우면서 자세히 살펴볼 수 있습니다.

 

함수 호출 방식에 대한 이해 향상

 

함수를 로직의 분리 정도로 이해하고 있나요? 어셈블리어를 학습하다보면 전역 변수와 지역 변수가 위치하는 구조, 프로그램의 실행 흐름이 함수 호출로 어떻게 변경되는지 이때 일어나는 일들이 무엇인지 알게 됩니다.

 

알면 뭐가 좋을까요? 프로그래밍 입문자들을 괴롭히는 재귀 함수도 오히려 추상화 된 상태에서 생각하니 더 복잡하게 느껴질 수 있는 것입니다. 어셈블리어를 배우면 이런 것이 상당히 간단히 구현된다는 것을 알 수 있게 됩니다.

 

하드웨어에 직접 액세스

 

이건 어셈블리어가 아니면 다른 언어로는 할 수 없는 영역이 될 수도 있습니다. 말 그대로 하드웨어를 직접 제어하는 것이죠.

 

고수준의 프로그래밍 언어로 기계 장치를 제어한다는 것은 OS 의 API를 호출하는 것입니다. 즉 OS에게 하드웨어 조작을 부탁하는 것이죠. 대부분의 사용자가 사용하는 OS는 동시에 여러 가지 앱을 실행하게 되므로 이렇게 중간에서 OS 가 처리해주지 않으면 하드웨어를 직접 조작하려는 앱들 간의 충돌로 지금과 같이 안정적으로 스마트폰이나 컴퓨터를 사용할 수 없을 것입니다.

 

OS 도 결국엔 하드웨어 조작을 위해 이를 처리해주는 프로그램이 필요한데, 이런 것을 대신 해주는 프로그램이 장치 드라이버입니다. 어셈블리어로 만들게 되고요.

 

임베디드 시스템과 같이 제한된 환경에서는 언어 선택지도 제한되어 있고 그렇다면 이 때 사용하게 될 언어는 어셈블리어입니다.

 

문제 해결 범위 증가

 

Chrome에서 문제가 발생해서 자바 스크립트 실행이 중단되었습니다. 내가 작성한 자바 스크립트 코드에서는 문제를 확인할 수가 없습니다. 물론 대부분의 경우 내 코드가 문제입니다.

 

하지만, 까다로운 문제가 발생했을 때 고수준 언어에서는 찾기 어려운 경우가 있습니다. 어셈블리어를 배워두면 실제로 작성하지 않더라도 이런 경우 컴파일된 어셈블리어 코드를 보고 문제의 원인을 파악할 수 있게 됩니다.

 

꼭 버그를 찾는 경우가 아니라, 바이너리만 있는 다른 프로그램의 내용을 보는 경우, 즉 리버스 엔지니어링을 할 때에도 어셈블리어는 필요합니다.

 

 

 

반응형