컴퓨터공부

ARM System Developer's Guide 에 대한 씨랩시스 질문 답

achivenKakao 2007. 3. 16. 03:44
질문1,2
(www.clabsys.com Q/A에 올린 질문)

번역서 76페이지중 Example3.18에서 LDM과 STM등을 사용하는 곳이 나옵니다.

그 명령어에서 레지스터에 값이 써지는 순서가 끼워맞춰서는 이해가 되는데, 명확히 설명된 부분이 없어서 문의드립니다.

제 생각으로는 LDM관련 명령어는 {r1-r3}일때 읽어들이는 순서가 r1->r3 이고, STM관련 명령어는 {r1-r3}일때 저장순서가 r3->r1이라고 보이는데,제가 생각하는게 맞는지 틀리면, 어떤순서로 읽기및 저장이 되는지 설명좀 부탁드립니다.

그리고, 84페이지중 Example3.25에서 LDMFD sp!, {r0-r12, pc}^ 라는 명령어가 나옵니다. 그중 제일 마지막에 있는 ^가 하는 기능이 어떤건지도 설명좀 부탁드립니다.


답>
LDM과 STM의 동작을 이해하실때는 순서보다는 어떻게 저장되고 읽히는지 이해하시면 됩니다.
즉 낮은 레지스터 번호는 낮은 주소에 저장/로드된다고 보시면 됩니다.
예를들어 R0-R2를 A란 주소에 저장을 하고 R7-R9로 읽어들인다면
R0   ==>   A   ==> R7
R1   ==>   A+1 ==> R8
R2   ==>   A+2 ==> R9
과 같이 동작됩니다.

^는 S bit를 의미합니다. 즉, SPSR ==> CPSR 동작을 의미합니다.
이에 대해서는 exception을 보시면 도움이 되실텐데,
MOVS PC,LR 또는 SUBS PC,LR,#4와 같이 exception 처리 후 돌아갈때 사용이 됩니다.

도움이 되셨길 바랍니다. ^^
그럼..

책 364페이지에 설명되어있음


질문 3.
대부분의 ARM명령어는 조건부로 실행될수 있다. 즉, 프로그래머는 주어진 조건이나 테스트상황을 만족할 때에만 명령어가 실행되도록 설정할 수 있다. 이러한 조건부 명령어를 사용하면 성능 및 코드의 집적도를 향상시킬수 있다.

명령어 니모닉의 뒤에는 조건을 나타내는 니모닉 두 문자가 추가될수 있다. 디폴트 니모닉은 AL로 표기하며 "항상 실행하라"는 의미이다.

조건부 실행명령어를 이용하면 분기되는 상황을감소시켜 파이프라인이 깨지는 수를 줄여준다. 이것은 실행되는 코드의 성능향상으로 이어진다. 조건부 실행은 조건필드와 상태플래그에 따라 달라지며, 조건필드는 명령어 상에 위치하고, 상태 플래그는 cpsr상에 위치해 있다.


예를 한번 살펴보자

다음은 EQ조건이 추가되는 ADD명령어에 대해 보여준다.
이 명령어는 cpsr의 Z(zero)플래그가 1로 세트되었을 때에만 실행될 것이다.

; z플래그가 1인 경우에만, ro = r1+r2

ADDEQ r0, r1, r2

;cpsr의 상태가 Z플래그가 되어있으면 실행

비교 명령어와 명령어 니모닉 뒤에 S가 추가된 데이타 처리 명령어는 cpsr의 상태 플래그들을 업데이트 해준다.
다음은 조건부 명령어를 사용하면 어떤 이점이 있는지를 두 어셈블리 코드를 비교하여 설명하려고 한다. 간단한 C코드의 기능을 하는 코드를 조건부 실행명령어와 무조건 실행명령어를 사용하여 각각 구현해 보고 비교해 보자.

while(a != b)
{
   if(a>b) a -=b;
   else    b-=a;
}


레지스터 r1은 a를, 레지스터 r2는 b를 나타낸다. 다음의 코드는
ARM어셈블러에서 작성된 똑같은 알고리즘이다. 이 예제는 분기 명령어가 조건부 실행이 되도록 구현하였다.

;최대공약수 알고리즘
gcd
     CMP r1, r2
     BEQ complete   ; z flag사용    
     BLT lessthan   ; LT :signed less than ,nv or NV n:negative, v:overflow
     SUB r1, r1, r2
     B    gcd

lessthan
     SUB r2, r2, r1
     B   gcd

complete
     .....


이제 완전한 조건부 실행명령어를 이용하여 똑같은 코드를
직접화 시켜보자. 명령어의 수가 현저히 줄어들것이다.

gcd
    CMP r1, r2  ;z flag 사용
    SUBGT r1, r1, r2 ; GT :signed greater than, NzV or nzv
    SUBLT r2, r2, r1 ; LT :signed less than ,nv or NV n:negative, v:overflow
    BNE   gcd


이와같이 ARM명령어는 조건적으로 실행될수 있는데, 이것은 특정한 알고리즘을 수행하는데 필요한 명령어들의 수를 상당량 줄여줄수 있다.


위내용은 ARM SYSTEM DEVELOPER’s GUIDE 중 94페이지의 내용이다.
마지막 예제중 SUBGT와 SUBLT는 N(negative),V(overflow) 플래그도 사용을 한다.
이경우에 N과 V는 어디에서 설정이 이루어 졌는지 알수 없을까?
CMP에서 N과 V도 컨트롤 하는지? 내가 알기로는 Z만 컨트롤 한다고 알고있음.