본문 바로가기
코스웨어/15년 스마트컨트롤러

20151201 - 홍준모 - 오전 : ARM 계의 비쥬얼 스튜디오(ADS) 깔기, .map .sym 의 필요성, 여러 다른 교양 내용 등등

by 알 수 없는 사용자 2015. 12. 1.
728x90
반응형

이진수 데이터들을 오렘알 카드로 색칠하던 시대에 드디어 니모닉으로 ex) 'LDR' 명령어가 01101101... 명령어를 단어로써 

정의하는 편한 시대가 온다. 정말 엄청난 생각이다. 생각에서만 그칠 수 있는 것을 정말 만든 것이다.


NASM, MASM 

이 둘의 차이점을 알아봅시다.

->NASM : 프리웨어로 윈도우와 리눅스에서 어셈블리어를 확인할수있다.
->MASM : 마이크로사의 어셈블러 로써 윈도우즈에서만 사용가능하다.

MASM은 MS사에서 만든 어셈블러입니다.


NASM은 오픈소스로 만들어진 어셈블러입니다.

 

MASM와 NASM은 Intel 문법을 따르지만, directive에 있어서는 조금 차이가 납니다.

 

MASM은 윈도우 환경에서만 사용될 수 있으나, NASM은 다양한 환경에서 사용될 수 있습니다.

 

또한, 주소 지정 방식에서도 조금 차이가 납니다.

 

뭘 공부해야 하느냐는 목적에 따라 사용 하면 됩니다.

 

1. 윈도우, 리눅스 환경 및 독자 OS 개발에 사용하고 싶다면 NASM을 추천합니다.

 

참고로, Visual Studio에서 NASM 문법을 사용해서 C언어와 함께 개발하려면 독립적인 OBJECT 파일로

 

만들어서 링크해야 합니다. 즉, Visual Studio에서 인라인 어셈블은 안됩니다.

 

2. WinDebug 등의 디버거를 이용해서 윈도우용 프로그램을 리버스 엔지니어링하려면 아무래도 MASM 문법

 

에 익숙한 것이 낫습니다. 이런 경우에는 MASM을 공부하세요.

 

또한, MS에서 만든 것이다 보니 Visual Studio에서 C언어와 함께 인라인 어셈블이 가능합니다.


즉, 

MASM -> 윈도우 전용 어셈블리

NASM -> 공용 어셈블리

인 것 같다.

좀 더 찾아보니 NASM 은 주소 방식이고, MASM 값 방식이라 한다. 

리눅스나 유닉스 등등 은 N 방식을 따르고, 윈도우만 M 방식을 따른다고 한다.


명령어의 차이를 보자



명렁어의 차이 (1)

주소 지정 방식의 차이

MASM에서는… 
- Mov AX, offset defined_data 
defined_data 의 주소를 AX에 저장 
- Mov AX, defined_data 
defined_data 의 값을 AX에 저장

NASM에서는… 
- Mov AX, defined_data 
defined_data 의 주소를 AX에 저장 
- Mov AX, [defined_data] 
defined_data 의 값을 AX에 저장 

 
명렁어의 차이 (2)

피 연산자 사용의 차이

MASM에서는… 
용도에 따라서, @, $, %, %% 등이 사용됨 
약간 복잡한 방식

NASM에서는… 
주소를 나타내는 [ ] 외에는 달리 사용되는 특수문자가  없음 
프로그래머에게 단순한 사용 방식을 제공 

 
기타 차이점 (1) 
MASM 과 NASM의 사용 시, DB 혹은 DW 등을 이용하여 변수를 선언 시에 약간 다를 수 있다. 
스트링 선언 방식의 차이 등… 
times, resb, resw 등의 약간의 차이점이 있음 
이들 어셈블러는 해당 버전마다 약간씩 사용법이 다를 수 있다. 
추가된 새로운 지시어/피연산자 사용 법 
매크로의 사용방법 등… 
나머지는 NASM Manual 문서를 찾아보도록 하자

좀 더 자세히 알고 싶으면 검색해서 찾아 공부해봐도 나중에 임베디드 개발 때 유용할 것 같다.




cpu - 메모리 : 클럭의 존재 이유 -> 

메모리에 존재하는 데이터 값들을 빼낸다.



18 , 욕과 숫자 로 할 수 있다. : 구구단을 외웠다! 우길 수 있다. -> 여기서 말하는 것을 숫자로 해석할 것이냐, 욕으로 해석할 것이냐, 인것이다.

포인터와 일맥상통한다.

주소가 있다 치면 

12 34 56 78 헥사가 존재한다면

int* char* short*

*A *B *C

즉, 

A == 78 56 34 12 의 값을 가지고,

B == 12

C == 34 12 

의 값을 가지게 된다.

"꽃을 꽃이라 부르지 않으면 꽃이 아닌 것이다."

어떤 숫자 값에 의미를 부여하면 그 숫자 자체가 그 의미를 갖게된다.

01100011... 이 숫자 값을 니모닉으로 명령어 화 시켰다.

암페어, 볼트 이런것들 그 사람들이 새로운 것을 발견하여 자기 이름을 붙였다. -> 이들은 사람이름이다. 즉, 명명 하는 것에 따라 의미가 '부여' 되는 것이다.


