로그인 | 회원가입
   이용안내    장바구니    주문조회    마이쇼핑    게시판
상품검색 검색 
아이디  
비밀번호
보안접속 보안접속
회원가입
  아이디찾기
  비밀번호찾기
상품목록
  ARM
  PIC
  AVR
  DSP
  MAXQ
  MSP430
  OTHER
게시판
공지사항
자유게시판
강좌-USB기타
자료실
샘플 기획전
전화: 031-429-0845
팩스: 031-477-1407
운영시간
  09:00 ~ 18:00
 
현재위치: > 게시판 > 자료실
자료실
자료실입니다.


찾기
제목 Thumb instruction 0  추천하기
작성자 글쓴이 2012-04-04 10:31:22 347
   
   
3.3 Thumb Assembly Instruction Lab [Needs Revision]

 

3.3.1 Purpose

Master the usage of ARM 16 bit Thumb instruction.

참고) Thumb instruction이란 무엇인가?

이것은 www.naver.com 검색창에서 nirakanta (2003-12-13 10:30 작성, 2003-12-13 10:42 수정)님의 답변을 옮긴것입니다. 참조하시기 바랍니다.

ARM 구조에서 thumb 이란 작은,축소된 이라는 의미를 가지고있습니다.
ARM을 사용할때 32비트 ARM명령으로도 사용할수 있지만
자원의 효휼적인 사용을 위해 ARM의32비트명령을 축소시켜
16비트로도 사용할수 있는 구조로 되어 있는데 16비트로 축소된 명령을
thumb instruction 이라고 합니다.
아직도 많은 CPU주변 칩들이 8비트로 되어 있고 메모리 같은건
16비트로 되어 있는경우도 있는데 32비트 명령를 사용하는건 너무 자원낭비이고
시간 낭비이겠지요.이때 thumb 16비트 명령을 사용하면 32비트를 사용하는것 보다
효율적으로 자원을 관리할수 있습니다.
그러니까 좀더 효율적으로 ARM을 사용하기 위해서는 thumb 구조의 명령과 ARM 구조의 명령을 필요에 따라 전환 하면서 사용하는것이 좋겠지요.
물론 자원을 아끼지 않아도 된다면 전환하지 않고
ARM모드 (32비트 모드) 에서 그대로 사용해도 관계는 없습니다.
ARM모드에서는 모든 thumb명령에 해당하는 것을
32비트 ARM 명령으로서 포함하고 있기 때문입니다.


ICE Breaker에 대해서 알려면 우선 ICE와 JTAG에 대한 개요를 이해해야 합니다.
ICE란 In circuit emulator 라는 뜻으로 크랙을 할때 Soft-ICE라는걸
사용해 보셨는지 모르겠지만 그런것과 유사한데 소프트 아이스는 소프트 웨어적으로
어떤 실행되고 있는 프로그램을 정지 시키고 그때의 레지스터나
여러가지 기계상태를 볼수 있는 장치지만 만약 하드웨어가 고장나서 에드레스 버스나
데이타 버스가 고장나면 소프트 아이트 그자체의 프로그램이 돌아갈수 없기
때문에 프로그램이나 하드웨어의 상태를 검사할수 없겠지요.
하지만 ICE는 하드웨어의 고장과는 관계없이 그 검사하고자 하는 타아겟 시스템을
모니터링 하고 하드웨어를 디버깅하거나 소프트웨어를 디버깅 할수 있는 장비입니다.
크기는 노트북정도의 정도의 크기가 흔하고 PDA정도의 크기도 있습니다.
아주 편한 장비이긴 하지만 수백만원에서 수천만원하는 좀 비싼 장비입니다.
그런데 최근에 나오는 칩들은 이런 장비의 역할을 대신 할수 있는 기능들을 아예
칩속에 내장시켜서 나오는 경우가 많습니다.
다른 방식도 있지만 가장 많이 쓰는 방식이 JTAG포트를 이용한 ICE입니다.
JTAG란 Joint test access group라는 단체에서 제안한 복잡한 회로를 가진
칩들의 내부 하드하드웨어를 테스트하기 위한 포트입니다.
핸드세이크가 있는 동기식 씨리얼 인터페이스 이고 7가닥 정도로 되어 있는데
이걸로 그 칩의 모든걸 모니터링 하거나 테스트 할수 있지요.
이포트의 기능이 고장나지 않는한 CPU가 어떤 형태로 고장나든 검사하는것이
가능합니다.
바로 이기능을 이용한것이 ARM의 내장 ICE입니다.
이 JTAG ICE로 어떤 원하는 하드웨어 상태나 실행되고 있는 프로그램의 특정 지점에서
CPU를 정지 시키고 그때의 칩상의 어떤 제어신호나 버스상태나 레지스터 상황을 볼수 있도록 한기능이 break기능입니다.
그 break를 시켜 주는것이 breaker 이고요.
PC에 딸려있는 DEBUG나 Soft-ICE도 디버깅 기능을 가지고 있는데 그기능과
같은기능입니다.
PC의 DEBUG는 어떤 조건에 따른 정지점(break point)을 하나 밖에 지정할수 없지만
소프트 아이스는 여러개를 지정할수 있습니다.
ARM의 디버거도 여러개를 지정할수 있습니다.
하지만 ARM칩을 사면 ICE 기능까지 딸려 있어서 디버깅을 할수 있다는 뜻은 아닙니다.
단지 그런 JTAG라는 하드웨어를 칩내부구조의 일부로서 제공할뿐이지요.
요즘 어지간한 칩에는 거의 JTAG가 있습니다.
IT의 겨우 1달러짜리 MSP 430원칩에서도 JTAG가 제공됩니다.
ARM에서 실지로 디버깅을 위해서는 그 JTAG를 이용해서 통신할수 있는 모듈을 만들고
그리고 호스트측에 디버깅툴이 만들어줘야 합니다.
칩하나 쓰려고 그런거 까지 만들어 쓰기엔 부담이 너무 크겠지요.
그래서 ARM용으로 저렴하게 만든 많은 JTAG ICE들이 제품화 되어 나옵니다.
저렴하다 해도 ICE 소프트웨어와 함께 약 300만원대입니다.
JTAG ICE는 언제나 JTAG를 통해 코드나 제어 신호가 로딩된 후에야 칩의 상태를 볼수
있기 때문에 100% 리얼타임으로 칩의 상태는 알수 없습니다.
리얼타임으로 디버깅 하려면 하드웨어를 직접 에뮬레이션 할수 있는
MDS(Micro computer development system)나 ICE가 좋습니다.
하지만 가격대 성능면에서 JTAG 포트를 타고 있는 ICE도 아주 편리하고
성능이 막강하기 구태어 MDS나 종래의 ICE를 쓸 필요는 없습니다.

 

