Arm 에서 sbc 동작 방법

 

이번 절에서는 ARM 명령어중 데이터 처리 명령어를 알아보겠습니다.
 일단 ARM 데이터 처리 명령어에는 크게 1. 레지스터 오퍼랜드 명령어와 2.시프트(shift)된 레지스터 operand가 있습니다.
 또 레즈스터 오퍼랜드 명령어에는

  • 산술 명령어
  • 비트논리연산 명령어
  • 레지스터이동 명령어
  • 비교명령어

가 있습니다.

   일단 산술명령어는 2진 덧셈, 뺄셈을 뜻합니다. 이때 오퍼랜드는 32bit를 사용하고 부호를 사용하지 않을수도 있고 부호를 사용한다면 2의 보수체계를 사용합니다.
 ADD : 덧셈, ADC : carry와 함께 덧셈
 SUB : 뺄셈 SBC : 케리와 함께 뺄샘
 RSB : 역순으로 뺄셈 RSC : 역순으로 케리와 함께 뺄셈

 비트논리 연산명령어는 두개의 오퍼랜드의 비트를 연산하는 명령어입니다. 예를 들어 11 곱하기 23을 일반적으로 하면 230+23이 되어 253입니다. 하지만 비트연산을 하면 11을 2진수로 표현하면
 01101(2), 23은 10111(2) 입니다. 이 둘을 AND 비트연산을 하면 00101(2)이 되어 5가 됩니다.

레지스터 이동 명령어는 두번재 오퍼랜드첫번재 오퍼랜드로 이동시키는 명령어 입니다. 예를 들어 
 MOV R0,R2 ; r0 := r2 
가 됩니다. 
 하지만 이 과정을 조금 더 정확히 보자고 한다면 이것은 연산명령어, 즉 ALU를 거쳐가야 하므로 사실은 R2에 0을 더하는 연산명령어 입니다.다시 말하면 MOV R0,R2 는 ADD R0,R2,#0 을 바꿔서 쓴 것이라고 생각해도 무방합니다.

 비교명령어는 연산을 하지만 결과값을 레지스터에 저장하는 것이 아니라 CPSR의 Condition flag만이 update된다.

 여기서 ARM CPU만의 특징이 하나 더 나오는데 그것은 바로 Default flag update가 안된다는 점이다. 보통 cpu들은 이런 연산을 할 경우 명령어에 특별한 명령을 더 하지 않아도 flag가 update된다 하지만 ARM CPU에서는 ADD를 하더라도 ADDEQ 와 같은 뒤에 명령어를 더 붙여줘야만 flag가 업데이트 된다.

    이번에는 시프트된 오퍼랜드에 대해 살펴 보겠다.

이 ARM 명령어 세트 형식을 보면 두번재 소스의 코드 길이가 12bit나 된다. 왜 이렇게 많은 bit를 할당해놨을까? 그 이유는 ALU의 shifter에 있다.
 ARM의 ALU의 두번째 source operand쪽 회로에는 Shifter가 달려있다. 즉, 모든 2nd source가 ALU연산을 할 때 shifter를 거친다는 말이다. 이런 이유로 RSB같은 명령어가 존재한다.(뒤에 있는 오퍼랜드를 shift 연산하여 뺄 경우)
 사용 예는 이렇다.
 ADD r0,r1,r2,LSL #3 ; r0 = r1 + (r2 * 3)
이 shift는 한 사이클에 모두 해결되며 31bit까지 할 수 있다. 물론 이 shift의 방법에도 여러가지가 있다.

  • LSL : 왼쪽으로 쉬프트 후 LSB(1의 자리)의 빈자리를 0으로 채움
  • LSR : 오른쪽으로 쉬프트 후 MSB(부호비트)의 빈자리를 0으로 채움
  • ASL : LSL과 같음
  • ASR : 오른쪽으로 쉬프트 한 후 MSB(부호비트)의 빈자리가 양수인 경우에는 0 음수인 경우에는 1로 채운다.
  • ROR : 오른쪽으로 쉬프트 한 후 LSB에서 밖으로 나온 비트는 다시 MSB로 들어간다
  • RRX  : MSB가 비워지면 CCR의 C flag가 입력된다. 나머지는 ROR과 같음


또한 알아두어야 할 것은 Condition Code의 설정이다. 일반적으로 TST 또는 CMP와 같은 비교명령들을 제외한 일반 산술 및 논리 연산은 ARM CPU의 특성에 따라 Condition flag를 update시키지 못한다. 따라서 condition flag를 update시키려면 명령어 끝에 'S'를 붙여 주어야만한다.

아까 지훈이가 물어봤을때 헷갈려서 대답을 못해줬는데
집에 오는 길에 생각나드라
어차피 자다가 깬 김에...(ㅠㅜ)
싸이도 점검 중이고...으음...
마땅히 할일은 없고....으음...
스타나 할까 하다가....으음...
하여간...
사설이 길어졌는데 ADC 와 SBC에 대해 쓰도록 하지

일단 ADC와 SBC가 뭔지는 다들 알거야
더하기와 빼기 연산을 하는데 캐리를 더해준다는 것이지
근데 ADC는 상관이 없는데 SBC를 찾아보면

SBC = OP1 - OP2 + C - 1

이라고 되어있지
문제는 맨 뒤에 붙은 1인데...
왜 1을 빼주는가가 의문점이지

일단 이걸 알아내려면 왜 더하기와 빼기에 캐리가 더해지는 연산이 필요할까
하는 것인데...
알고보면 그만한 이유가 있다

일단 위의 식에서의 C는 캐리가 맞아
하지만 위의 C는 OP1 - OP2의 연산시 발생하는 캐리가 아니고
C플래그에 저장되어 있는 캐리값이야
그러니까 만약 이전 연산에 의해 C 플래그가 SET 되어 있다면
SBC 연산시 C가 1이 되고 아니면 0이 되는거지
그런데 왜 하필 앞에서의 캐리값을 가지고 연산을 하는걸까?
이건 예전에 디지털 실험 등등에서 했던 4-BITS ADDER를 생각하면 쉽다

8비트 ADDER를 만들 경우 4비트 ADDER 2개를 이용해서 만드는 방법이 있는데
이것 역시 마찬가지의 원리야
만약에 우리가 더하거나 빼려고 하는 데이터가
32비트가 아니고 64비트의 수라면....
그러니까 64비트 더하기 64비트 혹은
64비트 빼기 64비트라면 어떻게 할거냐는 것이지
그래서 사용되는 것이 ADC 혹은 SBC 야

예를 들어보면 어떤 64비트의 값을 R0와 R1에 넣고
(상위비트부터 넣는다고 하자)
더하려고 하는 64비트의 값을 R2와 R3에 넣는다고 했을때
두개의 값을 더하면
R0+R2를 R4에 넣고 R1+R3를 R5에 넣는게 되지
하지만 이때 하위비트끼리의 연산
즉 R1+R3에서 캐리가 발생할 경우
상위비트의 연산결과에 1을 더해줘야 하는데
이때 쓰는게 바로 ADC가 되는거야

