2.11. 어셈블리 언어 변경 사항

Table 2.11에서는 UAL과 이전의 개별 ARM 및 Thumb 어셈블러 언어 간의 기본 차이점을 보여 줍니다. 어셈블러에서는 UAL 이전 ARM 구문이 허용됩니다.

Table 2.11. 이전 ARM 어셈블리 언어의 변경 사항

변경된 내용UAL 이전 ARM 구문기본 구문
LDMSTM의 기본 주소 지정 모드는 IA입니다.
LDMIA, STMIA
LDM, STM
ARM 및 Thumb에서 전체 내림차순 스택 연산에 대해 PUSHPOP 니모닉을 사용할 수 있습니다.
STMFD sp!, {reglist}
LDMFD sp!, {reglist}
PUSH {reglist}
POP {reglist}
ARM 및 Thumb에서는 다른 연산을 제외하고 회전만 포함된 명령어에 대해 LSL, LSR, ASR, RORRRX 명령어 니모닉을 사용할 수 있습니다.
MOV Rd, Rn, LSL shift
MOV Rd, Rn, LSR shift
MOV Rd, Rn, ASR shift
MOV Rd, Rn, ROR shift
MOV Rd, Rn, RRX
LSL Rd, Rn, shift
LSR Rd, Rn, shift
ASR Rd, Rn, shift
ROR Rd, Rn, shift
RRX Rd, Rn
PC 상대 주소 지정에는 label 형식을 사용합니다. 새 코드에서 offset 형식을 사용하면 안 됩니다.
LDR Rd, [pc, #offset]
LDR Rd, label
더블워드 메모리 액세스에 대해 두 레지스터를 모두 지정합니다. 사용할 수 있는 레지스터 조합에 대한 규칙을 따라야 합니다.
LDRD Rd, addr_mode
LDRD Rd, Rd2, addr_mode
{cond}, 사용될 경우 항상 모든 명령어의 마지막 요소입니다.
ADD{cond}S
LDR{cond}SB
ADDS{cond}
LDRSB{cond}
ARM 및 Thumb-2 코드 모두에서 ARM {cond} 조건부 형식 및 Thumb-2 IT 명령어를 모두 사용할 수 있습니다. 어셈블러에서는 두 코드의 일관성을 확인하고 해당 코드를 현재 명령어 세트에 따라 어셈블합니다. IT 명령어를 생략하면 어셈블러에서 코드를 Thumb-2 코드에 자동으로 삽입합니다.
ADDEQ r1, r2, r3
LDRNE r1, [r2, r3]
ITEQ E ; optional
ADDEQ r1, r2, r3
LDRNE r1, [r2, r3]

또한 이전 어셈블러에서 허용되지 않은 일부 융통성이 허용됩니다 (Table 2.12 참조).

Table 2.12. 필요 조건 완화

완화기본 구문허용 구문
대상 레지스터가 첫 번째 연산과 동일할 경우 명령어의 2레지스터 형식을 사용할 수 있습니다.
ADD r1, r1, r3
ADD r1, r3

UAL을 사용하여 Thumb-2 이전 Thumb 프로세서에 대한 소스 코드를 작성할 수 있습니다.

Thumb-2 이전 프로세서에 대한 Thumb 코드를 작성할 경우 프로세서에서 사용할 수 있는 명령어로 제한해야 합니다. 사용할 수 없는 명령어를 사용하려고 하면 어셈블러에서는 오류 메시지를 생성합니다.

Thumb-2 프로세서에 대한 Thumb 코드를 작성할 경우 가능한 여러 위치에 16비트 명령어를 사용하여 코드 크기를 최소화할 수 있습니다.

Table 2.13에서는 UAL 이전 Thumb 어셈블리 언어와 UAL 간의 기본 차이점을 보여 줍니다. 어셈블러에서는 CODE16 지시어보다 먼저 사용되거나 소스 파일이 --16 명령 행 옵션으로 어셈블된 경우에만 UAL 이전 Thumb 구문을 허용합니다.

Table 2.13. UAL 이전 Thumb 구문과 UAL 구문 간의 차이점

변경된 내용UAL 이전 Thumb 구문UAL 구문
LDMSTM의 기본 주소 지정 모드는 IA입니다.LDMIA, STMIALDM, STM
플래그를 업데이트하는 명령어에는 S 접미사를 사용해야 합니다. 이 변경 사항은 32비트 Thumb-2 명령어와의 충돌을 방지하는 데 필수적입니다.
ADD r1, r2, r3
SUB r4, r5, #6
MOV r0, #1
LSR r1, r2, #1
ADDS r1, r2, r3
SUBS r4, r5, #6
MOVS r0, #1
LSRS r1, r2, #1
ALU 명령어의 기본 형식은 대상 레지스터가 첫 번째 피연산자와 동일한 경우에도 세 개의 레지스터를 지정합니다.
ADD r7, r8
SUB r1, #80
ADD r7, r7, r8
SUBS r1, r1, #80
RdRn이 모두 Lo 레지스터이면 MOV Rd, RnADDS Rd, Rn, #0으로 디스어셈블됩니다.
MOV r2, r3
MOV r8, r9
CPY r0, r1
LSL r2, r3, #0
ADDS r2, r3, #0
MOV r8, r9
MOV r0, r1
MOVS r2, r3
NEG Rd, RmRSBS Rd, Rm, #0으로 디스어셈블됩니다.NEG Rd, RmRSBS Rd, Rm, #0
NOP 명령어는 가능한 경우 MOV r8, r8을 바꿉니다.- NOPNOP MOV r8, r8

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential