ARM은 임베디드용으로는 가장 인기 있는 Instruction set architecture로 MIPS와 같은 해에 나왔으며 같은 설계 철학을 따르고 있다. 두 프로세서는 아래 표와 같이 매우 유사하다. 가장 큰 차이는 MIPS는 레지스터가 더 많고 ARM은 Addressing mode가 많다는 점이다.
Addressing Mode
위 표는 ARM이 지원하는 데이터 Addressing mode를 보여 주고 있다. MIPS와 달리 ARM에는 상수 0을 갖고 있는 레지스터가 있다. MIPS는 3개의 단순한 데이터 addressing mode를 갖고 있는 데 반해 ARM은 9개를 갖고 있다.
Compare and Conditional Branch
Conditional Branch 여부를 판단하기 위해 MIPS는 레지스터 값을 사용했다. 반면에 ARM은 프로그램 상태 워드에 저장되는 4개의 전통적인 조건 코드 negative, zero, carry, overflow 비트를 사용한다. 이 조건 비트들은 어느 산술 또는 논리 연산 명령 실행 시에도 설정될 수 있다.
CMP는 한 operand에게 다른 operand를 뺀 후 그 차이에 따라 조건 코드를 설정한다.
TST는 두 operand에 AND 연산을 수행하여 overflow를 제외한 모든 조건 코드를 설정하게 된다.
TEQ는 두 operand에 XOR 연산을 하여 overflow를 제외한 나머지 조건 코드를 설정하게 된다.
ARM의 특이한 점 중 하나는 모든 명령어가 조건부로 실행된다는 점이다. 실행 여부는 지정된 조건 코드 값에 따라 결정된다. 모든 명령어의 첫 4비트 필드는 실행 여부를 결정하기 위해서 검사할 조건 코드들을 지정한다. 이 명령어가 nop(no operation) 명령어로 작동할지 아니면 실제 명령어로 작동할지 결정한다. 따라서 conditional branch는 무조건 branch 명령어를 조건부 실행하는 것으로 생각해도 무리가 없다. 조건부 실행은 명령어 하나를 건너뛰기 위해 분기 명령어를 사용하는 일을 피할 수 있게 한다. 간단하게 명령어 하나만 조건부 실행하면 되므로 코드 길이와 시간이 짧아진다.