암이나 아트메가에서는 안된다. 라즈베리파이에서는 된다.

'크로스 컴파일러' 교차 개발 환경이라고 한다.

인텔 컴퓨터에서 c언어 컴파일러 -> 교차 개발 환경이라 부르지 않는다. 자기 안에서 했기 때문에 컴파일 환경이다. 라고 부르는 것이고

라즈베리 파이에 올려서 컴파일도 가능하다면 교차 개발 환경이라 한다.


임베디드 시스템 개발을 하기 위해서는 반드시 크로스 컴파일러가 있어야 해요. 크로스 컴파일러는 씨 소스를 개발하고자 하는 시피유에 맞게 컴파일해서 바이너리로 만들어 주는 역할을 해요.
호스트 피시에서 사용되는 씨 언어 컴파일러는 크로스 컴파일러라고 표현하지는 않아요. 호스트 피시 같은 경우, 개발자가 씨 프로그램을 만들어서 컴파일을 하고 나면 프로그램 실행 결과를 바로 확인 할 수가 있죠. 그 이유는 호스트 피시에 설치된 씨 컴파일러는 호스트 피시의 시피유에 맞게 실행 바이너리가 만들어지기 때문입니다. 그에 반해 임베디드용 시피유는 호스트 피시의 시피유와 다르기 때문에 실행 바이너리도 당연히 다르겠죠? 즉, 내가 만든 씨 프로그램은 같지만 호스트 피시의 시피유에서 실행되는 바이너리와 임베디드 시피유에서 실행되는 바이너리는 다르다는 거죠. 그래서 임베디드 시피유용 컴파일러를 설치해야 하는데, 일반적으로 이러한 컴파일러를 크로스 컴파일러라고 부른답니다. 

그럼 호스트 피시용 씨 컴파일러와 크로스 씨 컴파일러의 차이점은 무엇일까요? 
우리가 사용하는 호스트 피시 시피유는 32/64비트인데, 임베디드 시피유는 8, 16, 32, 64비트 등 이렇게 다양한 비트를 가지고 있어요. 여기서 비트가 다르다는 이야기는 시피유가 덧셈 명령 하나를 처리할 때 해당 시피유가 가지는 비트 수만큼 메모리에 있는 바이러리를 읽어와서 처리하도록 되어 있어요. 그러므로 컴파일 시 각 시피유의 비트에 맞게 바이너리를 만들어 주게 되어 있고 그 비트 만큼 읽어와서 하나의 명령어를 처리하니 시피유의 성능에 따라 많은 차이가 있답니다. 
 


음.. 즉, 


컴파일러란,


컴파일러의 사전적 의미는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말합니다.


원래의 문서를 원시, 혹은 소스코드라고 부르고 출력된 문서를 목적 코드라고 부릅니다.


원시 코드에서 목적 코드로 옮기는 과정을 컴파일 이라고 합니다.


네이티브 컴파일러는 컴파일 및 실행을 컴퓨터에서 구동할 수 있는 것을 말합니다.  


즉, 컴퓨터와 매우 밀접한 관계라고 볼 수 있습니다.


그와 반대로 크로스 컴파일러는 컴파일은 컴퓨터에서 가능하지만 실행 자체를 다른 곳(ex 임베디드 시스템)에서 하는 것을 말합니다.


즉, 크로스 컴파일러는 임베디드 시스템 및 여러 플랫폼에 맞춰진 컴파일러 라고 볼 수 있습니다.



네이티브 컴파일러는 우리가 윈도우용 .exe 파일과 같이 어플리케이션을 만드는 것과 같다고 보면 되고,
크로스 컴파일러는 컴파일이 현재 컴퓨터에선 가능하지만 실행 자체를 ARM 보드나 AVR 보드에서 하는 것을 크로스 컴파일러라고 칭한다.
즉, 우리가 여지껏 해왔던 것이 크로스 컴파일러를 활용해 프로그램을 업로딩 시킨 것이다.


이제 ARM 계의 비쥬얼 스튜디오 ADS를 깔고 잘 되는지 컴파일 까지 해보자.

선배님이 설치과정을 따라해서 컴파일 까지 해보면,



반짝하고 컴파일이 성공적으로 되었음을 확인 할 수 있었다.


<165p의 .map, .sym 파일의 대한 자세한 설명>






그렇구나..

그럼 이 파일을 ARM계의 비쥬얼 스튜디오라 불리우는 ADS 에 돌리면, 디버깅이 되는 것이라는 느낌인 듯하다. 

굉장히 중요한 사실.

임베디드가 어려운 것은 사실 어떻게 공부를 시작해야 하는지 모르는 점도 있겠지만,

 어디에서 오류가 났는지. 물론 컴파일러가 말해 주긴 다른 에러, 즉, 실행 중 메모리를 잘못 참조하거나 (런타임 오류 같은 것들) 그런 것들을

 디버깅이 안되다 보니 바로 확인하고 고치기가 어렵다. (물론 실력이 좋다면.. 상관없지만 ㅠㅠ 난 실력이 안좋기에 필요..)

이 .map, .sym 파일은 그런 것들을 확인 할 수 있는 것 같다.




728x90