이와 마찬가지로 SBC도 설명이 되지
다른 점이라면 SBC 역시 하위비트부터 연산하는 것을 기준으로 하기 때문에
ADC와는 다르게 나중에 1을 빼줘야 해
빼기 연산에서 캐리가 발생함은 결과가 양수임을 뜻하기 때문이지
즉 하위비트의 뺄셈에서 캐리가 발생하면 하위비트의 연산결과가 양수라는 뜻이기 때문에
상위비트의 연산에 영향을 미치면 안되는데
이때 이미 C값으로 1을 더해줬기 때문에 1을 빼줘야해
캐리가 없을 경우도 마찬가지지
그래도 이해가 안되는 사람이 있다면 밑에 예제소스를 보고 생각해보기 바래

AREA EX_C, CODE, READONLY
ENTRY

MOV R0, #1
MOV R1, #2

SUBS R2, R1, R0
SBC R3, R0, R1

SUBS R4, R0, R1
SBC R5, R1, R0

END

참고로 위의 소스에서 R0-R1을 할 경우 캐리가 발생하지 않고
R1-R0의 경우 캐리가 발생해.


7. ARM Instruction Sets
7.1 Understanding ARM Instruction set

ARM Instruction Set�� ARM ���ɾ�� �� �������� �̾߱� �ϴ� ���Դϴ�. ��κ��� C �ڵ带 �̿��ؼ� �۾��� �մϴٸ�, �������� ��������� �����ϰ� �־�� �ϴ� ��� ������ �ֽ��ϴ�.
(1) ARM �������� �� �ľ��ϰ� ������ ARM�� ������ �� �� ������ �� �ֽ��ϴ�.
(2) �������� ARM�� Startup �ڵ�� ������ �ʱ�� �DZ� ������ C�� �ۼ��� �� ���� �����ϴ�. �ֱ� Cortex �迭�� Reset ������ �ʱ� ������ Stackaddress���� C�ڵ� �����ε� ��Ʈ�δ� �ۼ��� ���� �մϴ�.
(3) C�����Ϸ��� ����ȭ�� ���� �� �Ǿ� ������, ����� �����ؼ� �ۼ��ϴ� ������� �ڵ庸�ٴ� ����ȭ �� �� �����ϴ�.
(4) Debugging in detail (instruction level debugging)

�Ϲ����� ARM ��������� ���� �Դϴ�.

Arm 에서 sbc 동작 방법

- Directive : ������� �ڵ��� Ư���� �����ϴ� ���þ� �Դϴ�.
- Label : �ݵ�� Space���� ù ��° �÷��� ��ġ�ؾ� �ϰ�, Label ��ü�� Address�� �˴ϴ�.
- Comment : �ּ��� ";" ���� ���ķ� �ۼ��� �ϸ� �˴ϴ�.
- Instructions(ADD, MOV, LDR ...) : ���ɾ���� �ݵ�� �� �κп� ��� �ϳ� �̻��� Space�� �־�� �մϴ�.

7.2 ARM Instruction sets

ARM Processor�� 2���� ���ɾ� ��Ʈ�� �����ϴµ� 32bit ARM ���ɾ�� 16bit Thumb ���ɾ �ֽ��ϴ�. Thumb ���ɾ�� ��� ARM ���μ������� �����ϴ� ���� �ƴϰ� Thumb Ư���� �����ϴ� Core������ ����� ���� �մϴ�. �ֱ� Cortex �迭������ 16bit, 32bit ���ɾ ���� ����� �� �ִ� Thumb-2 Instruction�� ���� �մϴ�. ������ Cortex-M3�� ��쿡�� Thumb-2 Instruction�� ����� ���� �մϴ�. 8bit ������ Jave Byte Code�� ��� �� �� �ִµ� �̰͵� Thumb ���ɾ�� ���� ��� ARM Processor�� �����ϴ� ���� �ƴմϴ�.

Instruction Type Instructions
Data Processing ADD, ADC, SUB, SBC, RSB, AND, ORR, BIC, MOV, CMP, TEQ, …
Multiply MUL, MULS, MLA, SMULL, UMLAL, …
Load/Store LDR, LDRB, LDRH, LDRSH, LDM, STR, STRB, STRH, STRSH, STM, …
Branch B, BL, BX, BLX, …
Status Access MRS, MSR
Swap SWP, SWPB
Coprocessor MRC, MCR, LDC, STC

7.3 Data Processing Instructions

(1) Instructions

Arm 에서 sbc 동작 방법

< Cond >
�ش� ������ ���� ���� �÷����Դϴ�. �ش� �÷��׸� ���� ������ CPSR�� �÷��� ���¿� ���� ���������� ������ �� �� �ֽ��ϴ�. ARM���� �����ϴ� ������ ������ ������� ���Ǻ� ������ �� �̿��ϸ� �б⹮�� �ִ��� �ٿ� �ý��� ������ ��� ��ų �� �ֽ��ϴ�.

< I >
Operland 2�� �����Ǿ� �ִ� �κ��� Immediate Operand ���� �ƴ��� ���θ� ��Ÿ���� ��Ʈ �Դϴ�. �� 25���ʵ�[I] �� "0" �̸� [11 : 0] �� shifter operand�� ������ �ϰ� "1" �̸� Immediate Operand�� ���� �մϴ�. Immediate Operand�� ����, ���� ��� MOV R0, #0x01234 ��� ���� ��� #0x1234�� ����Ű�� ���Դϴ�.

< Opcode >
������ ���μ��� ���� �� � ���������� ��Ÿ���� �ʵ� �Դϴ�. �ش� �ʵ�� ���ɾ�� ������ �����ϴ�.

Opcode Mnemonic Meaning Action
0000 AND Logical AND Rd = Rn AND shifter_operand
0001 EOR Logical Exclusive OR Rd = Rn EOR shifter_operand
0010 SUB Subtract Rd = Rn - shifter_operand
0011 RSB Reverse subtract Rd = shifter_operand - Rn
0100 ADD Add Rd = Rn + shifter_operand
0101 ADC Add with carry Rd = Rn + shifter_operand + Carry
0110 SBC Subract with carry Rd = Rn – shifter_operand – NOT(Carry)
0111 RSC Reverse Subract with carry Rd = shifter_operand - Rn – NOT(Carry)
1000 TST Test Update flags after Rn AND shifer_opernad
1001 TEQ Test Equivalence Update flags after Rn EOR shifer_opernad
1010 CMP Compare Update flags after Rn - shifer_opernad
1011 CMN Commom Update flags after Rn + shifer_opernad
1100 ORR Logical OR Rd = Rn OR shifter_operand
1101 MOV Move Rd = shifter_operand
1110 BIC Bit clear Rd = Rn AND NOT(shifter_operand)
1111 MVN Move Not Rd = NOT(shifter_operand)

< S >
S ��Ʈ�� 1�� ���� ������ ���μ��� ������ ����� CPSR�� ����(Rd�� �������Ͱ� PC�� ��� SPSR�� ������ CPSR�� ����)�� ��Ĩ�ϴ�.
��, 0�� ��쿡�� CPSR�� ������ �ʽ��ϴ�.

< Rn >
ARM ������ ���μ��� ������ �� ����� ù ��° ���۷���� �׻� �������ͷ� �����ؾ� �մϴ�. Rn�� ù ��° ���۷��带 ����Ű�� ������ ������ Op1���� ǥ���� �Ϳ� �ش��մϴ�. ARM���� �ѹ��� �� �� �ִ� ���� �������ʹ� sp, lr, pc ���� �����ؼ� r0~r15 �����Դϴ�. ��, 4Bit�� ���� �������͸� ��Ÿ���� �˴ϴ�. �ش� �ʵ�� ���ɿ� ���� ������ �ʱ⵵ �մϴ�. MOV�� MVN���� �̿� �ش��մϴ�.

