Busan IT/ARM Assembly2015. 12. 2. 13:30

==================================Outline====================================

Memory Map Symbol 이야기

ELF format Object File에 관한 진실. -c option (기계어 세상)

----------------------------------------------------------------------------

 

Memory MapSymbol 이야기

 

C에서는 변수나 명령어에 대한 심볼 테이블이 필요한다. 어셈블리의 경우에는 스택의 베이스 주소에서 떨어진 정도를 기준으로 변수를 사용하기 때문에 심볼 테이블이 필요 없다.

 

메모리 맵 파일은 실행파일을 만들 때 작성된다. 변수의 주소는 link 단계에서 결정된다. 실행 시 운영체제는 메모리의 보호를 위해 가상의 스택 베이스 주소를 설정하여 변수의 주소를 설정하기도 한다.

 

심볼테이블은 linker만이 참조한다. linking시 심볼 테이블의 심볼이 겹치는 경우 에러가 나기 때문에 똑같은 이름의 변수를 중복으로 사용할 경우 static 혹은 extern 명령어를 사용하여 linker가 정상적으로 실행될 수 있도록 해야 한다.

 

심볼 테이블은 모든 변수나 함수를 주소화 시킨다. 심볼 테이블은 한정된 메모리를 충돌 없이 사용하기 위해 존재한다.

 

지역 변수는 변수가 속한 함수에서 사용될 때, 즉 스택 포인터 아래에 있을 때만 보호 받는다. 해당 함수가 종료되면 변수는 사라지지는 않지만 더 이상 보호 받지는 못한다.

 

변동 없는 주소를 갖는 것은 함수와 전역변수, 지역변수는 스택의 베이스를 기준으로 한다.

 

 

 

 

변수를 보고 어느 영역에 해당하는지 구분할 수 있어야 한다.



ELF format Object File에 관한 진실. -c option (기계어 세상)

 

armcc로 컴파일한 obj파일을 hexaview사용하여 열어보자.

 

ELF형식임을 알 수 있다.

 

 

//시작 값인 0x7F10진수로 127, 아스키코드로 'DEL'키를 뜻한다.

 

 

SWS ESPC 0003 B-02를 검색하여 ARM ELF specification을 다운 받는다.

 

elf파일을 해석하는 프로그램이 linux에 존재한다. 'readelf'라는 명령어와 함께 object 파일 명을 입력하면 정보가 elf파일의 정보가 출력된다.

 

'fromelf'라는 명령어를 사용하여 binary로 된 데이터를 assembly로 바꿔서 출력해보자.




 

 

반응형
Posted by newind2000
Busan IT/ARM Assembly2015. 12. 1. 13:39

==================================Outline====================================

컴파일에 대한 단상

ARM ADS 설치

컴파일 공장 이야기

----------------------------------------------------------------------------

 

컴파일에 대한 단상

 

01로 이루어진 코드를 문자를 도입하여 표시하게 되어 사람이 코드를 작성하는데 용이하게 되었다.

 

 

어셈블리 언어는 CPU에 따라 문법이 달라진다. 호환성의 한계를 해결하기 위해서 고급 언어인 CC++이 등장하게 되었다.

 

 

CPU에 자유롭다 - high level language

CPU에 종속된다 - low level language

 

C로 작성 -> Assembly 언어로 변환 -> cpu가 해석할 수 있는 bit pattern으로 변환

 

 

메모리는 플립플롭의 회로를 사용하여 데이터를 보존한다.

 

cross compile이란 프로그램을 고사양 개발 PC에서 컴파일 후 프로그램이 사용될 CPU에 이식하는 것을 말한다.

 

ARM ADS 설치

 

공유 폴더에 가서 ARM ADS(ARM Developer Suite) 1.2를 가져온다. setup.exe를 눌러 실행한다.

 

** 굳이 설명이 없는 것은 변동 없이 다음을 눌러주면 된다.

 





 

 

보안패치 업데이트

 



예제 파일 ‘OK7S256ads’은 인터넷 검색하여 사용한다. 압축을 풀어 Program File에서 ADS가 설치된 폴더 안에 잘라 넣는다.

 

IDE를 실행하고 예제 파일을 불러들인다.

 



 

그룹을 생성한다.

 






 

 

‘Cstarup_SAM7.c‘ ’retarget.c‘ 도 같은 방식으로 등록한다.



 

이제 예제 파일을 추가한다.




 

새로운 프로젝트 환경 설정










 

코딩 시 코드의 탭 간격 조절

 





 

주소가 달라 오류가 난다. 주소를 수정해보자.

 

 

베이스 주소를 '0x00000000'로 수정하니 컴파일이 됐다. 하지만 warning이 뜬다. entry point가 없다는 메시지이다.

 

다시 alt + F7을 눌러 디버그 세팅으로 간다. Image Entry Point창에 'entry'를 입력한다.

 

 

 

다시 컴파일을 해보자.

 

 

잘된다.

 

 

 

 

Atmel사 홈페이지로 간다.

 




//MCU를 구입할 때 evolution kit를 사야한다. 아니면 CPU 달랑 하나 구입하는 꼴이 된다.

 

컴파일 공장 이야기

 

 

 

//전처리 과정이 빠져있다.

 

elfbin파일은 둘 다 기계어이다. 실제로 동작이 가능한 파일이 bin파일이다.

 

실행 파일 구조는 윈도우는 pe계열 리눅스는 elf계열이다. 임베디드 계열은 대부분 elf계열이다.

 

컴파일 과정을 그림으로 표시하면 다음과 같다. 





 

 

 

반응형
Posted by newind2000
Busan IT/ARM Assembly2015. 11. 29. 17:54

==================================Outline====================================

ARM/ Thumb PCS - 레지스터 사용법

ARMInterrupt냄새를 어떻게 맡는가

ARM SoC (System On Chip) - ARM 그렇고 말고

AMBA - SoC안에서 IP끼리의 Bus 규격

Little EndianBig Endian

컴파일에 대한 단상

----------------------------------------------------------------------------

 

임베디드 레시피 p/126

 

 

ARM/ Thumb PCS - 레지스터 사용법

 

 

ARMaccumulator 레지스터가 따로 존재하지 않고 변수를 사용하여 연산을 한다.

 

r0 ~ r3까지의 레지스터 값은 함수를 사용할 때 가변한다고 가정한 후 사용해야 한다. 때문에 해당 레지스터 값을 보존하고 싶다면 스택에 백업을 해두어야 한다.

 

5번째 인자는 스택에 저장됨으로 인자가 5개로 늘어나면 속도가 느려진다는 점을 염두에 두어야 한다.

 

프로그램이 어떻게 동작하는지 확인하기 위해서는 컴파일시 ASM중간 파일을 생성하여 확인해보면 된다.

 

구조체의 복사는 대입 연산이 아닌 주소를 사용하여 복사하는 것이 프로그램을 효율적을 사용하는 방법이다.

 

** 인텔에서 구조체의 복사는 어떻게 이루어지는지 ASM를 통하여 확인해보자.

 

1. ASM파일 생성하여 확인

2. VS에서 debugging을 사용하여 확인

 

인자 4, 내부변수 8개까지는 스택을 쓰지 않는다. 외부에서 할당되어 스택에 구해 받지 않고 사용할 수 있는 레지스터들을 scratch라고 한다.

 

함수를 사용할 때 인자가 4개까지 필요하지 않더라도 프로그램의 효율을 위해 인자를 4개 선언하고 사용하지 않은 인자는 함수의 내부 변수로 사용하면 좋다.

 

ARM에서는 PC(P15)에 바로 값을 넣을 수 있다.

 

Java를 실행시키기 위해서는 JRE(Java Runtime Environment)가 있어야 한다.

 

ARMInterrupt냄새를 어떻게 맡는가

인터럽트를 위해 따로 전기 신호가 통하도록 선이 만들어져 있다.

 

인터럽트 중에 또 인터럽트가 발생했을 때 이것을 처리해 주는 것을 nesting이라고 한다. nesting에 대한 판단은 시스템에서 하게 된다.

ARM SoC (System On Chip) - ARM 그렇고 말고

 