3.3.2 실험 내용

      Basic reg/mem visiting & simple arithmetic/logic computing

      (thumb) 명령어의 사용법, 더욱 복잡해진 프로그램 브랜치(Branch), PUSH/POP의 사용법, immediate number의 최대/최소 한계에 대한 이해.

 

3.3.3 실험 원리

1. ARM Processor의 작업 상태

      ARM instruction set, 32 bit instructions

     Thumb instruction set, 16 bit instructions

 

Reset후에 ARM core가 시작하며 ARM 명령들이 실행된다. 일반적인 방법은 Branch 와 Exchange instruction(BX, BLX)의 실행에 의하여 Thumb instruction를 실행하여 스위칭 할 있다. Rm 의 Bit[0]를 CPSR의 T bit에 복사하고 bits[31:1]은 PC로 옮긴다.

a)Rm[0]이 1이면 프로세서는 Thumb instruction 실행으로 전환되며, bottom bit의 클리어에 의해 하프워드 바운더리로 Rm 배열안에 어드레스 실행을 시작한다..

b)Rm[0]이 0이면 프로세서는 ARM instuction을 실행하고 Rm[1]의 클리어에 의해 워드바운더리로 Rm배열안에 어드레스를 실행을 시작한다.

ARM에서 Thumb 코드로 변하는 기타 명령에는 exception return들이 있는데 특별한 형식의 데이터 프로세스 명령어를 사용하거나 load multiple register 명령어를 사용한다. 하지만 이 두 명령어들은 일반적으로 예외가 들어오기 전에 실행되고 있었던 명령어로 복귀되도록 사용되며 Thumb mode로 변경하기 위해 사용되지는 않는다. BX와 같은 명령어들은 프로그램 카운터를 변경해서 instruction pipeline을 지우는 일을 한다.

주목 : Thumb 와 ARM사이의 state(상태)를 변경한다 하더라도 프로세서 모드와 레지스터 내용이 변하지는 않는다. ARM 프로세서는 두 개의 작업 상태에서 변경될 수 있다.

2. Thumb State Register Set

Thumb stream의 레지스터 set은 ARM stream의 register set의 subset이다. 프로그래머는 직접접으로 8개의 general resister(R0-R7),PC,SP,LR,CPSP를 사용할 수 있다. 각각의 Supervisor mode는 SP,LR,SPSR를 가지고 있다.

l        Thumb state의 R0-R7은 ARM state의 R0-R7과 같다.

l        Thumb state의 SPSR,CPSR은 ARM state의 CPSR,SPSR과 같다.