< Rd >
���۷��̼��� ����� ����� �������͸� �ǹ��մϴ�. ���� �������͸� ����Ű�Ƿ� 4Bit�� ����ϰ� ��� ���ɿ��� ����Ʈ�� ���Ǵ� �ʵ�. ARM�� ������ ���μ��� ������ ����� �׻� �������ͷ� ���ϴ�.

< Operand 2 >
Immediate Operand Ȥ�� �������� Operand �Դϴ�. <I> �ʵ尡 0�� ��� �������� �Դϴ�.

(2) Syntax : <operation>{cond}{s} Rd, Rn, operand2

- Operand2 is a register
ADD R0, R1, R2

- Operand2 is immediate value
BIC R1, R2, #0xFF

- Operand2 shifted value
ADD R0, R1, R2, LSL #2
SUB R0, R1, R2, LSR R3

- Data movement
MOV R0, R1
MOV R0, #0x1

- Comparisons set flags only
CMP R0, R1
CMP R2, #0x01

(3) Immediate value

Arm 에서 sbc 동작 방법

Immediate value(��� ��)= ROR immed_8 by 2*rot

MOV R0, #0xFF000000
MOV R0, #0x12
MOV R0, #0x104 ; 100000100 --> permitted
MOV R0, #0x102 ; 100000010 --> not permitted
MOV R0, #0x12345678 ; 10010001101000101011001111000--> not permitted

���� �������� ��� ������ "#0x104" �� ����� �� �ִµ� "#0x102", "#0x12345678" ������ �ü� ���� ������ ���� �ϱ��?
"ROR immed_8 by 2*rot" �� ������ �� ���� ���ñ� �ٶ��ϴ�. ��ƴٱ��� ? ^^ ��. ���� ����� �ƴ� �� �ֽ��ϴ�.
�켱 "#0x12345678" ���� ���� �Ǵ��� �ɰ� ��������. Rotate���� ǥ�� ������ ���� ������ 8bit �� �Ѿ����ϴ�.
"#0x102" �� �� �ȵɰ��� ? ���� �����ϸ� 8-bit immediate ���� #rot ���� 2�� �Ѹ�ŭ ���������� �����̼���(ROR) �ؼ� Immediate value�� ���� �� �ִ� ���� �ݵ�� ����� ����ؾ� �Ѵٴ� ���Դϴ�. ���� ���δ� �� ������ ���� �ʳ׿�. �Ʒ� �׸����� ���� �Ͻñ� �ٶ��ϴ�.

Arm 에서 sbc 동작 방법

Arm 에서 sbc 동작 방법

�Ʒ� Immediate value�� �� �ٸ� ���� �Դϴ�.
MOV r0, #0xfc000003 ; 11111100000000000000000000000011
r0�� ��� �� 0xfc000003�� �ִ� �����Դϴ�. �ش� ���� 8Bit �� 0xFF�� 32Bit�� Ȯ���ϰ� ���������� 6�� Rotate ��Ų ���Դϴ�. �׷��� ������ ���� �ʽ��ϴ�.

(4) 32-bit Instruction format

MOV R0, #1

������ �ܼ��� ���� �ε���. ������ ��� 32-bit Instructions ������ �м��� ������ �ϰڽ��ϴ�. �ڵ带 Disassebly �غ���
"0xE3A00001(1110 001 1101 0 0000 0000 0000 00000001)" �Դϴ�.

Arm 에서 sbc 동작 방법

Instruction ������ �ٽ��ѹ� ���� ���� �Ʒ��� �����ϴ�.

Arm 에서 sbc 동작 방법

[31:28] : 1110 - 7.11 Conditional Execution ���� ��� ���� �Դϴ�. �켱�� �׳� "1110" �� Always execution flag ��� �˾� �νñ� �ٶ��ϴ�.
[27:25] : 001 - Operland 2�� �����Ǿ� �ִ� �κ��� Immediate Operand�̹Ƿ� 25�� ��Ʈ�� "1" �Դϴ�.
[24:21] : 1101 - Opcode "MOV" �� "1101" �Դϴ�.
[20] : 0 - ���ɾ� Opcode�� "S" �� ���� �ʾ����Ƿ� CPSR�� ������ ��ġ�� ���ɾ�� �ƴմϴ�.
[19:16] : 0000 - Rn �κ����� �������� ��ȣ�� ǥ�� �մϴ�. ���� "MOV R2, #1" ���ٸ� Rn �� "0000" �� �ƴ϶� "0010" �� ���Դϴ�.
[15:12] : 0000 - Rd �κ��� �����Ƿ� "0000" �Դϴ�.
[11:0] : 8bit Immediate value �μ� "#1" �� �ش��ϴ� "00000001" �Դϴ�.

* ����
MOV R2, #1 ���ɿ� ���� 32-bit Instruction ���� = 0xE3A02001(1110 001 1101 0 0000 0010 0000 00000001)

(5) Examples

R0 = 0x00
R1 = 0x22
R2 = 0x02
R3 = 0x00
R4 = 0x00

Arm 에서 sbc 동작 방법

���������� ������ ���� ������ �Ʒ� �������� ���ʴ�� ���� �������� ������ �������� ���� ?

AND R0, R0, #0xFF ; 0x00 & 0xff = R0�� ���� ��ȯ ����

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

ADD R0, R0, #1 ; R0 = R0 + 1 = 0x1

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

ADD R0, R0, R1 ; R0 = R0 + R1 = 0x01 + 0x22 = 0x23

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

LSL R1, R0, #2 ; 0x23(100011) LSL #2 = 0x8C(10001100) -> ������ �������� 2�� ����Ʈ �ϸ� *4 �� �ѰͰ� �����ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

SUB R3, R2, R1, LSR R2

R3�� ���� 0xFFFFFFDF �� ������ ���� ���Խ��ϴ�. �� �̷� ����� ��������� ?
�켱 R1�� ���������� 2�� ����Ʈ ��Ű�� 0x23�� �ǰ� R2(0x02) ���� R1(0x23) �� ���� ������� -0x21�� �ǰ� �� ���� 2�� ������ ǥ���ϸ�
0xFFFFFFDF �� �˴ϴ�.

  0x21 = 00000000000000000000000000100001
-0x21 = 11111111111111111111111111011111 --> 0x21�� 2�� ����

������ 2�� ������ ���ϴ� ����� ������ 2�������� 0->1, 1->0 ���� �ٲ��Ŀ� 1�� ���ϸ� �ǰ�����.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

BIC R0, R1, #0xFF00

R1(0x8C) =         0000000010001100
0xFF00(65280) = 1111111100000000
BIC =                0000000010001100   ; 0xFF00 �� Bit clear�� �ص� R1�� ���� ��ȭ�� ���׿�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

RSB R0, R1, #0 ; #0 - R1(0x8C) = 0xFFFFFF74(0x8C �� 2�� ���� ��)

RSB ���ɾ�� SUB�ʹ� �ݴ�� ���̳ʽ� ������ ���� �մϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

7.4 Multiply Instructions

(1) Multiply (Accumulate) Syntax
MUL{<cond>}{S} Rd, Rm, Rs ; Rd = Rm * Rs
MUA{<cond>}{S} Rd, Rm, Rs, Rn ; Rd = (Rm * Rs) + Rn

(2) Examples

