2.7 판단을 위한 명령어



CMP register1, register2

BEQ L1


register1과 register2가 같으면 L1으로 분기





CMP register1, register2

BNE L1


register1과 register2가 다르면 L1으로 분기



BEQ와 BNE 두 명령어를 조건부 분기라 부른다.



예제

f,g,h,i,j 가 r0부터 r4에 해당한다고 하면


if( i == j ) f = g + h;

else f = g - h;



CMP r3, r4

BEQ, if


SUB r0, r1, r2

B Exit


if: ADD r0, r1, r2

B Exit


Exit:


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

CMP r3, r4

BEQ, Else


ADD r0, r1, r2

B Exit


Else: SUB r0, r1, r2

Exit:


의문사항

1. 레지스터 스필링이란 무엇인가?

자주 사용하지 않는 변수들을 메모리에 넣는 일


2. ARM에서 스택은 어디에 존재하나? 스택을 위한 메모리는 어디에 존재하나?


3. 바이트 주소지정방식과 워드 주소지정방식의 차이는?

ARM은 바이트 주소지정방식을 사용한다.

바이트 주소지정방식은 주소 한 개가 하나의 바이트를 나타내는 것, 워드 주소지정방식은 주소 한 개가 하나의 워드를 나타내는 것.

따라서 바이트 주소지정방식에서는 워드 배열의 각 원소의 주소를 구할 때 인덱스 * 4를 해야한다.


워드 주소를 나타낼 때, 빅 엔디안과 리틀 엔디안 방식이 있다.

빅 엔디안 : 최상위 바이트 주소를 워드 주소로 사용하는 것

리틀 엔디안 : 최하위 바이트 주소를 워드 주소로 사용하는 것

예를 들어, 0x12345678의 값이 있을 때 빅 엔디안일 경우 0x12가 워드의 주소를 나타내고, 리틀 엔디안일 경우 0x78이 워드의 주소를 나타낸다.


컴퓨터 구조 및 설계 4판


page 77


변위와 베이스 레지스터를 사용하는 ARM 주소지정방식은 베이스 레지스터가 시작 위치를 가리키고 변위로 원하는 원소를 선택할 수 있으므로 배열뿐만 아니라 구조체 접근에도 딱 들어맞는다. 

데이터 전송 명령에서 주소 계산에 사용하는 베이스 레지스터를 인덱스 레지스터(index register)라고 부르기도 한다. 원래 배열의 시작주소는 변위에 들어가고 배열의 인덱스가 레지스터에 들어가도록 되어 있었기 때문이다. 하지만, 오늘날에는 메모리가 매우 크고 데이터 할당을 위한 소프트웨어 모델이 훨씬 복잡하다. 따라서 배열의 시작주소가 변위 부분에 다 들어가지 않는 경우가 많으므로 레지스터에 넣는 것이 보통이다.



즉, 변위에 들어갈 수 있는 값의 범위가 32비트보다 작다는 소리인가? 레지스터는 32bit범위.




빅 엔디안 : 최상위 바이트 주소를 워드 주소로 사용하는 것

리틀 엔디안 : 최하위 바이트 주소를 워드 주소로 사용하는 것


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int a = 0x12345678;
 
    char *= (char*)&a;
    printf("%x\n"*p);
    printf("%x\n"*(p + 1));
    printf("%x\n"*(p + 2));
    printf("%x\n"*(p + 3));
 
    return 0;
}
cs




+ Recent posts