l        Thumb state의 SP는 ARM state의 R13으로 mapping 된다.

l        Thumb state의 LR은 ARM state의 R14로 mapping 된다.

l        Thumb state의 PC는 ARM state의 PC(R15)로 mapping된다.

l        Thumb register 와 ARM register사이의 관계를 Figure 3-7에 나타내었다.

3. The as operation in this Lab.

1) .code[16|32]

code 동작은 현재 assemble instruction set을 선택하여 사용한다. Parameter 16은 Thumb instruction set을 선택할 것이다. Parameter 32는 ARM instruction set 선택할 것이다.

                         Figure 3-7 Register State Diagram

 

Syntax Format:

.code [16|32]

 

2) .thumb

as same as .code 16.

 

3) .arm

as ame as .code 32.

 

4) .align

배열방법(Alignment method) : 현재 주소의 배열을 맞추기 위해 filling bit들을 추가한다.

Syntax Format:

.align {alignment}{,fill}{,max}

alignment: the alignment method, possibly 2 xxx, default is 4.

fill: contents of filling, default is 0.

max: maximum number of filling bits. If the number of filling bits exceeds the max, the alignment will not process.

Example:

.align

 

3.3.4 Sample Programs

1. Lab A Sample Source Code

.global _start

.text

_start:

.arm                                                                 /* Subsequent instructions are ARM */

header:

        ADR     r0, Tstart + 1               /* Processor starts in ARM state, */

        BX      r0                      /* so small ARM code header used */

                                                /* to call Thumb main program. */

        NOP   

.thumb

Tstart:

        MOV     r0, #10                 /* Set up parameters */

        MOV     r1, #3

        BL      doadd                   /* Call subroutine */

       

stop:

        B stop

 

doadd:

        ADD     r0, r0, r1              /* Subroutine code */

        MOV     pc, lr                  /* Return from subroutine. */

 

.end                                           /*  Mark end of file */

 

2. Lab B Sample Source Code

.global _start

.text

.equ       num, 20                                                                            /* Set number of words to be copied */

 

_start:

.arm                                                           /* Subsequent instructions are ARM header */

        MOV     sp, #0x400              /* set up user_mode stack pointer (r13) */

        ADR     r0, Tstart + 1           /* Processor starts in ARM state,  */

        BX      r0                      /* so small ARM code header used  */

                                        /* to call Thumb main program. */

.thumb                                                       /* Subsequent instructions are Thumb.  */

 

Tstart:

        LDR     r0, =src                /* r0 = pointer to source block */

        LDR     r1, =dst                /* r1 = pointer to destination block */

        MOV     r2, #num                /* r2 = number of words to copy */

 

blockcopy:

        LSR     r3,r2, #2               /* number of four word multiples */

        BEQ     copywords               /* less than four words to move? */

 

        PUSH    {r4-r7}                 /* save some working registers */

quadcopy:

        LDMIA   r0!, {r4-r7}            /* load 4 words from the source */

        STMIA   r1!, {r4-r7}            /* and put them at the destination */

        SUB     r3, #1                  /* decrement the counter */

        BNE     quadcopy                /* ... copy more */

 

        POP     {r4-r7}                 /* don't need these now - restore originals */

 

copywords:

        MOV     r3, #3                  /* bottom two bits represent number... */

        AND     r2, r3                  /* ...of odd words left to copy */

        BEQ     stop                    /* No words left to copy ? */

wordcopy:

        LDMIA   r0!, {r3}               /* a word from the source */

        STMIA   r1!, {r3}               /* store a word to the destination */

        SUB     r2, #1                  /* decrement the counter */

        BNE     wordcopy                /* ... copy more */

 

stop:

        B                          stop

 

.align

src:

           .long     1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

dst:

           .long     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

 

.end

 

 

댓글달기 회원에게만 댓글 작성 권한이 있습니다. 회원가입하여 정보공유를 하면 좋겠습니다.
첨부파일
  스팸신고 스팸해제
글쓰기
 
이전글 ARM state Mode
다음글 실습2
 
 
| 회사소개 | 이용약관 | 개인정보취급방침 | 이용안내
Copyright ⓒ 2010 KitKorea All rights reserved.
전화 : 031-429-0845 FAX : 031-477-1407
Contact open@kitkorea.com for more information.
법인명(상호):인터전자 주식회사 주소:14120 경기도 안양시 동안구 흥안대로 112-1 (호계동)
사업자 등록번호 안내 [138-81-28277] / 통신판매업 신고 제 안양 1753호 [사업자정보확인]
개인정보보호책임자 :홍성호(open@kitkorea.com) / 대표자(성명):홍성호
cafe24