R0 = 0x01
R1 = 0x02
R2 = 0x03
R3 = 0x04

Arm 에서 sbc 동작 방법

���������� ������ ���� ������ �Ʒ� �������� ���ʴ�� ���� �������� ������ �������� ���� ?

MUL R2, R0, R1 ; R2 = R0*R1 = 0x02

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

MULS R2, R0, R1 ; R2 = R0*R1 = 0x02

MUL ���ɰ� ���� �����Դϴ�. ������ MUL�ڿ� "S" �� ������ ���ɾ� ó���� ���� ���Ŀ� CPSR�� Flag Field �� ���� ����� ���� ������Ʈ�� �˴ϴ�.
�ڼ��� ������ 7.11 Conditional Execution ���� �ڼ��� �ٷ絵�� �ϰڽ��ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

MLA R3, R2, R1, R0 ; R3 = R2*R1 + R0

�� ȿ�����̳׿�. ���ɾ� �ϳ��� ���ϱ� ����� ���ϱ� ������ ���� �� �� �ֽ��ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

SMULL R3, R2, R1, R0 ; R3,R2 = R1*R0

��ȣ�ִ� 64��Ʈ ���� ���ɾ� �Դϴ�. R1*R0 �Ͽ� ���� 32��Ʈ�� R2�� ���� 32��Ʈ�� R3�� ���� �մϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

������ ��ȣ�ִ� ������ ���Դµ�, ���� ������ ������ Ǯ�� ������ �ϰڽ��ϴ�.

R0 = 0xF0000002
R1 = 0x02

R2 = 0x00
R3 = 0x00

�ʱ� ���������� ���� ���� ������ SMULL ���� ������ R2, R3 �� ���� ��� �ɱ�� ?

�켱 0xF0000002�� ���� �̱� ������ ������ �ϱ� ���ؼ��� 2�� ������(F0000002�� 2�� ���� = 0xFFFFFFE)�� ���� ���մϴ�. �׸��� ���� 0xFFFFFFE * 0x02 = 0x1FFFFFFC �� �մϴ�. ������ ������ ���� ������ ǥ���ϱ� ���ؼ� �ٽ� 0x1FFFFFFC �� 2�� ������ ���մϴ�. �̶� SMULL�� 64��Ʈ ���� ���ɾ� �̹Ƿ� 64��Ʈ�� Ȯ�� �մϴ�. �̷��� �ϸ� ���� 32��Ʈ�� 0xFFFFFFFF �̰� ���� 32��Ʈ�� 0x04�� �˴ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

���� �׸����� "MOV R0, #-268435454" ��� R0�� �ʱ�ȭ �ϰ� �ֽ��ϴ�. �̰��� 0xf0000002�� ���� ����(�ֻ��� ��Ʈ�� 1�̸� ��������)�̱� ������ �����Ϸ����� �˱� ������ ���� 10������ ǥ���� ���ذ� �Դϴ�.

7.5 Load/Store Instructions

Memory�� ������ �������ͷ� �̵�(Load)�ϰų� ���������� ������ �޸𸮿� ����(Store) �ϴ� ���ɾ� �Դϴ�. ������ Access������ ���� �Ʒ��� ���� �з� �˴ϴ�. Load, Store�� ARM ���ɾ� ��� ���� ���� ���Ǵ� ���ɾ� �̸� ������ �߿��մϴ�. �ݵ�� ���� �ϰ� �־�� �մϴ�.

- Word : LDR, STR
- Byte : LDRB, STRB
- Halfword : LDRH, STRH
- Signed byte : LDRSB
- Signed halfword : LDRSH

(1) Syntax
LDR{cond}{size} Rd, <address>
STR{cond}{size} Rd, <address>

(2) Addressing Mode

- Pre Index : Rd �������Ϳ� �����͸� ���� �̵���Ų �� <address> offset�� ���� Ȥ�� ���� �մϴ�.

R0 = 0x31000000
R1 = 0x00
R2 = 0x00

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

���������� ����� �޸�(�޸� �迭�� ��Ʋ �����) ���� ���� ������ �Ʒ� �������� ���ʴ�� ���� �������� ������ �������Ϳ� �޸��� ���� ?

LDR R1, [R0] ; R1 <-- M[R0]

R0�� ����Ű�� �ִ� 0x31000000 ������ �޸� ���� 0x67452301 �Դϴ�. �׷��Ƿ� LDR ���� ���Ŀ� R1���� 0x67452301 ���� ���� �˴ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