SoC(System on Chip)은 코어와 함께 일련의 프로세서를 처리할 수 있는 장치들을 함께 연결하여 하나의 칩에 시스템을 구축하는 것이다. SoC는 레고 블록처럼 기능별로 하드웨어영역이 설정되어 있어 유연하게 추가 및 제거가 가능하다.

//SoC내부의 block들을 IP (Intellectual Property)라고 부른다.

//IP를 부착하고 제거 한 후 다른 기능들과 연동 가능하도록 연결해주는 작업이 필요하다.

AMBA - SoC안에서 IP끼리의 Bus 규격

 

내부 장치들간의 데이터를 주고 받기 위해서는 통신규약이 필요하다. ARM사는 이러한 통신 규약을 무료로 제공한다.이것을 AMBA라고 한다.

 

AHB는 고속, APB 저속 내부 통신 프로토콜이다. 버스 통신을 위해서는 통신을 제어하는 장치가 필요한데 이것을 Arbiter라고 한다.

 

통신의 순서는 위와 같고 도표로 나타내면 아래와 같다.

 

고속 버스 통신을 위해서는 burst를 사용하는데 이것을 주소를 한번 전송한 후 이후 연속된 데이터를 주소의 자동증가와 함께 보내는 것이다.

Little EndianBig Endian

 

리틀 엔디안은 낮은 주소 값을 갖는 데이터가 메모리 뒤에 위치하는 것이고, 빅 엔디안은 주소의 순서대로 데이터가 메모리에 저장되는 것이다. 인간이 쉽게 인식하는 방식은 빅 엔디안이다.

 

 

컴파일에 대한 단상

 

컴파일러는 인간이 인지하기 쉽도록 만들어진 컴퓨터 언어를 기계가 인지할 수 있도록 바꿔주는 장치이다.

 


반응형
Posted by newind2000
Busan IT/ARM Assembly2015. 11. 26. 21:34

==================================Outline====================================

ARM 레지스터

ARM 모드

Exception

----------------------------------------------------------------------------

ARM 레지스터

  

임베디드 레시피 책을 보자.

 

ARM37개의 레지스터를 가지고 있다.

 

 

각 모드별로 호환될 때 CPSR(Current Program Status Register)에 레지스터의 상태값(context)이 저장되고 모드가 전환될 시 CPSR값을 SPSR(Saved Program Status Register)에 저장하게 된다.

 

모드가 변경되면 banked register가 덮어지게 되며 원래 레지스터로 복구 되면 기존의 레지스터 값은 복원된다.

 

R14 (Linked Register) = Return Address 저장 레지스터

R13 (Stack Pointer) = ESP(Intel)

R15 (Program counter) = EIP(Intel)

 

ARM 모드 


ARM모드에 대해 알아보자.

 

7개의 모드가 있다.

 

 

기본적으로 SVC 모드로 설정이 된다.

 

 

user mode에서는 privileged mode로 이동할 수 없고 privileged mode 사이에는 자유롭게 모드의 이동이 가능하다.

Exception

 

예외적인 일이 발생했을 때 프로그램이 점프하는 것을 exception이라고 한다.

//interruptexception에 포함된다.

 

 

 

/* Exception vectors (should be a branch to be detected as a valid code by the rom */

_exception_vectors:

reset_vector:

ldrpc, =reset_handler

undef_vector:

bundef_vector /* Undefined Instruction */

swi_vector:

bswi_vector /* Software Interrupt */

pabt_vector:

bpabt_vector /* Prefetch Abort */

dabt_vector:

bdabt_vector /* Data Abort */

rsvd_vector:

brsvd_vector /* reserved */

irq_vector:

birq_handler /* IRQ : read the AIC */

fiq_vector:

/*------------------------------------------------------------------------------

*- Function : fiq_handler

*- Treatments : FIQ Interrupt Handler.

*- Called Functions :

*------------------------------------------------------------------------------*/

fiq_handler:

bfiq_handler

 

fiq는 가장 우선으로 처리해야 하기 때문에 fiq를 위한 코드 최적화이다. fiq가 벡터 가운데 가장 아래에 있다.













반응형
Posted by newind2000