STR R1, [R0, #4] ; R1 <-- M[R0+4]

R0�� ����Ű�� 0x31000000 �������� 4-byte �� ���� ������ �޸� ��ġ�� R1(0x67452301) ���� ���� �մϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

STR R1, [R0, #4]! ; R1 <-- M[R0+4], then R0 <-- R0+4

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

R1�� 0x31000004������ �޸� ���� 0x67452301�� �����ϰ� �� ���Ŀ� R0�� �������Ͱ� + 0x04 �� ���� �մϴ�.
�������� 0x30000000, 0x30000004 ������ ������ �����ؼ� ȥ�� �ܼ��� ������ R1���� R0�������Ͱ� + 0x04 = 0x30000004 ������ ���� ������ �ȴٴ� ���� ��� �Ͻñ� �ٶ��ϴ�.

Arm 에서 sbc 동작 방법

- Post Index: Offset calculation after data transfer

R0 = 0x31000000
R1 = 0x00
R2 = 0x04

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

���������� ����� �޸�(�޸� �迭�� ��Ʋ �����) ���� ���� ������ �Ʒ� �������� ���ʴ�� ���� �������� ������ �������Ϳ� �޸��� ���� ?

LDR R1, [R0], R2 ; R1 <-- M[R0], then R0 <-- R0+R2

R1�� R0 �� ����Ű�� 0x31000000������ �޸𸮰� 0x67452301�� ���� �����ϰ� ���� R0 = R0(0x31000000) + R2(0x04) �� �˴ϴ�.
Preindex ��Ŀ����� R0�� ���� ����ϰ� ���� �޸� ������ ���� R1�� �����Ͽ����� Postindex ��Ŀ����� ������ �ݴ밡 �˴ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

STR R1, [R0], #4 ; R1 <-- M[R0], then R0 <-- R0+4

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

�������� R1�� �� 0x67452301�� �޸� 0x31000004 ������ ������ �ϰ��� ���Ŀ� R0 = R0(0x310000004) + 0x04 �� ���� �մϴ�.

Arm 에서 sbc 동작 방법

(3) Literal Pool
32bit�� ��� ���� ���� �� ���� 12bit�� ������ ���� ���Ŀ� ���߾ ����ؾ� �մϴ�. Immediate value ���� �ڼ��� ���� �ߴ� �����Դϴ�.

MOV R0, #0x12345678 ; illegal (build error)
LDR R0, =0x12345678 ; legal (build success)
MOV R0, #0x104 ; legal
MOV R0, #0x102 ; illegal

���� �������� 0x12345678 ���� LDR ���ɾ ����ϸ� ���� ���� ����� ������ ���� �˼� �ֽ��ϴ�. LDR���ɾ ����ϴ� ���� ���غ��̱�� ������ �޸𸮿� �����ϱ� ������ �ӵ��� ���� ������������..

7.6 Load/Store Multiple Instructions

LDR, STR ���ɾ�� ����� ���� ������ Rn�������� ���� ����Ű�� �޸� ��ġ�� ������ �������� ������ ���� �� �� �ֽ��ϴ�.

(1) Syntax
LDM{cond}{addr_mode} Rn{!}, <register_list>{^}
STM{cond}{addr_mode} Rn{!}, <register_list>{^}

(2) Addressing Mode
- IA : increment after
- IB : increment before
- DA : decrement after
- DB : decrement before

(3) Examples

* �������� ����

R0 = 0x000A

R4 = 0x000B

R5 = 0x000C

R13 = 0xFFF0


STMIA R13!, {R0,R4-R5} ������ ����� ?

Arm 에서 sbc 동작 방법

STMIB R13!, {R0,R4-R5} ������ ����� ?

Arm 에서 sbc 동작 방법

STMDA R13!, {R0,R4-R5} ������ ����� ?

Arm 에서 sbc 동작 방법

STMDB R13!, {R0,R4-R5} ������ ����� ?

Arm 에서 sbc 동작 방법

������ ARM Compiler�� Stack ���۽� Full Descending Stack ������� ���� �ϰ� �ֽ��ϴ�. STMDA ���ɾ�� ������ ��� �Դϴ�. �� Stack Pointer�� �׻� ��ȿ�� �����͸� ����Ű�� �ְ� �ּҰ� �����ϴ� �������� ������ �˴ϴ�.

- Stack ���� PUSH, STMDB ��ſ� �Ʒ��� ���� ����� ���� �մϴ�.
STMFD SP!, {R4-R12, LR}


- Stack ���� POP, LDMIA ��ſ� �Ʒ��� ���� ����� ���� �մϴ�.
LDMFD SP!, {R4-R12, PC}
LDMFD SP!, {R0-R12, PC}^

"^" �����ڴ� �������� ��������(Rd)�� PC�� ��쿡 SPSR�� CPSR�� �ϱ����� �϶�� ���� �Դϴ�.

7.7 Branch Instructions

Ȥ�� ���� �Լ��� ���� ���ν����� �������� �˰� �ֳ��� ? 2���� ��� ���� ���α׷� �帧���� ����(�б��Ͽ�)�� Ư�� �۾��� �����ϴ� ���� ���� �մϴ�. ������ �����ϰ� �������� �̾߱� �ϸ� ���� ���ν����� �б� ���Ŀ� �б��ϱ� ������ �帧���� �ǵ��� ���� �ʰ� �б��� �ּҿ��� ���� ���α׷� ������ ��� �� ��쿡 ����� �ϰ� ���� �Լ��� �б��� �ּҿ��� Ư�� �۾��� �����ϴٰ� �б� ������ �ּҷ� �����Ͽ� ���α׷��� ���� �ϵ��� �մϴ�. ������ ��� ���׿�. �׸��� ���ؼ� �������� ������ ������ �սô�.

* ���� ���ν��� ȣ��� ���α׷� �帧

Arm 에서 sbc 동작 방법

* ���� �Լ� ȣ��� ���α׷� �帧

Arm 에서 sbc 동작 방법

(1) Syntax
B{L}{cond} <target_addr>
target_addr <-- pc + SignExtended(immed_24)<<2

- ���⼭ PC�� Pipeline ���� ���� �ߵ�� Branch Instruction �� �ּҿ��� 8�� ���� ��ġ�� �˴ϴ�.

(2) Branch Range
-32MB ~ +32MB

�б� ������ +- 32MB ������ ������ �Ǵ� ������ 2^24 = 16MB << 2 �� �ϸ� 64MB �̰� �̸� +- �� �ϸ� 32MB ������ �Ǵ� ���Դϴ�.

(3) Examples
B Label
MOV PC, #0
MOV PC, LR
�������� R15(PC) �� ���� �б��� �ּҸ� �����Ͽ��� �бⰡ ���� �մϴ�.

LDR PC, =func


������ LDR ���ɾ ����ϸ� Branch���ɾ ������������� 1���� ������ �ִµ� 4GB�̳������� ������ �бⰡ ���� �ϴٴ� ���Դϴ�.
Branch ���ɾ��� �б� range�� -32MB ~ +32MB�� ������ �ֽ��ϴ�. ���� �޸𸮿��� �ּҸ� �о�;� �ϹǷ� ���ɸ鿡���� ���� �ʰ�����.

(5) �Լ� ȣ��(BL)
- �Լ� ȣ���
BL func --> B ���ɾ�� �ٸ����� LR�������Ϳ� PC-4 �� Address���� H/W������ ������ �˴ϴ�.

- ARM ��� �Լ� �����
MOV PC, LR --> LR ���� �̹� BL ���ɾ��� �ּ� +4 �� ���� ������ �Ǿ� �־� BL ���ɾ� �������� ������ ������ �� �ֵ��� �մϴ�.

- Thumb ��� �Լ� �����
BX LR

(6) Subsequent Function Calls
�Լ��ȿ��� �Լ��� �ٽ� ȣ���� �ϸ� ����� �߻��� �Ұ���. ���� �ڵ带 ������ �м��� ������ �ϰڽ��ϴ�.

Arm 에서 sbc 동작 방법

���� �������� �����Լ��� ȣ���ϰ��� ���Ŀ� main ��ƾ�� �ִ� R2���� #3�� ������ �Ǿ� �־�� �մϴ�. ��� ���⿡ #11�� ������ �Ǿ� ������ �����ϴ�.
R0, R1�� func1���� ���� #3, #4 �� ������ �ǰ� func2�� ��ġ�鼭 #5, #6�� ������ �˴ϴ�. �׷��� #11�� �ɰ��̶�� ������ �ɼ� ������ ����� func1�� ADD ���ɾ �ݺ��ؼ� ������ �ɰ��Դϴ�. �ֳ��ϸ� main���� func1���� branch�Ҷ������� LR���� BL���ɾ� Address+4 �� ������ �ǰ� func1���� func2�� �б� �Ҷ� �ٽ� LR���� func2�� �б��ϴ� BL���ɾ� Address+4�� ������ �Ǿ� ���� func2���� MOV PC, LR �� ������ �ϸ� func1�� ADD ���ɾ�� PC�� �̵��� �ϰ� �ٽ� func1���� MOV PC, LR �� ������ �Ǹ� LR ���� ���ؼ� �ٽ� func1�� ADD ���ɾ �ݺ��ؼ� ������ �ɰ��Դϴ�. ���� �����ѵ� ������ �� ���� ���� �� �� �ֽ��ϴ�. �� �������� �˼� �ִ°��� ���� �Լ��� ȣ���� ��쿡�� �����Լ������� �ݵ�� LR�� �����Լ����� ����� �������͵��� Stack�� ����� �ϰ� �����Լ����� �������� �ٽ� Stack���� ������ �ؾ� �Ѵٴ� ���� �� �� �ֽ��ϴ�. �׷��� ���� ������ main ��ƾ�� �ִ� R2�� #3�� ������ �ǵ��� ������ �ϸ� ��� �ɱ�� ?

Arm 에서 sbc 동작 방법

���� �׸����� MOV SP, #98304 �� �ϴ� ������ Stack�� ����ϱ� ���ؼ� Supervisor ����� Stack �����͸� �ʱ�ȭ �ϴ� ���Դϴ�. ������ Stack �������� �ּҴ� ���� Ÿ�ٸ��� �ٸ� �� �ֽ��ϴ�. Stack �����ʹ� �ַ� �ý����� �� �޸𸮿� ��ġ �մϴ�.

(7) Veneer
���Ͼ��� �� �����׿�. Ȥ�� ���Ͼ� ���� �̶�� ���� ��� ���̳���? ���� ���� �������� ����� �ٿ��� ���� ���� �Դϴ�. ���� ������ Veneer��� ������ ���� ���Ͼ� ������ ����°Ͱ� �����Ѱ� �����ϴ�. ��� Veneer��� ���� ARM�� Ư���� �ƴϰ� �����Ϸ����� �����ϴ� ��� �Դϴ�.���� B, BL ���� �б� ���ɾ�� -32MB ~ 32MB ���������� �бⰡ �����ϴٰ� �Ͽ����ϴ�. ������ �Ʒ� �׸��� ���� MyFunc2�� ȣ���Ҷ� �����Ϸ����� �ڵ����� Veneer��� �߰� �б����� ���� 32MB ������ ����� ���� �Լ��� ȣ�� �����ϵ��� ����� �ݴϴ�.

Arm 에서 sbc 동작 방법

���� ��� �̿ܿ��� �߰��� �Ʒ��� ���� ����� �ֽ��ϴ�.

- ARM to ARM or Thumb to Thumb ���� �б� : Long branch capability
- ARM to Thumb or Thumb to ARM ���� �б� : Long branch capability and interworking capability

7.8 Status Register Access Instructions

(1) Syntax
MRS{cond} Rd, CPSR ; CPSR�� ���� Rd �������ͷ� �о� �ɴϴ�.
MRS{cond} Rd, SPSR ; SPSR�� ���� Rd �������ͷ� �о� �ɴϴ�.

MSR{cond} CPSR_<fields>, #<immediate>
MSR{cond} CPSR_<fields>, <Rm> ; Rm ���������� ���� CPSR�� ���� �մϴ�.
MSR{cond} SPSR_<fields>, #<immediate>
MSR{cond} SPSR_<fields>, <Rm> ; Rm ���������� ���� SPSR�� ���� �մϴ�.

�������� ���� ������ CPSR ���������� ������ �ٽ��ѹ� Ȯ�� �ٶ��ϴ�.

Arm 에서 sbc 동작 방법

(2) Examples

- IRQ �� Enable �ϴ� �ڵ� �Դϴ�.

�Ʒ� ���ɾ� ���� ����Ǵ� ������ CPSR���������� ��ȭ���� Ȯ���� ���ñ� �ٶ��ϴ�.

MRS R0, CPSR
BIC R0, R0, #0x80 ; 7�� ��Ʈ�� clear �ϸ� ���ͷ�Ʈ�� Ȱ��ȭ �˴ϴ�.
MSR CPSR, R0

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

BIC, MSR ���ɿ� ���ؼ� CPSR�� I �� "0" ���� ����(Unmask) �Ǿ� Interrupt�� �����ϰ� �Ǿ����ϴ�. ������ CPSR_fc �� CPSR�� ���� �������� �Դϴ�.

Arm 에서 sbc 동작 방법

- IRQ �� Disable �ϴ� �ڵ� �Դϴ�.
MRS R0, CPSR
ORR R0, R0, #0x80 ; 7�� ��Ʈ�� set �ϸ� ���ͷ�Ʈ�� ����� �� �����ϴ�.
MSR CPSR, R0

��Ȥ MSR_c, MRS_x ������ ���Ǵ� �������� �ִµ� ���� ������ ���� flag�� �ǹ̴� �Ʒ��� �����ϴ�. �׸��� ���� ������ _c, _x ���� �ǹ̸� ��Ȯ�ϰ� �ϱ� ���ؼ� ����ϴ� ���ϻ� �����ص� �ƹ� ������ ������ �ʽ��ϴ�.
c = PSR[7:0]
x = PSR[15:8]
s = PSR[23:16]
F = PSR[31:24]

7.9 Software Interrupt Instruction

(1) Syntax
SWI{cond} <immed_24>

SEI ���ɾ�� S/W ������ ���������� ARM�� IRQ ���ܸ� �߻� ��ŵ�ϴ�. �ַ� OS���� User application���� �ü�� ���� ��ƾ�� ȣ���� ��쿡 Ư�Ǹ�忡�� ���ϱ� ���ؼ� ���� ���˴ϴ�.

(2) Examples
SWI #0x123456

7.10 SWP Instruction

(1) Syntax
SWP{cond}{B} Rd, Rm, [Rn]

(2) Operation
Temp <-- [Rn]
[Rn] <-- Rm
Rd <-- Temp

(3) Semaphore Instruction
���ɾ� �����߿� ���ͷ�Ʈ���� �޸��� Read, Write �� �� �� �ִ� Atomic ������ �Ҽ� �ֽ��ϴ�. Atmoic�̶�� �� �����µ���, �̰��� � ������ 1���� ���۷��̼����� �Ϸ��ϴ� ���� �ǹ��մϴ�. �� Atmoic ���۷��̼��� ����Ǵ� ���ȿ��� ���ͷ�Ʈ�� �߻����� �ʴ� ���Դϴ�.

(4) Examples

R0 = 0x01
R1 = 0x02
R2 = 0x31000000

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

���������� ������ ���� ������ �Ʒ� �������� ���ʴ�� ���� �������� ������ �������� ���� ?

SWP R0, R1, [R2]

R2 �� ����Ű�� �ּ�(0x31000000)�� �� 0x78563412�� ���� R0�� ������ �Ǿ���,

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

R1�� �� 0x02�� R2�� ����Ű�� 0x31000000 �޸𸮿� ������ �Ǿ����ϴ�.

Arm 에서 sbc 동작 방법

�Ʒ��� ���� ����Ʈ ���ɾ� �Դϴ�. SWPB ���ɾ ������� ��� R0 ���� � ���� ������ �ɱ�� ?

SWPB R0, R1, [R2]

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

Arm 에서 sbc 동작 방법

������ SWP�� �����ϰ� ���� ����Ʈ ������ SWP�� �ȴٴ� �͸� �ٸ��ϴ�. ���� �׸����� ���� �Ͻñ� �ٶ��ϴ�.

7.11 Conditional Execution

ARM��� ���� ������ ������ ������� ���ɾ���� Ư�� ������ �������� ������ ���� ��ų �� �ֽ��ϴ�. �̷��� ���Ǻ� ������ �����ϸ� ���ɸ鿡�� �Ʒ��� ���� ������ �ֽ��ϴ�.

- Increase code density
- Decrease the number of branches

Thumb��忡���� �б���ɾ� �̿ܿ��� �� ���Ǻ� ���� ����� ����� �� �����ϴ�. �� ������ ���ɾ��� ���̰� Thumb ��忡���� 16bit�� ������ �Ǿ ���Ǻ� ������ �Ҹ�ŭ �������� ������ ������� ���ϱ� �����Դϴ�. �׷��� ���� ������ �����̶�� ���� ��͵��� �������?
ARM ���ɾ� �����Ҷ� ��ó���� ���Դ� �׸��ε���Ʒ� �׸��� ���� ���� ���ǿ� ���ؼ� �����ϵ��� �ϰڽ��ϴ�.

Arm 에서 sbc 동작 방법

< Cond >
�ش� ������ ���� ���� �÷����Դϴ�. ������ ���μ��� ���ɾ�� �翬�� ���Ե˴ϴ�.
�ش� �÷��׸� ���� ������ ���� �÷��� ��������(CPSR)�� ���¿� ���� ���� ���θ� �����ϴµ� ���Ǵ� �÷����Դϴ�.

ARM ���ɾ��� ���̴� 32bit��� �Ͽ����ϴ�. 32bit�߿��� 4bit�� ���Ǻ� ������ �ϴµ� �Ҵ��ϰ� �ֽ��ϴ�. [31:28] bit�� �ٷ� <Cond> ��Ʈ �Դϴ�.
�׸��� <Cond> �ʵ忡 �ü� �ִ� �͵��� �Ʒ� ǥ�� �����ϴ�.

Cond Mnemonic Meaning Condition flag state
0000 EQ Equal Z = 1
0001 NE Not Equal Z = 0
0010 CS/HS Carry set / unsigned >= C = 1
0011 CC/LO Carry clear / unsigned < C = 0
0100 MI Minus/Negative N = 1
0101 PL Plus/Positive or Zero N = 0
0110 VS Overflow O = 1
0111 VC No overflow O = 0
1000 HI Unsigned higher C = 1 & Z = 0
1001 LS Unsigned lower or same C = 0 | Z = 1
1010 GE Signed >= N == V
1011 LT Signed < N != V
1100 GT Signed > Z == 0, N == V
1101 LE Signed <= Z == 1 or N! = V
1110 AL Always  
1111 (NV) Unpredictable  

������ �츮�� ���ݱ��� ����� �Դ� MOV, ADD ���ɾ� �ڿ� Mnemonic ���� ����� �ϸ� "Always" �� ����Ǿ ������ �� ���Դϴ�.

(1) Condition Flag Change

Condition Flag������ Data Processing Instructions �� ���ؼ��� ������ ������ ���ɾ� �ڿ� "S" Prefix�� ����ؾ߸� �մϴ�.
Condition Flag�� CPSR���������� [31:24] ��Ʈ �ʵ忡 ���� �Ǿ� �ֽ��ϴ�.

Arm 에서 sbc 동작 방법

������ ���� �����Ѱ���. ������ ���ؼ� ���� ������ �սô�.

(1) Examples1
NZCV �÷��װ� ��ȭ�ϴ� ���� ���Դϴ�. ���⼭ N(Negative), Z(Zero result) ������ ��Ȯ�Ѱ� ������ Carry, Overflower �� ��� �ٸ� ���� ��� ?
�Ʒ� �������� �����ϸ鼭 �������� ���� ���ñ� �ٶ��ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

- N : ������ ��� R2(0x40000000)�� �ֻ��� ��Ʈ�� "1" �� �ƴ�
- Z : ������ ��� R2�� 0x0 �� �ƴ�
- C : 32-bit �� �Ѿ� �����Ƿ� Carry �� �߻�
- V : ARM ���� Overflow �� �����ϴ� ����� MSB ���� ��Ʈ���� �߻��� Carry("0" �� "1" �� ���ص� Carry�� �߻����� �ʾ����Ƿ� "0")�� MSB���� �߻��� Carry("1" �� "1" �� ���ؼ� Carry �� �߻� �����Ƿ� "1")�� ���� �޶����� ��쿡 Overflow�� ���� �˴ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

- N : ������ ��� R2(0x00000000)�� �ֻ��� ��Ʈ�� "0" �̹Ƿ� Negative �߻����� ����
- Z : ������ ��� R2�� 0x0 �̹Ƿ� ����
- C : 32-bit �� �Ѿ� �����Ƿ� Carry �� �߻�
- V : MSB ���� ��Ʈ���� �߻��� Carry("0" �� "0" �� ���ص� Carry�� �߻����� �ʾ����Ƿ� "0")�� MSB���� �߻��� Carry("1" �� "1" �� ���ؼ� Carry �� �߻� �����Ƿ� "1")�� ���� �޶����� ��쿡 Overflow�� ���� �˴ϴ�.

Arm 에서 sbc 동작 방법
Arm 에서 sbc 동작 방법

- N : ������ ��� R2(0x80000000)�� �ֻ��� ��Ʈ�� "1" �̹Ƿ� Negative �߻�
- Z : ������ ��� R2�� 0x0 �� �ƴ�
- C : 32-bit �� �Ѿ� �����Ƿ� Carry �� �߻�
- V : MSB ���� ��Ʈ���� �߻��� Carry("1" �� "1" �� ���ؼ� Carry�� �߻������Ƿ� "1")�� MSB���� �߻��� Carry("1" �� "1" �� ���ؼ� Carry �� �߻� �����Ƿ� "1")�� ���� �ٸ��� �����Ƿ�Overflow�� ���� ���� �ʽ��ϴ�.

(2) Examples2

ADD R0, R1, R2 --> does not update the flags( "S" Prefix �� ���� )
ADDS R0, R1, R2 --> update the flags ( "S" Prefix �� ���� )

Arm 에서 sbc 동작 방법

SUBS R2, R1, R0 -- SUBS ���� ���� ���Ŀ� CPSR�� condition flag�� ������Ʈ �˴ϴ�.
ADDEQ R3, R1, R0 -- condition field �� Z flag �� Set �Ǿ� ������ ������ �ǰ� �׷��� ������ NOP(�ܼ��� CPU�� 1Clock�� �Һ�)������ ���� �˴ϴ�.
condition field �� Z flag �� Set �Ǿ��ٴ� �ǹ̴� R1, R0 �� ���� ���Ƽ� R3�� "0" �� ������ �Ǿ��ٴ� �ǹ� �Դϴ�.

������ CMP, TST, CMN, TEQ instructions ���� ��, �˻� ���ɾ� ���� "S" Prefix �� ���̵� CPSR�� condition flag �� ������Ʈ �Դϴ�.

���� ������ Conditional Execution�� ������� ���� ������ ���� �����ؼ� ���� ������.

if(a==0) a = a + 1;
else a = a – 1;

Non Conditional Execution Conditional Execution
      cmp r0, #0
      bne AAA
      add r0, r0, #1
      b BBB
AAA
      sub r0, r0, #1
BBB
cmp r0, #0
addeq r0, r0, #1
subne r0, r0, #1

5 instructions
1 branch execution
3 instructions
0 branch execution

���Ǻ� ������ ��������μ� instructions �� 2���� �ٿ��� ���� �߿��� ���� branch ���ɾ��� ������ �ߴٴ� ���Դϴ�.
branch ������ ARM pipeline�� ���ʶ߸��� ������ ���ɿ��� ������ ġ�����Դϴ�.

8. Thumb Instruction Sets
Thumb ���ɾ�� ARM ���ɾ ���ؼ� 16bit��� ���ɾ��� ���� ������ ���� ������ �ֽ��ϴ�. ���� ������ ���Ǻ� ���� ������ ����� ���� ���ٴ� ���Դϴ�.
Thumb ���ɾ�� ARM�� �����ϴ� �־ ū �κ��� ���������� �ʴٰ� ���� �DZ� ������ �����ϰ� Ư�� ������ Ȯ���ϰ� �Ѿ� ������ �ϰڽ��ϴ�.

8.1 Thumb Instruction Ư¡
(1) 16-bit length instruction set
(2) ARM ���ɾ�� �ڵ��� �������� �����ϴ�.( about 65% of ARM instruction )
(3) �Ϲ������δ� 32bit ARM���ɾ� ���ٴ� �ӵ��� �������� 16bit memory �ý��ۿ����� �׷��� ���� ���� �ֽ��ϴ�.

Arm 에서 sbc 동작 방법

8.2 Thumb Instruction ���� ����

- Limited Access to Registers : R0-R7 registers are accessible.
- Narrow Range of Immediate Value
- Not Flexible for Exception Mode
- Exception Handler should be executed in ARM mode. : Exception�� �߻��ϸ� �׻� ARM ���� ��ȯ�� �˴ϴ�.
- Limited conditional instruction.
- Branch instructions can be executed conditionally.
- Inline Barrel Shifter is not used.

8.3 Thumb, ARM Instruction ��

�Ʒ� �ڵ带 ARM ���ɾ�� Thumb ���ɾ�� �ۼ��ϰ� ���� ���ñ� �ٶ��ϴ�.

if(x>=0) return x;
else return –x;

ARM Instruction Thumb Instruction
abs_rtn
      CMP r0, #0
      RSBLT r0, r0, #0
      MOV pc, lr
abs_rtn
      CMP r0, #0       
      BGE return
      NEG r0 r0
return
      MOV pc, lr
- Instructions : 3
- Size : 12Bytes
- 16-bit bus : 6access
- 32-bit bus : 3access
- Instructions : 4
- Size : 8Bytes
- 16-bit bus : 4access
- 32-bit bus : 4access

���� ǥ���� 16-bit bus �ϰ���� access Ƚ���� ���� ������ Thumb ���ɾ ȿ���� ���̱⵵ �մϴ�.

8.4 ARM/Thumb Interworking

ARM ���� Thumb ��带 ���� ��� �� ���� �ֽ��ϴ�. ������ ���ÿ� ���ɾ� ���� ��� ����� �� �ִ°��� �ƴϰ� ARM ��忡�� BX branch���ɾ ���ؼ� Thumb ���� ��ȯ�� �Ҽ��� �ְ� �ٽ� Thumb ��忡�� BX ���ɾ �̿��ؼ� ARM ���� ���� �� �� �ֽ��ϴ�.

(1) BX Instruction
BX{cond} Rm
CPSR.T <-- Rm[0], PC <-- Rm & 0xFFFFFFFE

BX���ɾ�� �Ϲ� �б���ɾ�� ����Ѱ� ������ ���� �ٸ��ϴ�. ������ 32bit ARM ��忡�� Thumb ���� ��ȯ�� �Ҷ� 32bit ���ɾ� ���� 16bit �� ����Ǹ鼭 PC�� �ּ� �����ϴ� ���� 4byte���� 2byte�� �ٲ�� ������ �׷� ���Դϴ�. �翬�� Thumb ��忡�� ARM ���� �ٽ� ���� �Ҷ��� �ݴ��� ��� �̰���? ���� ����� ? ���� �� ���� �ϵ��� �ϰڽ��ϴ�.

Arm 에서 sbc 동작 방법

���� �׸����� ���� �ڽ��� �� ���ø� armcode �κ��� 32��Ʈ �ڵ� �������̰�, thumbcode �κ��� 16��Ʈ ������ �ڵ� ���������� �� �� �ֽ��ϴ�.
0x5C address�� �ڵ� BX, R0 �ڵ尡 ������ �Ǿ����� ���������� ���¸� ���� �Ʒ��� �����ϴ�.

thumbcode �� ���۵Ǵ� �ּҴ� 0x6C �ε�, armcode�� "BX, R0(0x6d)" �ڵ忡 ���ؼ� 0x6C�� �ƴ� 0x6D �� �б� �϶�� �Ǿ� �ֽ��ϴ�. �ùٸ��� ������ �ɱ�� ? ���� �� ������ �˴ϴ�. �̰��� ����� ������ ������ "CPSR.T <-- Rm[0], PC <-- Rm & 0xFFFFFFFE" �� �ֽ��ϴ�.
�켱 CPSR.T = 1 �� ������ �Ǵ� ���� Rm(1101101) �� ������ ��Ʈ�� "1" �̱� �����Դϴ�. ���� Rm(1101101) & 0xFFFFFFFE �� ���ؼ� ���� BX�б� ���ɾ ���ؼ� �б�Ǵ� �ּҴ� 0x6C �� �˴ϴ�. BX ���ɾ�� Rm(1101101) & 0xFFFFFFFE �ؼ� �б⸦ �ϴ� ������ ARM ���(32��Ʈ)�̰� Thumbmode(16��Ʈ) �̰� PC�� �ּҸ� �׻� 2�� ����� ���� �ϱ� ���ؼ� �Դϴ�.

Arm 에서 sbc 동작 방법

9. AAPCS
9.1 Procedure Call Standard for the ARM Architecture

���� �̾߱� �ϸ� ARM���� ���� ��ƾ�� ȣ���Ҷ��� ��������, ���� ��� ����� ���� ���Դϴ�. �Ʒ� ǥ�� Procedure call�� ���Ǵ� �������͵��� ǥ�� ������ ���Դϴ�.

Register Synonym Special Role in ther procedure call standard
r15   PC Program Count
r14   LR Link Register
r13   SP Stack Pointer
r12   IP The Intra-procedure-call scratch register
r11 v8   Variable register8
r10 v7   Variable register7
r9 v6   Variable register6
Platform register
Ther meaning of the register is defined by the platform standad
r8 v5   Variable register5
r7 v4   Variable register4
r6 v3   Variable register3
r5 v2   Variable register2
r4 v1   Variable register1
r3 a4   Argument / scratch register4
r2 a3   Argument / scratch register3
r1 a2   Argument / scratch register2
r0 a1   Argument / result / scratch register1

* ������ scratch register���� �����ƾ ȣ��� ������ ���� �� �ִ� ������ �ִ� �������� �Դϴ�. �׷��Ƿ� �����ƾ ȣ��� Stack�� ����� ���� �����ƾ�� ȣ�� �ؾ� �մϴ�.

���� ǥ���� �˼� �ִ� ���� �Լ��� ȣ���Ҷ� �Լ��� ���� 4�� ������ r0 ~ r3�� ������ �Ǿ� ȣ���� �ǰ� �Լ� ���� return�� ���� ��� ���� r0�� ��Ƽ� �Լ��� ȣ���� ���� �Լ��� ���� �����ϰ� ������ �˼� �ֽ��ϴ�. �׷� �Լ��� ���ڰ� 4�� �̻��� ��쿡�� ��� �Ǵ� ���ϱ��? 5��° ���� ���ʹ� Stack�� �������� �Լ� ���� POP�ؼ� ����մϴ�. Stack�� ���� �޸𸮸� ����ϹǷ� �����ϸ� �Լ� ���ڴ� 4�� ������ ����ϴ� ���� ���� ��� ������ �˴ϴ�.


9.2 Function Parameter Passing

void main(void)
{
      int sum;

      // R0 �������Ϳ� a+b+c+d+e �� ���� ����Ǿ� return�� �˴ϴ�.
      sum = func1(0, 1, 2, 3, 99);
}

int a --> R0
int b --> R1
int c --> R2
int d --> R3
int e --> Stack
Return Value --> R0

int func1(int a, int b, int c, int d, int e)
{
      return a+b+c+d+e;
}

���� C �ڵ带 Disassembly �غ��� ������ �����ϴ�. ������ ������ ���� �Ͻñ� �ٶ��ϴ�.

Arm 에서 sbc 동작 방법