RealView Compilation Tools Assembler Guide

Similar documents
Microsoft Word - 1. ARM Assembly 실습_xp2.doc

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Microsoft Word - FunctionCall

Microsoft PowerPoint - chap01-C언어개요.pptx

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

PowerPoint 프레젠테이션

Microsoft PowerPoint - 05-ARM-Instruction-Set.ppt

Microsoft PowerPoint - chap03-변수와데이터형.pptx

JVM 메모리구조

OCW_C언어 기초

Microsoft PowerPoint - 3Àϰ_º¯¼ö¿Í »ó¼ö.ppt

ARM Reverse Engineering

Microsoft PowerPoint - [2009] 02.pptx

untitled

C++ Programming

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - hy2-12.pptx

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

ISP and CodeVisionAVR C Compiler.hwp

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

C++ Programming

Microsoft PowerPoint - chap04-연산자.pptx

ADP-2480

vRealize Automation용 VMware Remote Console - VMware

온라인 IT 교육최강 ( 강의정보처리필기강사조대호 차시명 [CA-06 강 ] 프로세서와명령어차시 6 차시 학습내용 프로세서와명령어 학습목표 컴퓨터의구조와프로세서에대해이해할수있다 컴퓨터의명령어에대해이해할수있다 학습내용 1. 컴퓨터의구성 - 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Visual Basic 반복문

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Computer Architecture

10 강. 쉘스크립트 l 쉘스크립트 Ÿ 쉘은명령어들을연속적으로실행하는인터프리터환경을제공 Ÿ 쉘스크립트는제어문과변수선언등이가능하며프로그래밍언어와유사 Ÿ 프로그래밍언어와스크립트언어 -프로그래밍언어를사용하는경우소스코드를컴파일하여실행가능한파일로만들어야함 -일반적으로실행파일은다

금오공대 컴퓨터공학전공 강의자료

Microsoft Word - Armjtag_문서1.doc

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

컴파일러

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - LN_1_ARM_CPU_0.ppt [호환 모드]

Chapter ...

Microsoft PowerPoint - e pptx

View Licenses and Services (customer)

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft Word - ExecutionStack

금오공대 컴퓨터공학전공 강의자료

학습목차 r 컴퓨터본체에서 CPU 의위치살펴보기 r CPU 의성능 r CPU 의기능 r CPU 의조직 r 레지스터의조직 r 명령어사이클 r 명령어파이프라이닝 컴퓨터구조 2 9. CPU 조직과기능

IRISCard Anywhere 5

User Guide

Microsoft PowerPoint - a6.ppt [호환 모드]

Microsoft PowerPoint - o8.pptx

C# Programming Guide - Types

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

Microsoft PowerPoint - chap06-2pointer.ppt

Operating Instructions

Install stm32cubemx and st-link utility

PowerPoint Presentation

PowerPoint 프레젠테이션

C 프로그램의 기본

Chapter 4. LISTS

설계란 무엇인가?

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - a10.ppt [호환 모드]

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Embedded System

PowerPoint Presentation

강의 개요

Microsoft PowerPoint - Chapter_04.pptx

BY-FDP-4-70.hwp

PowerPoint 프레젠테이션

Cisco FirePOWER 호환성 가이드

11장 포인터

PowerPoint 프레젠테이션

사용설명서를 읽기 전에 ios용 아이디스 모바일은 네트워크 연결을 통해 ios 플랫폼 기반의 모바일 기기(iOS 버전 6.0 이상의 ipod Touch, iphone 또는 ipad)에서 장치(DVR, 네트워크 비디오 서버 및 네트워크 카메라)에 접속하여 원격으로 영상을

Microsoft PowerPoint - hy2-12.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 15-MARS

Microsoft PowerPoint - hw8.ppt [호환 모드]

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Chapter #01 Subject

PowerPoint 프레젠테이션

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

Tcl의 문법

슬라이드 1

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

chap 5: Trees

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

API 매뉴얼

Microsoft PowerPoint - chap10-함수의활용.pptx

Eclipse Plug-in for RealView Development Suite 사용 설명서

학습목차 r 개념으로살펴보는 CPU 속의제어장치 r 마이크로연산 r 제어장치의동작 r 마이크로프로그램을이용한제어 컴퓨터구조 제어장치

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

Transcription:

RealView Compilation Tools 버전 3.1 어셈블러설명서 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

RealView Compilation Tools 어셈블러설명서 Copyright 2002-2007 ARM Limited. All rights reserved. 릴리스정보 이설명서에서변경된내용은다음과같습니다. 변경내역 날짜 발행판 기밀상태 변경내용 2002년 8월 A 기밀문서아님 릴리스 1.2 2003년 1월 B 기밀문서아님 릴리스 2.0 2003년 9월 C 기밀문서아님 RVDS 버전 2.0용릴리스 2.0.1 2004년 1월 D 기밀문서아님 RVDS 버전 2.1용릴리스 2.1 2004년 12월 E 기밀문서아님 RVDS 버전 2.2용릴리스 2.2 2005년 5월 F 기밀문서아님 RVDS 버전 2.2 SP1용릴리스 2.2 2006년 3월 G 기밀문서아님 RVDS 버전 3.0용릴리스 3.0 2007년 3월 H 기밀문서아님 RVDS 버전 3.1용릴리스 3.1 소유권고지사항 또는 표시가있는단어와로고는 ARM Limited 소유의등록상표또는상표입니다. 이설명서에언급된기타브랜드와이름은해당소유자의상표일수있습니다. 이설명서에포함된전체또는일부정보나설명된제품은해당저작권소유자의사전서면승인없이는어떤형태로도개조되거나복제될수없습니다. 이설명서에설명된제품은지속적으로개발및개선될수있습니다. 이설명서에포함된모든제품명세와해당사용법은 ARM 의신뢰하에제공됩니다. 그러나 ARM 에서는상품성또는특정목적에의적합성을비롯하여그밖의묵시적이거나명시적인모든보증을부인합니다. 이설명서는제품사용자를지원하는용도로만만들어졌습니다. ARM Limited 는이설명서정보의사용, 정보의오류나누락또는제품의잘못된사용에따른어떠한손실이나손상도책임지지않습니다. ARM 이라는단어가사용되는경우 "ARM 이나해당하는자회사 " 를의미합니다. 기밀상태 이설명서는기밀문서가아닙니다. 이설명서의사용, 복사및공개에대한권한은 ARM 과 ARM 으로부터이설명서를제공받은당사자가동의한계약조건에따라라이센스제한의적용을받을수있습니다. 제품상태 이설명서의정보는개발이완료된제품에대한최종정보입니다. 웹주소 http://www.arm.com ii Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

목차 RealView Compilation Tools 어셈블러설명서 서문 설명서개요... viii 사용자의견... xii 1 장소개 1.1 RealView Compilation Tools 어셈블러개요... 1-2 2장 ARM 어셈블리언어작성 2.1 소개... 2-2 2.2 ARM 아키텍처개요... 2-3 2.3 어셈블리언어모듈의구조... 2-13 2.4 조건부실행... 2-21 2.5 레지스터에상수로드... 2-30 2.6 레지스터에주소로드... 2-39 2.7 다중레지스터로드및저장명령어... 2-45 2.8 매크로사용... 2-51 2.9 심볼버전추가... 2-55 2.10 프레임지시문사용... 2-56 2.11 어셈블리언어변경사항... 2-57 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. iii

3장 어셈블러참조 3.1 명령구문... 3-2 3.2 소스행형식... 3-20 3.3 미리정의된레지스터및보조프로세서이름... 3-21 3.4 기본제공변수및상수... 3-23 3.5 심볼... 3-25 3.6 식, 리터럴및연산자... 3-31 3.7 진단메시지... 3-44 3.8 C 사전처리기사용... 3-46 4장 ARM 및 Thumb 명령어 4.1 명령어요약... 4-3 4.2 Thumb에서명령어너비선택... 4-10 4.3 메모리액세스명령어... 4-12 4.4 일반데이터처리명령어... 4-43 4.5 곱하기명령어... 4-75 4.6 포화명령어... 4-96 4.7 병렬명령어... 4-101 4.8 패킹및패킹해제명령어... 4-109 4.9 분기명령어... 4-117 4.10 보조프로세서명령어... 4-124 4.11 기타제한... 4-132 4.12 ThumbEE 명령어... 4-148 4.13 의사명령어... 4-152 5장 NEON 및 VFP 프로그래밍 5.1 확장레지스터뱅크... 5-7 5.2 조건코드... 5-9 5.3 일반정보... 5-11 5.4 NEON 및 VFP 공유명령어... 5-18 5.5 NEON 논리및비교연산... 5-25 5.6 NEON 일반데이터처리명령어... 5-33 5.7 NEON 시프트명령어... 5-44 5.8 NEON 일반산술명령어... 5-50 5.9 NEON 곱하기명령어... 5-63 5.10 NEON 요소및구조체로드 / 저장명령어... 5-68 5.11 NEON 및 VFP 의사명령어... 5-76 5.12 NEON 및 VFP 시스템레지스터... 5-82 5.13 0으로플러시모드... 5-87 5.14 VFP 명령어... 5-89 5.15 VFP 벡터모드... 5-98 iv Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

6장 Wireless MMX 기술명령어 6.1 소개... 6-2 6.2 Wireless MMX 기술에대한 ARM 지원... 6-3 6.3 Wireless MMX 명령어... 6-8 7장 지시문참조 7.1 지시문의사전순목록... 7-2 7.2 심볼정의지시문... 7-4 7.3 데이터정의지시문... 7-17 7.4 어셈블리제어지시문... 7-32 7.5 프레임지시문... 7-41 7.6 보고지시문... 7-57 7.7 명령어세트및구문선택지시문... 7-63 7.8 기타지시문... 7-65 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. v

vi Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

서문 이서문에서는 RealView Compilation Tools 어셈블러설명서에대해소개합니다. 여기에는다음단원이포함되어있습니다. viii페이지의설명서개요 xii 페이지의사용자의견 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. vii

서문 설명서개요 이설명서에서는 RVCT(RealView Compilation Tools) 어셈블러에대한자습및참조정보를제공합니다. RVCT 어셈블러에는독립형어셈블러인 armasm 과 C 및 C++ 컴파일러의인라인어셈블러가있습니다. 이설명서에서는어셈블리언어프로그래머가사용할수있는어셈블러, 어셈블리언어니모닉, 의사명령어, 매크로및지시문에대한명령행옵션에대해설명합니다. 대상독자 이설명서는 RVCT 를사용하여응용프로그램을만들려는모든개발자를위한것입니다. 여기에서는사용자가경험있는소프트웨어개발자이고 RealView Compilation Tools 핵심설명서에설명된 ARM 개발도구에익숙하다고가정합니다. 설명서사용 이설명서는다음장으로구성되어있습니다. 1 장소개 이장에서는 RVCT 어셈블러및어셈블리언어에대해소개합니다. 2장 ARM 어셈블리언어작성이장에서는 ARM 어셈블러및어셈블리언어를사용하는데도움을주는자습정보를제공합니다. 3장어셈블러참조이장에서는 ARM 어셈블러에서제공하는언어의구문및구조에대한참조자료를제공합니다. 4장 ARM 및 Thumb 명령어이장에서는 ARM 및 Thumb(Thumb-2 및이전버전의 Thumb인 Thumb-2EE 포함 ) 명령어세트에대한참조자료를제공합니다. 5 장 NEON 및 VFP 프로그래밍 이장에서는 ARM NEON 기술및 VFP 명령어세트에대한참조자료를제공하고타사 VFP 관련어셈블리언어에대해서도설명합니다. viii Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

서문 6장 Wireless MMX 기술명령어이장에서는 Wireless MMX 기술의 ARM 지원에대한참조자료를제공합니다. 7장지시문참조이장에서는 ARM 어셈블러인 armasm에서사용할수있는어셈블러지시문에대한참조자료를제공합니다. 이설명서에서는 ARM 소프트웨어가기본위치 (Windows 의경우 volume:\program Files\ARM) 에설치되어있다고가정합니다. 예를들어 install_directory\documentation\... 과같은경로이름을참조할때 install_directory 는이위치를가리키는것으로가정합니다. ARM 소프트웨어를다른위치에설치한경우에는이위치를변경해야합니다. 표기규칙 이설명서에서는다음과같은표기규칙을사용합니다. 고정폭글꼴 고정폭글꼴 명령, 파일및프로그램이름, 소스코드와같이키보드로입력할수있는텍스트를나타냅니다. 명령또는옵션대신사용할수있는약어를나타냅니다. 밑줄이그어진텍스트는전체명령이나옵션이름대신입력할수있습니다. 고정폭기울임글꼴명령및함수의인수를나타냅니다. 인수는특정값으로대체할수있습니다. 고정폭굵은글꼴외부예제코드가사용될경우언어키워드를나타냅니다. 기울임글꼴중요한사항을강조표시하고, 특수용어를소개하며, 내부상호참조및인용부분을나타냅니다. 굵은글꼴 메뉴이름과같은인터페이스요소를강조표시합니다. 적절한경우설명목록의내용을강조할때와 ARM 프로세서신호이름을표시할때도사용됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. ix

서문 추가정보 이단원에는 ARM 계열프로세서용코드를개발하는데대한추가정보를제공하는 ARM Limited 및타사게시물목록이나와있습니다. ARM 에서는이설명서의내용을정기적으로업데이트하고수정합니다. http://www.arm.com 에서정오표, 추가목록및 ARM FAQ 를참조하십시오. ARM 게시물 이설명서에는 RVCT와함께제공되는각개발도구에대한참조정보가포함되어있습니다. 이제품군에포함된다른게시물은다음과같습니다. RVCT 핵심설명서 (ARM DUI 0202) RVCT 컴파일러사용설명서 (ARM DUI 0205) RVCT Compiler Reference Guide(ARM DUI 0348) RVCT Libraries and Floating Point Support Guide(ARM DUI 0349) RVCT 링커및유틸리티설명서 (ARM DUI 0206) RVCT 개발자설명서 (ARM DUI 0203) NEON Vectorizing Compiler Guide(ARMDUI 0350) RealView Development Suite 용어집 (ARM DUI 0324) ARM 에서지원하는기본표준, 소프트웨어인터페이스및기타표준에대한자세한내용은 install_directory\documentation\specifications\... 에서볼수있습니다. 또한 ARM 제품과관련된구체적인내용은다음설명서를참조하십시오. ARM6-M Architecture Reference Manual(ARM DDI 0419) ARM7-M Architecture Reference Manual(ARM DDI 0403) ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition(arm DDI 0406) ARM Architecture Reference Manual Thumb - 2 Supplement(ARM DDI 0308) ARM Architecture Reference Manual Security Extensions Supplement(ARM DDI 0309) ARM Architecture Reference Manual Thumb-2 Execution Environment Supplement(ARM DDI 0397) ARM Architecture Reference Manual Advanced SIMD Extensions and VFPv3 Supplement(ARM DDI 0268) x Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

서문 ARM Reference Peripheral Specification(ARM DDI 0062) 하드웨어장치에대한 ARM 데이터시트또는기술참조문서 기타게시물 ARM 아키텍처에대한소개는 ARM system-on-chip 구조 (Steve Furber 저, 나종화등역, 홍릉과학출판사, 2005 년, ISBN 8972833592) 를참조하십시오. Intel Wireless MMX 기술에대한자세한내용은 http://www.intel.com 에서 Wireless MMX Technology Developer Guide(2000 년 8 월, Order Number: 251793-001) 를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. xi

서문 사용자의견 RealView Compilation Tools 및설명서에대한의견이있으시면 ARM Limited 에언제든알려주시기바랍니다. RealView Compilation Tools 에대한의견 RVCT 와관련된문제가있으시면해당공급업체에문의하십시오. 문의시다음사항을함께알려주시면보다신속하고유용한답변을받으실수있습니다. 사용자이름및회사 제품일련번호 사용중인릴리스정보 실행중인플랫폼의세부사항 ( 예 : 하드웨어플랫폼, 운영체제종류및버전 ) 문제를재현하는작은독립실행형코드샘플 의도한결과와실제로발생한결과에대한명확한설명 사용한명령 ( 명령행옵션포함 ) 문제를보여주는샘플출력 도구의버전문자열 ( 버전번호및빌드번호포함 ) 설명서에대한사용자의견 이설명서에오류나누락이있으면다음사항을기재하여 errata@arm.com으로전자메일을보내주시기바랍니다. 설명서제목 설명서번호 문의내용에해당하는페이지번호 문제에대한간략한설명 추가및향상되었으면하는기능에대한일반적인제안도환영합니다. xii Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

1 장소개 이장에서는 RVCT(RealView Compilation Tools) 와함께제공되는어셈블러에대해소개합니다. 이장에는다음단원이포함되어있습니다. 1-2페이지의 RealView Compilation Tools 어셈블러개요 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 1-1

소개 1.1 RealView Compilation Tools 어셈블러개요 RVCT 에는다음구성요소가포함되어있습니다. 독립형어셈블러인 armasm( 이설명서에서설명함 ) C 및 C++ 컴파일러에기본적으로제공된, 최적화기능이있는인라인어셈블러와최적화기능이없는임베디드어셈블러. 이러한어셈블러는동일한구문을사용하여어셈블리명령어를처리합니다. 이설명서에서는이두어셈블러에대해설명하지않습니다. 인라인및임베디드어셈블러에대한자세한내용은 RealView Compilation Tools 개발자설명서에서 C, C++ 및어셈블리언어조합장을참조하십시오. 이전릴리스의 RVCT 에서업그레이드하는경우에는 RealView Compilation Tools 핵심설명서에서이릴리스의새기능과향상된기능에대한세부정보를읽어보십시오. 1.1.1 ARM 어셈블리언어 이전버전의 ARM 및 Thumb 어셈블러언어가최신 ARM/Thumb 어셈블러언어로대체되었습니다. 최신언어로작성된코드는 ARM, Thumb 또는 Thumb-2 명령어용으로어셈블할수있습니다. 어셈블러에서지원되지않는명령어를사용하면오류가발생합니다. 1.1.2 Wireless MMX 기술명령어 어셈블러는 PXA270 프로세서에서실행할코드를어셈블할수있도록 Intel Wireless MMX 기술명령어를지원합니다. 이프로세서는 MMX 확장을사용하여 ARMv5TE 아키텍처를구현합니다. RVCT 에는 Wireless MMX 기술제어및 SIMD(Single Instruction Multiple Data) 데이터레지스터에대한지원뿐아니라 Wireless MMX 기술개발을위한새로운지시문이포함되어있습니다. 여기에는로드및저장명령어에대한향상된지원도포함되어있습니다. RVCT 의 Wireless MMX 기술지원에대한자세한내용은 6 장 Wireless MMX 기술명령어를참조하십시오. 1-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

소개 1.1.3 NEON 기술 ARM NEON 기술은 ARMv7 아키텍처의선택적구성요소로서, 고급미디어및신호처리응용프로그램과임베디드프로세서를대상으로하는 64/128 비트복합 SIMD 기술입니다. 이기술은 ARM 코어의일부로구현되지만자체실행파이프라인이있으며 ARM 코어레지스터뱅크와는별도의레지스터뱅크가있습니다. NEON 은정수, 고정소수점및단정밀도부동소수점 SIMD 연산을지원합니다. 이러한명령어는 ARM 과 Thumb-2 모두에서사용할수있습니다. NEON 에대한자세한내용은 5 장 NEON 및 VFP 프로그래밍을참조하십시오. 1.1.4 예제사용 이설명서에서는 RealView Development Suite 와함께제공되는예제를참조합니다. 이러한예제는주예제디렉토리인 install_directory\rvds\examples 에있습니다. 제공된예제에대한요약정보는 RealView Development Suite 시작설명서를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 1-3

소개 1-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

2 장 ARM 어셈블리언어작성 이장에서는 ARM 어셈블리언어를작성하는일반원칙에대해소개합니다. 여기에는다음단원이포함되어있습니다. 2-2페이지의소개 2-3 페이지의 ARM 아키텍처개요 2-13 페이지의어셈블리언어모듈의구조 2-21 페이지의조건부실행 2-30 페이지의레지스터에상수로드 2-39 페이지의레지스터에주소로드 2-45 페이지의다중레지스터로드및저장명령어 2-51 페이지의매크로사용 2-55 페이지의심볼버전추가 2-56 페이지의프레임지시문사용 2-57 페이지의어셈블리언어변경사항 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-1

ARM 어셈블리언어작성 2.1 소개 이장에서는 ARM 어셈블리언어모듈을작성하는방법에대한기본적이고실제적인이해를제공하며 ARM 어셈블러 (armasm) 에서제공하는기능에대해서도설명합니다. 이장에서는 ARM, Thumb - 2, Thumb, NEON, VFP 또는 MMX 명령어세트에대해자세히설명하지않습니다. 이러한명령어세트에대한자세한내용은다음을참조하십시오. 4장 ARM 및 Thumb 명령어 5 장 NEON 및 VFP 프로그래밍 6 장 Wireless MMX 기술명령어 자세한내용은 ARM 아키텍처참조문서를참조하십시오. RVCT2.1 및이전버전에서허용되는 ARM 및 Thumb 어셈블리언어에익숙한프로그래머가간편하게사용할수있도록이장에는이러한언어와최신버전의 RVCT2.1 어셈블리언어간차이점을설명하는단원이포함되어있습니다. 자세한내용은 2-57 페이지의어셈블리언어변경사항을참조하십시오. 2.1.1 코드예제 이장에서는여러가지코드예제를제공합니다. 이러한코드예제대부분은 install_directory\rvds\examples\...\asm 디렉토리에있습니다. 다음단계에따라어셈블리언어파일을빌드하고링크합니다. 1. 명령프롬프트에 armasm --debug filename.s 를입력하여파일을어셈블하고디버그테이블을생성합니다. 2. armlink filename.o -o filename 을입력하여개체파일을링크하고 ELF 실행이미지를생성합니다. 이미지를실행하고디버깅하려면 RVISS(RealView Instruction Set Simulator) 와같은적절한디버그타겟을사용하여 RealView Debugger 와같은호환디버거로이미지를로드합니다. 어셈블러에서소스코드를변환하는방법을보려면다음을입력하십시오. fromelf -c filename.o armlink 및 fromelf 에대한자세한내용은 RealView Compilation Tools 링커및유틸리티설명서를참조하십시오. 2-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.2 ARM 아키텍처개요 이단원에서는 ARM 아키텍처개요에대해간략히설명합니다. ARM 프로세서는로드 / 저장아키텍처를구현하므로일반적인 RISC 프로세서입니다. 로드및저장명령어만메모리에액세스할수있고데이터처리명령어는레지스터내용에대해서만작동합니다. 이단원에서는다음내용을설명합니다. 아키텍처버전 ARM, Thumb, Thumb-2 및 Thumb-2EE 명령어세트 2-4 페이지의 ARM, Thumb 및 ThumbEE 상태 2-5 페이지의프로세서모드 2-6 페이지의레지스터 2-9 페이지의명령어세트개요 2-10 페이지의명령어기능 2.2.1 아키텍처버전 이설명서의정보와예제에서는 ARMv4 이상을구현하는프로세서를사용하고있다고가정합니다. 이러한모든프로세서에는 32 비트주소지정범위가있습니다. 다양한아키텍처버전에대한자세한내용은 ARM 아키텍처참조문서를참조하십시오. 2.2.2 ARM, Thumb, Thumb-2 및 Thumb-2EE 명령어세트 ARM 명령어세트는포괄적인범위의연산을제공하는 32 비트명령어세트입니다. ARMv4T 이상에서는 Thumb 명령어세트라는 16 비트명령어세트를정의합니다. 32 비트 ARM 명령어세트의기능대부분을사용할수있지만일부연산에는추가명령어가필요합니다. Thumb 명령어세트에서는성능이저하되는대신향상된코드밀도를제공합니다. ARMv6T2 는 Thumb 명령어세트가크게향상된 Thumb-2 를정의합니다. Thumb-2 는 ARM 명령어세트와거의동일한기능을제공합니다. 또한 16 비트명령어와 32 비트명령어를모두포함하며성능은 ARM 코드와비슷하지만코드밀도는 Thumb 코드와비슷합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-3

ARM 어셈블리언어작성 ARMv6 이상에서는모든 ARM 및 Thumb 명령어가리틀엔디안이고 ARMv6T2 이상에서는모든 Thumb-2 명령어페치가리틀엔디안입니다. ARMv7 에서는 Thumb-2EE(Thumb-2 Execution Environment) 를정의합니다. Thumb-2EE 명령어세트는 Thumb-2 를기반으로하지만, 동적으로생성되는코드, 즉실행직전이나실행중에장치에서컴파일되는코드에보다적합한타겟이되도록몇가지사항을변경하고추가한것입니다. 자세한내용은 2-9 페이지의명령어세트개요를참조하십시오. 2.2.3 ARM, Thumb 및 ThumbEE 상태 ARM 명령어를실행하는프로세서는 ARM 상태에서작동하고 Thumb 명령어를실행하는프로세서는 Thumb 상태에서작동합니다. 특정상태의프로세서는다른명령어세트의명령어를실행할수없습니다. 예를들어 ARM 상태의프로세서는 Thumb 명령어를실행할수없고 Thumb 상태의프로세서는 ARM 명령어를실행할수없습니다. 따라서프로세서에서현재상태와맞지않는명령어세트의명령어를수신하지않도록해야합니다. 대부분의 ARM 프로세서는항상 ARM 상태에서코드실행을시작합니다. 그러나일부프로세서의경우 Thumb 코드만실행할수있거나 Thumb 상태에서시작하도록구성할수있습니다. ThumbEE 에는 ThumbEE 상태라는새로운명령어세트상태가도입되었습니다. 이상태에서는명령어가 ThumbEE 명령어세트에정의된대로실행됩니다. 상태변경 각명령어세트에는프로세서상태를변경하는명령어가포함되어있습니다. ARM 상태와 Thumb 상태간에전환하려면 ARM 또는 THUMB 지시문을통해올바른 opcode 를생성하도록어셈블러모드를전환해야합니다. Thumb-2EE 코드를생성하려면 THUMBX 를사용합니다. CODE32 및 CODE16 을사용하는어셈블러코드는어셈블러에서계속어셈블할수있지만새코드에대해서는 ARM 및 THUMB 을사용하는것이좋습니다. 자세한내용은 7-63 페이지의명령어세트및구문선택지시문을참조하십시오. 2-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.2.4 프로세서모드 ARM 프로세서에서는아키텍처버전에따라다양한프로세서모드를지원합니다 ( 표 2-1 참조 ). 참고 ARMv7-M 은다른 ARM 프로세서와동일한모드를지원하지않습니다. 이단원은 ARMv7-M 에는적용되지않습니다. 표 2-1 ARM 프로세서모드 프로세서모드 아키텍처 모드번호 사용자 모두 0b10000 FIQ - 고속인터럽트요청 모두 0b10001 IRQ - 인터럽트요청 모두 0b10010 관리자 모두 0b10011 abort 모두 0b10111 정의되지않음 모두 0b11011 시스템 ARMv4 이상 0b11111 모니터 보안확장에만해당 0b10110 사용자모드를제외한모든모드를권한모드라고합니다. 이러한모드에서는시스템리소스에대한모든액세스권한이제공되고모드를자유롭게변경할수있습니다. 작업보호가필요한응용프로그램은일반적으로사용자모드에서실행됩니다. 일부임베디드응용프로그램은전적으로관리자또는시스템모드에서실행될수있습니다. 사용자모드이외의모드에서는예외를처리하거나권한있는리소스에액세스합니다 (RealView Compilation Tools 개발자설명서의 6 장프로세서예외처리장참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-5

ARM 어셈블리언어작성 2.2.5 레지스터 ARM 프로세서에는 37 개의레지스터가있습니다. 이러한레지스터는뱅크의일부가서로겹치는방식으로정렬됩니다. 레지스터뱅크는프로세서모드에따라서로다릅니다. 뱅크레지스터는신속한컨텍스트전환을통해프로세서예외와권한있는연산을처리할수있도록합니다. 레지스터가뱅크되는방법에대한자세한내용은 ARM 아키텍처참조문서를참조하십시오. 다음레지스터를사용할수있습니다. 30개의범용 32비트레지스터 PC( 프로그램카운터 ) 2-7페이지의 APSR( 응용프로그램상태레지스터 ) 2-8페이지의 SPSR( 저장된프로그램상태레지스터 ) 30 개의범용 32 비트레지스터 15 개의범용레지스터는현재프로세서모드에따라한번씩 r0, r1,... r13, r14 로표시됩니다. r13 은스택포인터 (sp) 입니다. C 및 C++ 컴파일러에서는항상 r13 을스택포인터로사용합니다. Thumb-2 에서는 sp 가스택포인터로엄격하게정의되기때문에 r13 이사용될경우스택조작에도움이되지않는여러명령어는예상할수없는결과를낼수있습니다. sp 는범용레지스터로사용하지않는것이좋습니다. 사용자모드에서 r14 는링크레지스터 (lr) 로사용되어하위루틴호출이수행될때반환주소를저장합니다. 또한반환주소가스택에저장될경우범용레지스터로사용될수도있습니다. 예외처리모드에서 r14 는예외반환주소나하위루틴반환주소 ( 하위루틴호출이예외내에서실행될경우 ) 를저장합니다. 또한반환주소가스택에저장될경우범용레지스터로사용될수도있습니다. PC( 프로그램카운터 ) 프로그램카운터는 r15 또는 pc 로액세스되며, ARM 상태에있는각명령어에대해 1 워드 (4 바이트 ) 씩증가하거나 Thumb 상태에서실행되는명령어의크기만큼증가합니다. 분기명령어는대상주소를 pc 로로드합니다. 또한데이터연산명령어를사용하면 PC 를직접로드할수도있습니다. 예를들어하위루틴에서복귀하려면다음을사용하여링크레지스터를 PC 로복사할수있습니다. MOV pc,lr 2-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 실행하는동안 r15(pc) 는현재실행되는명령어의주소를포함하지않습니다. 현재실행되는명령어의주소는일반적으로 ARM 의경우 pc-8 이거나 Thumb 의경우 pc-4 입니다. APSR( 응용프로그램상태레지스터 ) APSR 은 ALU( 산술논리단위 ) 상태플래그의복사본을포함하며, 조건부명령어의실행여부를결정하는데사용됩니다. 자세한내용은 2-21 페이지의조건부실행을참조하십시오. ARMv5TE 및 ARMv6 이상에서는 APSR 에 Q 플래그도포함됩니다 (2-22 페이지의 ALU 상태플래그참조 ). ARMv6 에서는 APSR 에 GE 플래그도포함됩니다 (4-102 페이지의병렬더하기및빼기참조 ). 이러한플래그에는 MSR 및 MRS 명령어를사용하여모든모드에서액세스할수있습니다. 자세한내용은 4-135 페이지의 MRS 및 4-137 페이지의 MSR 을참조하십시오. CPSR( 현재프로그램상태레지스터 ) CPSR에는다음이포함됩니다. APSR 플래그 현재프로세서모드 인터럽트비활성화플래그 Thumb 사용가능또는 Jazelle 사용가능프로세서에서는 CPSR 에현재프로세서상태 (ARM, Thumb, ThumbEE 또는 Jazelle) 도포함됩니다. ARMv6T2 이상에서는 Thumb-2 의 CPSR 에새로운상태비트가도입되었습니다. 이러한비트는 IT 명령어에서 IT 블록의조건부실행을제어하는데사용됩니다 (4-71 페이지의 IT 참조 ). APSR 플래그만모든모드에서액세스할수있고 CPSR 의나머지비트에는 MSR 및 MRS 명령어를사용하여권한모드에서만액세스할수있습니다. 자세한내용은 4-135 페이지의 MRS 및 4-137 페이지의 MSR 을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-7

ARM 어셈블리언어작성 SPSR( 저장된프로그램상태레지스터 ) SPSR 은예외가발생할때 CPSR 을저장하는데사용됩니다. 각예외처리모드에서는하나의 SPSR 에액세스할수있습니다. 사용자모드와시스템모드는예외처리모드가아니므로 SPSR 을가지고있지않습니다. 자세한내용은 RealView Compilation Tools 개발자설명서에서 6 장프로세서예외처리를참조하십시오. 2-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.2.6 명령어세트개요 모든 ARM 명령어의길이는 32 비트입니다. 명령어는워드로정렬된채저장되므로 ARM 상태에서명령어주소의최하위 2 비트는항상 0 입니다. Thumb, Thumb-2 및 Thumb-2EE 명령어의길이는 16 비트또는 32 비트입니다. 명령어는하프워드로정렬된채저장됩니다. 일부명령어는최하위비트를사용하여분기되는코드가 Thumb 코드인지아니면 ARM 코드인지여부를확인합니다. Thumb-2 가도입되기전에 Thumb 명령어세트는 ARM 명령어세트의제한된하위기능세트로제한되었으며거의모든 Thumb 명령어가 16 비트였습니다. Thumb-2 명령어세트기능은 ARM 명령어세트기능과거의같습니다. ARM 및 Thumb 명령어구문에대한자세한내용은 4 장 ARM 및 Thumb 명령어를참조하십시오. ARM 및 Thumb 명령어는다음과같은여러기능그룹으로분류할수있습니다. 분기명령어 데이터처리명령어 2-10페이지의레지스터로드및저장명령어 2-10 페이지의다중레지스터로드및저장명령어 2-10 페이지의상태레지스터액세스명령어 2-10 페이지의보조프로세서명령어 분기명령어이러한명령어를사용하면다음을수행할수있습니다. 루프형성을위한역방향분기 조건부구조체에서정방향분기 하위루틴으로분기 ARM과 Thumb 사이에서프로세서상태전환 데이터처리명령어 이러한명령어는범용레지스터에서작동하며, 두레지스터의내용에대해더하기, 빼기또는비트단위논리와같은연산을수행하고결과를세번째레지스터에배치합니다. 이러한명령어는단일레지스터내의값을연산하거나레지스터값과명령어내에제공된상수 ( 즉치값 ) 를연산할수도있습니다. Long 곱하기명령어는두개의레지스터에 64 비트결과를제공합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-9

ARM 어셈블리언어작성 레지스터로드및저장명령어 이러한명령어는단일레지스터값을메모리에서로드하거나메모리에저장하며, 32 비트워드, 16 비트하프워드또는 8 비트부호없는바이트를로드하거나저장할수있습니다. 바이트및하프워드로드는 32 비트레지스터를채우도록부호확장또는 0 확장됩니다. 이외에도 64 비트더블워드값을두개의 32 비트레지스터에로드하거나저장할수있는몇가지명령어가정의되어있습니다. 다중레지스터로드및저장명령어 이러한명령어는범용레지스터의하위세트를메모리에서로드하거나메모리에저장합니다. 이러한명령어에대한자세한내용은 2-45 페이지의다중레지스터로드및저장명령어를참조하십시오. 상태레지스터액세스명령어 이러한명령어는상태레지스터와범용레지스터간에내용을이동합니다. 보조프로세서명령어 이러한명령어는 ARM 아키텍처를확장하는일반적인방법을지원합니다. 2.2.7 명령어기능 이단원에는다음소단원이포함되어있습니다. 조건부실행 2-11페이지의레지스터액세스 2-11페이지의인라인배럴시프터에액세스 조건부실행 거의모든 ARM 명령어는 APSR 의 ALU 상태플래그값에대해조건부로실행될수있습니다. 일련의명령어에동일한조건을적용할경우성능이향상될수있지만반드시분기를사용하여조건부명령어를건너뛰어야하는것은아닙니다. Thumb-2 가없는프로세서의 Thumb 상태에서조건부실행을위한유일한메커니즘은조건부분기뿐입니다. 대부분의데이터처리명령어는 ALU 플래그를업데이트합니다. 일반적으로명령어가 ALU 플래그상태를업데이트할지여부는지정할수없습니다. 2-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 Thumb-2 는 IT(If-Then) 명령어와동일한 ALU 플래그를사용하여조건부실행을위한대체메커니즘을제공합니다. IT 는최대네개까지다음과같은명령어의조건부실행을제공하는 16 비트명령어입니다. 이외에도조건부실행을위한추가메커니즘을제공하는여러명령어가있습니다. ARM 및 Thumb-2 코드에서는데이터처리명령어가 ALU 플래그를업데이트할지여부를지정할수있습니다. 한명령어로설정된플래그를사용하여중간에여러플래그비설정명령어가있는경우에도다른명령어의실행을제어할수있습니다. 자세한내용은 2-21 페이지의조건부실행을참조하십시오. 레지스터액세스 ARM 상태에서는모든명령어가 r0 ~ r14 에액세스할수있으며, 이중대부분의명령어가 r15(pc) 에액세스할수있습니다. MRS 및 MSR 명령어는상태레지스터의내용을범용레지스터로이동할수있고이레지스터에서일반데이터처리연산을사용하여내용을조작할수있습니다. 자세한내용은 4-135 페이지의 MRS 및 4-137 페이지의 MSR 을참조하십시오. Thumb-2 프로세서의 Thumb 상태에서는유용하지않을경우 r13 및 r15 에대한일부액세스가허용되지않는다는점을제외하고동일한기능을제공합니다. Thumb-2 가없는프로세서의 Thumb 상태에서는대부분의명령어가 r0 ~ o r7 에만액세스할수있고적은수의명령어만 r8 ~ r15 에액세스할수있습니다. 레지스터 r0 ~ r7 은 Lo 레지스터라고하고레지스터 r8 ~ r15 는 Hi 레지스터라고합니다. 인라인배럴시프터에액세스 ARM 산술논리단위에는시프트및회전연산을수행할수있는 32비트배럴시프터가있습니다. 모든 ARM 및 Thumb-2 데이터처리와단일레지스터데이터전송명령어에대한두번째연산은데이터처리나데이터전송이실행되기전에명령어의일부로시프트할수있습니다. 이기능은다음을지원하며이에제한되지않습니다. 스케일된주소지정 상수로곱하기 상수생성 배럴시프터를사용하여상수를생성하는방법에대한자세한내용은 2-30 페이지의레지스터에상수로드를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-11

ARM 어셈블리언어작성 Thumb-2 명령어는 ARM 명령어와거의동일한배럴시프터에대한액세스를제공합니다. 16 비트 Thumb 명령어세트는별도의명령어를통해서만배럴시프터에액세스할수있습니다. 2-12 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.3 어셈블리언어모듈의구조 어셈블리언어는 ARM 어셈블러 (armasm) 에서구문분석하고어셈블하여개체코드를생성하는언어입니다. 기본적으로어셈블러에서는소스코드를 ARM 어셈블리언어로작성하도록요구합니다. armasm 에서는이전버전의 ARM 어셈블리언어로작성된소스코드를실행할수있습니다. 이경우이를알리지않아도됩니다. 또한 armasm 에서는이전 Thumb 어셈블리언어로작성된소스코드를실행할수도있습니다. 이경우 --16 명령행옵션이나소스코드의 CODE16 지시문사용하여 armasm 에이를알려야합니다. 이전 Thumb 어셈블리언어는 Thumb-2 명령어를지원하지않습니다. 이단원에서는다음내용을설명합니다. 어셈블리언어소스파일레이아웃 2-17페이지의 ARM 어셈블리언어모듈예제 2-19 페이지의하위루틴호출 2.3.1 어셈블리언어소스파일레이아웃 어셈블리언어의일반적인소스행형식은다음과같습니다. {label} {instruction directive pseudo-instruction} {;comment} 참고 레이블이없는경우에도명령어, 의사명령어및지시문앞에는공백이나탭이한칸있어야합니다. 소스행의세부분은모두선택적입니다. 빈행을사용하여코드를읽기쉽게만들수있습니다. 대소문자규칙 명령어니모닉, 지시문및심볼레지스터이름은대문자나소문자중하나로만작성할수있고대소문자를모두사용하여작성할수는없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-13

ARM 어셈블리언어작성 행길이 소스파일을읽기쉽게만들려면행끝에백슬래시문자 (\) 를배치하여긴소스행을여러행으로분할할수있습니다. 백슬래시뒤에는공백과탭을포함하여다른문자가오면안됩니다. 어셈블러에서는백슬래시 / 행끝시퀀스를공백으로처리합니다. 참고 백슬래시 / 행끝시퀀스를따옴표로묶인문자열내에사용하면안됩니다. 백슬래시를사용하는확장을포함하여행길이제한은 4095 자입니다. 레이블 레이블은주소를나타내는심볼입니다. 레이블로지정된주소는어셈블리동안계산됩니다. 어셈블러에서는레이블이정의된섹션의원점을기준으로레이블주소를계산합니다. 같은섹션내에있는레이블에대한참조는오프셋을더하거나뺀 PC 를사용할수있습니다. 이작업을프로그램기준주소지정이라고합니다. 다른섹션의레이블주소는링커가각섹션에대해특정메모리위치를할당한경우링크타임에계산됩니다. 지역레이블 지역레이블은레이블의하위클래스로, 0 ~ 99 범위에있는숫자로시작합니다. 다른레이블과달리지역레이블은여러번정의할수있습니다. 지역레이블은매크로를통해레이블을생성하는경우유용합니다. 어셈블러에서는지역레이블에대한참조를찾으면이참조를지역레이블의주변인스턴스에링크합니다. 지역레이블범위는 AREA 지시문으로제한되지않습니다. ROUT 지시문을사용하면범위를보다엄격하게제한할수있습니다. 다음에대한자세한내용은 3-29페이지의지역레이블을참조하십시오. 지역레이블선언구문 어셈블러에서지역레이블에대한참조를해당레이블에연결하는방법 2-14 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 주석 행의첫번째세미콜론은문자열상수내부에세미콜론이나타나는위치를제외하고주석의시작을표시합니다. 행끝은주석의끝입니다. 주석만으로하나의유효한행을구성할수있습니다. 어셈블러에서는모든주석을무시합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-15

ARM 어셈블리언어작성 상수 상수는다음중하나일수있습니다. 숫자다음형식의숫자상수가허용됩니다. 10진수 ( 예 : 123) 16진수 ( 예 : 0x7B) n_xxx. 다음은이요소에대한설명입니다. n 2 와 9 사이의기수입니다. xxx 해당기수에있는숫자입니다. 부동소수점 ( 예 : 0.02, 123.0 또는 3.14159) 부동소수점숫자는시스템에부동소수점을사용하는 VFP 또는 NEON이있는경우에만사용할수있습니다. 부울부울상수 TRUE 및 FALSE 는 {TRUE} 및 {FALSE} 로작성되어야합니다. 문자 문자열 문자상수는표준 C 이스케이프문자를사용하는이스케이프문자나단일문자를묶는열고닫는작은따옴표로구성됩니다. 문자열은문자와공백을묶는열고닫는큰따옴표로구성됩니다. 큰따옴표또는달러기호가문자열내에서리터럴텍스트문자로사용될경우에는해당문자를쌍으로표시되어야합니다. 예를들어문자열에하나의 $ 가필요하면 $$ 를사용해야합니다. 표준 C 이스케이프시퀀스는문자열상수내에서사용할수있습니다. 2-16 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.3.2 ARM 어셈블리언어모듈예제 예제 2-1 에서는어셈블리언어모듈의일부핵심구성요소를보여줍니다. 이예제는 ARM 어셈블리언어로작성되었으며, 주예제디렉토리인 install_directory\rvds\examples 에 armex.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 이예제의구성부분에대해서는다음단원에서자세히설명합니다. 예제 2-1 start stop AREA ENTRY ARMex, CODE, READONLY ; Name this block of code ARMex ; Mark first instruction to execute MOV r0, #10 ; Set up parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) END ; Mark end of file ELF 섹션및 AREA 지시문 ELF 섹션은코드또는데이터의독립적이고명명된나눌수없는시퀀스입니다. 응용프로그램을만들려면최소한하나이상의코드섹션이있어야합니다. 어셈블리및컴파일의출력에는다음이포함될수있습니다. 하나이상의코드섹션으로, 대개읽기전용섹션입니다. 하나이상의데이터섹션으로, 대개읽기 / 쓰기섹션입니다. 이러한섹션은 0 으로초기화 (ZI) 될수있습니다. 링커는섹션배치규칙에따라각섹션을프로그램이미지에배치합니다. 소스파일의인접섹션이응용프로그램이미지에서도인접할필요는없습니다. 링커가섹션을배치하는방법에대한자세한내용은 RealView Compilation Tools 링커및유틸리티설명서에서 3 장기본링커기능사용을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-17

ARM 어셈블리언어작성 소스파일에서 AREA 지시문은섹션의시작을표시합니다. 이지시문은섹션의이름을지정하고해당특성을설정합니다. 특성은이름뒤에배치되고쉼표로구분됩니다. AREA 지시문의구문에대한자세한내용은 7-69 페이지의 AREA 를참조하십시오. 아무이름이나선택할수있지만알파벳이외의문자로시작하는이름은막대로묶어야합니다. 그렇지않으면 AREA name missing 오류가생성됩니다. 예를들면 1_DataArea 와같습니다. 2-17 페이지의예제 2-1 에서는코드를포함하고 READONLY 로표시되는 ARMex 라는단일섹션을정의합니다. ENTRY 지시문 ENTRY 지시문은실행되는첫번째명령어를표시합니다. C 코드를포함하는응용프로그램에서는진입점이 C 라이브러리초기화코드내에도포함되고초기화코드와예외처리기에도포함됩니다. 응용프로그램실행 2-17 페이지의예제 2-1 의응용프로그램코드는 10 진수값 10 및 3 을레지스터 r0 및 r1 로로드하는 start 레이블에서실행을시작합니다. 이러한레지스터를더한결과는 r0 에배치됩니다. 응용프로그램종료 기본코드가실행된후에는디버거로제어권이반환되어응용프로그램이종료됩니다. 이작업은 ARM 세미호스팅 SVC( 기본적으로 0x123456임 ) 를다음매개변수와함께사용하여수행합니다. r0은 angel_swireason_reportexception(0x18) 과같습니다. r1은 ADP_Stopped_ApplicationExit(0x20026) 와같습니다. END 지시문 이지시문은이소스파일의처리를중지하도록어셈블러에지시합니다. 모든어셈블리언어소스모듈은별도의행에서 END 로끝나야합니다. 2-18 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.3.3 하위루틴호출 하위루틴을호출하려면분기및링크명령어를사용해야합니다. 구문은다음과같습니다. BL destination 여기서 destination 은일반적으로하위루틴의첫번째명령어레이블입니다. destination 은프로그램기준식일수도있습니다. 자세한내용은 4-118 페이지의 B, BL, BX, BLX 및 BXJ 를참조하십시오. BL 명령어의경우 링크레지스터에반환주소를배치합니다. PC를하위루틴의주소로설정합니다. 하위루틴코드가실행되고나면 BX lr 명령어를사용하여복귀할수있습니다. 일반적으로레지스터 r0 ~ r3 은매개변수를하위루틴에전달하는데사용되고 r0 은결과를호출자에게다시전달하는데사용됩니다. 참고개별적으로어셈블되었거나컴파일된모듈간의호출은프로시저호출표준에서정의된제한과규칙을준수해야합니다. 자세한내용은 install_directory\documentation\specifications\... 에있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을참조하십시오. 예제 2-2 에서는두매개변수값을더하고결과를 r0 에반환하는하위루틴을보여줍니다. 이예제는주예제디렉토리인 install_directory\rvds\examples 에 subrout.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 예제 2-2 AREA subrout, CODE, READONLY ; Name this block of code ENTRY ; Mark first instruction to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-19

ARM 어셈블리언어작성 doadd ADD r0, r0, r1 ; Subroutine code BX lr ; Return from subroutine END ; Mark end of file 2-20 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.4 조건부실행 ARM 상태및 Thumb-2 가포함된프로세서의 Thumb 상태에서는대부분의데이터처리명령어에연산결과에따라 APSR( 응용프로그램상태레지스터 ) 의 ALU 상태플래그를업데이트하는옵션이있습니다. 일부명령어는모든플래그를업데이트하고일부명령어는하위세트만업데이트합니다. 플래그가업데이트되지않으면원래값이저장됩니다. 각명령어의설명부분에는해당명령어가플래그에주는영향이자세히나와있습니다. 실행되지않는조건부명령어는플래그에영향을주지않습니다. 이전아키텍처의 Thumb 상태에서는대부분의데이터처리명령어가 ALU 상태플래그를자동으로업데이트합니다. 플래그를업데이트하지않는옵션은없습니다. 이외의명령어는플래그를업데이트할수없습니다. ARM 상태및 Thumb-2가포함된프로세서의 Thumb 상태에서는다음과같이다른명령어에설정된 ALU 상태플래그에따라조건부로명령어를실행할수있습니다. 플래그를업데이트한명령어바로다음에실행합니다. 플래그를업데이트하지않은임의개수의간섭명령어다음에실행합니다. 거의모든 ARM 명령어는 APSR 의 ALU 상태플래그의상태에대해조건부로실행될수있습니다. 명령어를조건부명령어로만들기위해명령어에추가하는접미사목록은 2-23 페이지의표 2-2 를참조하십시오. Thumb 상태에서는조건부분기를통해조건부실행을위한메커니즘이제공됩니다. Thumb-2 가포함된프로세서의 Thumb 상태에서는특수 IT(If-Then) 명령어를사용하여명령어를조건부명령어로만들수있습니다. 또한 CBZ(0 인경우조건부분기 ) 및 CBNZ 명령어를사용하여레지스터의값을 0 과비교할수도있습니다. 이단원에서는다음내용을설명합니다. 2-22페이지의 ALU 상태플래그 2-22 페이지의조건부실행 2-24 페이지의조건부실행사용 2-25 페이지의조건부실행사용예제 2-29 페이지의 Q 플래그 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-21

ARM 어셈블리언어작성 2.4.1 ALU 상태플래그 APSR에는다음 ALU 상태플래그가포함되어있습니다. N 연산결과가음수인경우설정합니다. Z 연산결과가 0인경우설정합니다. C 연산결과가 carry인경우설정합니다. V 연산결과가오버플로인경우설정합니다. carry 는더하기결과가 2 32 보다크거나같은경우또는빼기결과가양수인경우에발생하거나이동또는논리명령어에서인라인배럴시프터연산의결과로발생합니다. 오버플로는더하기, 빼기또는비교의결과가 2 31 보다크거나같거나 -2 31 보다작은경우발생합니다. 2.4.2 조건부실행 조건부로실행될수있는명령어에는구문설명에 {cond} 로표시되는선택적조건코드가있습니다. 이조건은 ARM 명령어에인코딩되며, Thumb-2 명령어의경우위의 IT 명령어에인코딩됩니다. 조건코드가포함된명령어는 APSR 의조건코드플래그가지정된조건을충족하는경우에만실행됩니다. 2-23 페이지의표 2-2 에서는사용할수있는조건코드를보여줍니다. Thumb-2 가없는 Thumb 프로세서에서 {cond} 필드는특정분기명령어에만허용됩니다. 2-22 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 표 2-2에서는조건코드접미사와N, Z, C 및 V 플래그간의관계도보여줍니다. 표 2-2 조건코드접미사 접미사 플래그 의미 EQ Z 세트 같음 NE Z 지우기 같지않음 CS/HS C 세트 높거나같음 ( 부호없는 >= ) CC/LO C 지우기 보다낮음 ( 부호없는 < ) MI N 세트 음수 PL N 지우기 양수또는 0 VS V 세트 오버플로 VC V 지우기 오버플로없음 HI C 설정및 Z 지우기 보다높음 ( 부호없는 > ) LS C 지우기또는 Z 설정 낮거나같음 ( 부호없는 <= ) GE N 및 V 같음 부호있는 >= LT N 및 V 다름 부호있는 < GT Z 지우기, N 및 V 같음 부호있는 > LE Z 설정, N 및 V 다름 부호있는 <= AL Any 항상. 이접미사는대개생략됩니다. 예제 2-3 에서는조건부실행예제를보여줍니다. 예제 2-3 ADD r0, r1, r2 ; r0 = r1 + r2, don't update flags ADDS r0, r1, r2 ; r0 = r1 + r2, and update flags ADDSCS r0, r1, r2 ; If C flag set then r0 = r1 + r2, and update flags CMP r0, r1 ; update flags based on r0-r1. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-23

ARM 어셈블리언어작성 2.4.3 조건부실행사용 ARM 명령어의조건부실행을사용하여코드에서분기명령어수를줄일수있습니다. 이렇게하면코드밀도가향상됩니다. Thumb-2 의 IT 명령어도이와비슷하게향상되었습니다. 분기명령어는프로세서주기를많이사용합니다. 분기예상하드웨어가없는 ARM 프로세서에서분기명령어는분기가생성될때마다프로세서파이프라인을다시채우기위해세개의프로세서주기를사용합니다. 일부 ARM 프로세서 ( 예 : ARM10 및 StrongARM ) 에는분기예상하드웨어가있습니다. 이러한프로세서를사용하는시스템에서는잘못된분기예상이있을경우파이프라인을플러시하고다시채워야합니다. 2-24 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.4.4 조건부실행사용예제 이예제에서는최대공약수 (gcd) 알고리즘 (Euclid) 의두가지구현을사용합니다. 이예제에서는조건부실행을사용하여코드밀도와실행속도를향상시키는방법을보여줍니다. 실행속도에대한자세한분석은 ARM7 프로세서에만적용되고코드밀도계산은모든 ARM 프로세서에적용됩니다. C 에서는이알고리즘을다음과같이표시할수있습니다. int gcd(int a, int b) { while (a!= b) { if (a > b) a = a - b; else b = b - a; } return a; } 조건부분기실행만포함된 gcd 함수는다음과같은방법으로구현할수있습니다. gcd CMP r0, r1 BEQ end BLT less SUBS r0, r0, r1 ; could be SUB r0, r0, r1 for ARM B gcd less SUBS r1, r1, r0 ; could be SUB r1, r1, r0 for ARM B gcd end 분기수때문에코드길이는명령어일곱개입니다. 분기가생성될때마다프로세서는파이프라인을다시채우고새위치에서계속실행되어야합니다. 다른명령어와실행되지않은분기는각각단일주기를사용합니다. ARM 명령어세트의조건부실행기능을사용하면다음과같이네개의명령어만으로 gcd 함수를구현할수있습니다. gcd CMP SUBGT SUBLE BNE r0, r1 r0, r0, r1 r1, r1, r0 gcd ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-25

ARM 어셈블리언어작성 코드크기를향상시킬뿐아니라대부분의경우이코드가빠르게실행됩니다. 표 2-3 및표 2-4 에서는 r0 이 1 이고 r1 이 2 인경우각구현에서사용하는주기수를보여줍니다. 이경우분기를모든명령어의조건부실행으로바꾸면 3 주기가절약됩니다. 코드의조건부버전은 r0 이 r1 과같은경우동일한주기수로실행됩니다. 다른모든경우코드의조건부버전은더적은주기수로실행됩니다. 표 2-3 주기수 ( 조건부분기에만해당 ) r0: a r1: b 명령어주기 (ARM7) 1 2 CMP r0, r1 1 1 2 BEQ end 1( 실행되지않음 ) 1 2 BLT less 3 1 2 SUB r1, r1, r0 1 1 2 B gcd 3 1 1 CMP r0, r1 1 1 1 BEQ end 3 총 13 개 표 2-4 주기수 ( 모든조건부명령어에해당 ) r0: a r1: b 명령어 주기 (ARM7) 1 2 CMP r0, r1 1 1 2 SUBGT r0,r0,r1 1( 실행되지않음 ) 1 1 SUBLT r1,r1,r0 1 1 1 BNE gcd 3 1 1 CMP r0,r1 1 1 1 SUBGT r0,r0,r1 1( 실행되지않음 ) 2-26 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 표 2-4 주기수 ( 모든조건부명령어에해당 ) ( 계속 ) r0: a r1: b 명령어 주기 (ARM7) 1 1 SUBLT r1,r1,r0 1( 실행되지않음 ) 1 1 BNE gcd 1( 실행되지않음 ) 총 10개 gcd 의 16 비트 Thumb 버전 B 는조건부로실행될수있은유일한 16 비트 Thumb 명령어이므로 gcd 알고리즘은 Thumb 코드의조건부분기로작성되어야합니다. ARM 조건부분기구현과같이 Thumb 코드에는일곱개의명령어가필요합니다. Thumb 명령어를사용할경우전체코드크기는 16 바이트의 ARM 구현에비해작은 14 바이트입니다. 또한 16 비트메모리를사용하는시스템에서각 16 비트명령어에는하나의메모리액세스만필요하지만각 ARM 32 비트명령어에는두개의페치가필요하므로 Thumb 버전이 ARM 구현보다빠르게실행됩니다. gcd 의 Thumb-2 버전 다음과같이 IT 명령어를사용하여 SUB 명령어를조건부명령어로만들어이코드의 ARM 버전을 Thumb-2 코드로변환할수있습니다. gcd CMP ITE SUBGT SUBLE BNE r0, r1 GT r0, r0, r1 r1, r1, r0 gcd 이명령어는 ARM 또는 Thumb-2 코드로똑같이잘어셈블됩니다. 어셈블러에서는 IT 명령어를확인하지만 ARM 코드로어셈블할때는 IT 명령어를생략합니다. IT 명령어를생략할수있습니다. 어셈블러에서 Thumb-2 코드로어셈블할때자동으로 IT 명령어삽입합니다. 명령어가하나더필요한코드는 ARM 코드가아니라 Thumb-2 코드이지만전체코드크기가 Thumb-2 코드는 10 바이트지만 ARM 코드는 16 바이트입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-27

ARM 어셈블리언어작성 실행속도 실행속도를최적화하려면명령어타이밍, 분기예상논리및타겟시스템의캐시동작을자세히알고있어야합니다. 개별프로세서에대한자세한내용은 ARM 아키텍처참조문서및기술참조설명서를참조하십시오. 2-28 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.4.5 Q 플래그 ARMv5TE 및 ARMv6 이상에는포화산술명령어에서포화가발생할경우 (4-97 페이지의 QADD, QSUB, QDADD 및 QDSUB 참조 ) 또는특정곱하기명령어에서오버플로가발생할경우 (4-80 페이지의 SMULxy 및 SMLAxy 및 4-82 페이지의 SMULWy 및 SMLAWy 참조 ) 기록할 Q 플래그가있습니다. Q 플래그는스티키플래그입니다. 이러한명령어는플래그를설정할수만있고지울수는없습니다. 각명령어다음에나오는플래그를확인하지않고도이러한일련의명령어를실행한다음플래그를테스트하여특정지점에서포화나오버플로가발생했는지여부를확인할수있습니다. Q 플래그를지우려면 MSR 명령어 (4-137 페이지의 MSR 참조 ) 를사용하십시오. Q 플래그상태는조건코드에서직접테스트할수없습니다. Q 플래그의상태를보려면 MRS 명령어 (4-135 페이지의 MRS 참조 ) 를사용하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-29

ARM 어셈블리언어작성 2.5 레지스터에상수로드 메모리에서데이터를로드하지않으면단일 ARM 명령어로임의의 32 비트즉치상수를레지스터에로드할수없습니다. 이것은 ARM 및 Thumb-2 명령어의길이가 32 비트이기때문입니다. 16 비트 Thumb 명령어를사용하여생성할수있는상수의범위는훨씬더좁습니다. 또한별도의로드연산없이공통적으로사용되는많은상수를데이터처리명령어내에피연산자로직접포함할수있습니다. 데이터로드를통해 32 비트값을레지스터로로드할수있지만보다직접적이고효율적인방법으로공통적으로사용되는많은상수를로드할수있습니다. ARMv6T2 이상에서는두개의명령어 MOV 와 MOVT 를차례로사용하여 32 비트값을레지스터에로드할수있습니다. MOV32 의사명령어를사용하여명령어시퀀스를생성할수있습니다. 다음단원에서는다음내용에대해설명합니다. MOV 및 MVN 명령어를사용하여즉치값범위를로드하는방법자세한내용은 2-31페이지의 MOV 및 MVN을통한직접로드를참조하십시오. MOV32 의사명령어를사용하여 32비트상수를로드하는방법자세한내용은 2-35페이지의 MOV32를사용하여로드를참조하십시오. LDR 의사명령어를사용하여 32비트상수를로드하는방법자세한내용은 2-35페이지의 LDR Rd, =const를통한직접로드를참조하십시오. 부동소수점상수를로드하는방법 2-38페이지의부동소수점상수로드를참조하십시오. 2-30 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.5.1 MOV 및 MVN 을통한직접로드 ARM 및 Thumb-2 에서는 32 비트 MOV 및 MVN 명령어를사용하여광범위한상수값을레지스터에직접로드할수있습니다. 16 비트 Thumb MOV 명령어는 0 ~ 255 범위의상수를로드할수있습니다. 16 비트 MVN 명령어를사용하여상수를로드할수는없습니다. ARM 상태즉치상수에서는단일 ARM 명령어로로드할수있는값범위를보여주고 2-33 페이지의 Thumb-2 즉치상수에서는단일 Thumb-2 명령어로로드할수있는값범위를보여줍니다. MOV 또는 MVN 중어느것을사용할지를지정하지않아도어셈블러에서자동으로적절한명령어를사용합니다. 이기능은값이어셈블리타임변수인경우에유용합니다. 사용할수없는상수가포함된명령어를작성하면어셈블러에서오류를보고합니다. 이연산에대해즉치값 n 이 ( 가 ) 범위를벗어났습니다. ARM 상태즉치상수 ARM 상태의경우 MOV로 0x0-0xFF(0 ~ 255) 범위의 8비트상수값을로드할수있습니다. 또한이러한값을짝수로회전할수있습니다. 또한이러한값은별도의명령어로로드하지않고대부분의데이터처리연산에서즉치피연산자로사용할수있습니다. MVN 으로이러한값의비트단위보수를로드할수있습니다. 숫자값은 - (n+1) 입니다. 여기서 n 은 MOV 에서사용할수있는값입니다. ARMv6T2 이상에서는 MOV 로 0x0-0xFFFF(0 ~ 65535) 범위의 16 비트숫자를로드할수있습니다. 2-32 페이지의표 2-5 에서는이명령어가제공하는 8 비트값범위를보여줍니다 ( 데이터처리연산의경우 ). 2-32 페이지의표 2-6 에서는이명령어가제공하는 16 비트값범위를보여줍니다 (MOV 명령어의경우에만 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-31

ARM 어셈블리언어작성 표 2-5 ARM 상태즉치상수 (8 비트 ) 이진 10 진수단계 16 진수 MVN 값 a 참고정보 000000000000000000000000abcdefgh 0-255 1 0-0xFF -1 ~ +256-0000000000000000000000abcdefgh00 0-1020 4 0-0x3FC -4 ~ +1024-00000000000000000000abcdefgh0000 0-4080 16 0-0xFF0-16 ~ +4096-000000000000000000abcdefgh000000 0-16320 64 0-0x3FC0-64 ~ +16384 -............ - abcdefgh000000000000000000000000 0-255 x 2 24 2 24 0-0xFF000000 1-256 x -2 24 - cdefgh000000000000000000000000ab ( 비트패턴 ) - - ( 비트패턴 ) 참고정보의 b 참조 efgh000000000000000000000000abcd ( 비트패턴 ) - - ( 비트패턴 ) 참고정보의 b 참조 gh000000000000000000000000abcdef ( 비트패턴 ) - - ( 비트패턴 ) 참고정보의 b 참조 표 2-6 MOV 명령어의 ARM 상태즉치상수 이진 10 진수단계 16 진수 MVN 값참고정보 0000000000000000abcdefghijklmnop 0-65535 1 0-0xFFFF - 참고정보의 c 참조 참고정보 이러한참고는표 2-5 및표 2-6 에대한추가정보를제공합니다. a b c MVN 값은데이터처리명령어가아닌다른명령어에서피연산자로직접사용할수없습니다. 이러한값은 ARM 상태에서만사용할수있습니다. 이표에나와있는다른모든값은다른언급이없는한 Thumb-2 에서도사용할수있습니다. 이러한값은 ARMv6T2 이상에서만사용할수있고다른명령어에서피연산자로직접사용할수없습니다. 2-32 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 Thumb-2 즉치상수 Thumb 상태에있는 ARMv6T2 이상의경우 32비트 MOV 명령어가다음을로드할수있습니다. 0x0 ~ 0xFF(0 ~ 255) 범위의 8비트상수값 임의의숫자를기준으로왼쪽으로시프트된 8비트상수값 레지스터의 4바이트모두에복제된 8비트패턴 바이트 1과바이트 3이 0으로설정된상태에서바이트 0과바이트 2에복제된 8비트패턴 바이트 0과바이트 2가 0으로설정된상태에서바이트 1과바이트 3에복제된 8비트패턴또한이러한값은별도의명령어로로드하지않고대부분의데이터처리연산에서즉치피연산자로사용할수있습니다. 32 비트 MVN 명령어는이러한값의비트단위보수를로드할수있습니다. 숫자값은 -(n+1) 입니다. 여기서 n 은 MOV 에서사용할수있는값입니다. 32 비트 MOV 명령어는 0x0 ~ 0xFFFF(0 ~ 65535) 범위의 16 비트숫자를로드할수있습니다. 이러한값은데이터처리연산에서즉치피연산자로사용할수없습니다. 2-34 페이지의표 2-7 에서는이명령어가제공하는값범위를보여줍니다 ( 데이터처리연산의경우 ). 2-34 페이지의표 2-8 에서는이명령어가제공하는 16 비트값범위를보여줍니다 (MOV 명령어의경우에만 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-33

ARM 어셈블리언어작성 표 2-7 Thumb 상태즉치상수 이진 10 진수단계 16 진수 MVN 값 a 참고정보 000000000000000000000000abcdefgh 0-255 1 0-0xFF -1 ~ +256-00000000000000000000000abcdefgh0 0-510 2 0-0x1FE -2 ~ +512-0000000000000000000000abcdefgh00 0-1020 4 0-0x3FC -4 ~ +1024 -............ - 0abcdefgh00000000000000000000000 0-255 x 2 23 2 23 0-0x7F800000 1-256 x -2 23 - abcdefgh000000000000000000000000 0-255 x 2 24 2 24 0-0xFF000000 1-256 x -2 24 - abcdefghabcdefghabcdefghabcdefgh ( 비트패턴 ) - 0xXYXYXYXY 0xXYXYXYXY - 00000000abcdefgh00000000abcdefgh ( 비트패턴 ) - 0x00XY00XY 0xFFXYFFXY - abcdefgh00000000abcdefgh00000000 ( 비트패턴 ) - 0xXY00XY00 0xXYFFXYFF - 00000000000000000000abcdefghijkl 0-4095 1 0-0xFFF - 참고정보의 b 참조 표 2-8 MOV 명령어의 Thumb 상태즉치상수 이진 10 진수단계 16 진수 MVN 값참고정보 0000000000000000abcdefghijklmnop 0-65535 1 0-0xFFFF - 참고정보의 c 참조 참고정보 이러한참고는표 2-7 및표 2-8 에대한추가정보를제공합니다. a MVN 값은다른명령어에서피연산자로직접사용할수없습니다. b 이러한값은 ADD, SUB 및 MOV 명령어에서피연산자로직접사용할수있지만 MVN 또는다른데이터처리명령어에서는사용할수없습니다. c 이러한값은 MOV 명령어에서만사용할수있습니다. 2-34 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.5.2 MOV32 를사용하여로드 ARMv6T2 의 ARM 및 Thumb-2 명령어세트에는다음이포함됩니다. 0x00000000 ~ 0x0000FFFF 범위의값을레지스터로로드할수있는 MOV 명령어 최하위반의내용을변경하지않고 0x0000 ~ 0xFFFF 범위의값을레지스터의최상위반으로로드할수있는 MOVT 명령어 이러한두개명령어를사용하여레지스터에서 32 비트상수를생성할수있습니다. 이외에도 MOV32 의사명령어를사용할수있습니다. 어셈블러는 MOV, MOVT 명령어쌍을생성합니다. MOV32 의사명령어의구문에대한자세한내용은 4-155 페이지의 MOV32 의사명령어를참조하십시오. 2.5.3 LDR Rd, =const 를통한직접로드 LDR Rd,=const 의사명령어는단일명령어에서 32 비트숫자상수를생성할수있습니다. 이의사명령어를사용하여 MOV 및 MVN 명령어범위를벗어난상수를생성할수있습니다. LDR 의사명령어는특정상수에대한가장효율적인단일명령어를생성합니다. MOV 또는 MVN 명령어를사용하여상수를생성할수있으면어셈블러가해당명령어를생성합니다. MOV 또는 MVN 명령어를사용하여상수를생성할수없으면어셈블러가다음을수행합니다. 리터럴풀 ( 상수값을포함하기위한코드에임베드된메모리일부 ) 에값배치 리터럴풀에서값을읽는프로그램기준주소가포함된 LDR 명령어생성 예를들면다음과같습니다. LDR rn, [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] 어셈블러에서생성된 LDR 명령어의범위내에리터럴풀이있는지확인해야합니다. 자세한내용은 2-36 페이지의리터럴풀배치을참조하십시오. 의사명령어의구문에대한자세한내용은 4-157 페이지의 LDR 의사명령어를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-35

ARM 어셈블리언어작성 리터럴풀배치 어셈블러는각섹션의끝에리터럴풀을배치합니다. 이러한리터럴풀은다음섹션시작에있는 AREA 지시문또는어셈블리끝에있는 END 지시문을통해정의됩니다. 포함파일끝에있는 END 지시문은섹션의끝을나타내지않습니다. 넓은섹션에서는기본리터럴풀이하나이상의 LDR 명령어범위를벗어날수있습니다. PC에서상수까지의오프셋은다음과같아야합니다. ARM 또는 Thumb-2 코드에서는 4KB 미만이지만두방향중한방향이될수있음 16비트명령어를사용할경우 Thumb에서 1KB 미만및정방향 LDR Rd,=const 의사명령어가상수를리터럴풀에배치해야할경우어셈블러에서는다음을수행합니다. 이전리터럴풀에서상수를사용할수있고주소지정이가능한지확인합니다. 이경우기존상수에주소를지정합니다. 아직사용하도록설정되지않은경우다음리터럴풀에상수를배치하려고합니다. 다음리터럴풀이범위를벗어날경우어셈블러는오류메시지를생성합니다. 이경우 LTORG 지시문을사용하여코드에추가리터럴풀을배치해야합니다. 실패한 LDR 의사명령어뒤에 ±4KB(ARM, 32 비트 Thumb-2) 내또는 0 ~ +1KB 범위 (Thumb, 16 비트 Thumb-2) 에 LTORG 지시문을배치합니다. 자세한내용은 7-19 페이지의 LTORG 를참조하십시오. 프로세서가지시문을명령어로실행하려고하지않으면리터럴풀을배치해야합니다. 조건부가아닌분기명령어또는하위루틴끝의반환명령어다음에지시문을배치합니다. 예제 2-4 에서는이작업을수행하는방법을보여줍니다. 이예제는주예제디렉토리인 install_directory\rvds\examples 에 loadcon.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 주석으로표시된명령어는어셈블러에서생성된 ARM 명령어입니다. 2-36 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 예제 2-4 start stop AREA ENTRY Loadcon, CODE, READONLY ; Mark first instruction to execute BL func1 ; Branch to first subroutine BL func2 ; Branch to second subroutine MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) func1 LDR r0, =42 ; => MOV R0, #42 LDR r1, =0x55555555 ; => LDR R1, [PC, #offset to ; Literal Pool 1] LDR r2, =0xFFFFFFFF ; => MVN R2, #0 BX lr LTORG ; Literal Pool 1 contains ; literal Ox55555555 func2 LDR r3, =0x55555555 ; => LDR R3, [PC, #offset to ; Literal Pool 1] ; LDR r4, =0x66666666 ; If this is uncommented it ; fails, because Literal Pool 2 ; is out of reach BX lr LargeTable SPACE 4200 ; Starting at the current location, ; clears a 4200 byte area of memory ; to zero END ; Literal Pool 2 is empty 2.5.4 부동소수점상수로드 NEON 및 VFPv3 명령어세트에는제한된범위의부동소수점상수를즉치상수로로드하는명령어가있습니다. 다음을참조하십시오. NEON 명령어에대한자세한내용은 5-37 페이지의 VMOV, VMVN( 즉치값 ) 을참조하십시오. VFPv3 명령어에대한자세한내용은 5-97 페이지의 VMOV 를참조하십시오. VLDR 의사명령어를사용하여단일명령어에서단정밀도또는배정밀도부동소수점값을로드할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-37

ARM 어셈블리언어작성 자세한내용은 5-77 페이지의 VLDR 의사명령어를참조하십시오. 2-38 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.6 레지스터에주소로드 주소를레지스터로로드해야할수있습니다. 변수주소, 문자열상수, 점프테이블의시작위치를로드해야할수있습니다. 일반적으로주소는현재 PC 또는기타레지스터의오프셋으로표시됩니다. 이단원에서는주소를레지스터로로드하는다음과같은방법에대해설명합니다. 레지스터직접로드 (ADR 및 ADRL을통한직접로드참조 ) 리터럴풀에서주소로드 (2-42페이지의 with LDR Rd, =label을통한주소로드참조 ) 2.6.1 ADR 및 ADRL 을통한직접로드 ADR 명령어및 ADRL 의사명령어를사용하여데이터로드를수행하지않고특정범위내에주소를생성할수있습니다. ADR 및 ADRL 은프로그램기준식즉, 레이블주소가현재 PC 에상대적인선택적오프셋이있는레이블을허용합니다. 참고 ADR 또는 ADRL 에사용된레이블은동일한코드섹션내에있어야합니다. 어셈블러에서는동일한섹션의범위를벗어난레이블에대한참조에대해오류를발생시킵니다. Thumb 상태에서 16 비트 ADR 명령어는워드로정렬된주소만생성할수있습니다. ADRL 은 Thumb-2 가없는프로세서의 Thumb 상태에서사용할수없습니다. ADR 사용가능한범위는다음과같은명령어세트에따라달라집니다. ARM 바이트또는하프워드로정렬된주소의경우, ±255 바이트 워드로정렬된주소의경우, ±1020 바이트 32 비트 Thumb-2 바이트, 하프워드또는워드로정렬된주소의경우, ±4095 바이트 16 비트 Thumb 0 ~ 1020 바이트. label 은워드로정렬되어야합니다. 이렇게하려면 ALIGN 지시문을사용하면됩니다. 자세한내용은 4-25 페이지의 ADR 을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-39

ARM 어셈블리언어작성 ADRL 어셈블러는다음을생성하여 ADRL rn,label 의사명령어를변환합니다. 범위내에있는경우주소를로드하는두개의데이터처리명령어 두개의명령어로주소를생성할수없는경우오류메시지사용가능한범위는다음과같이사용중인명령어세트에따라달라집니다. ARM 바이트또는하프워드로정렬된주소의경우, ±64KB 워드로정렬된주소의경우 ±256KB 32 비트 Thumb-2 바이트, 하프워드또는워드로정렬된주소의경우 ±1MB 16 비트 Thumb ADRL 을사용할수없음 ADRL 의사명령어범위를벗어난주소를로드하는방법에대한자세한내용은 2-42 페이지의 with LDR Rd, =label 을통한주소로드를참조하십시오. ADR 을통한점프테이블구현 예제 2-5 에서는점프테이블을구현하는 ARM 코드를보여줍니다. 이예제에서 ADR 의사명령어는점프테이블의주소를로드합니다. 이예제는주예제디렉토리인 install_directory\rvds\examples 에 jump.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 예제 2-5 점프테이블구현 (ARM) AREA Jump, CODE, READONLY ; Name this block of code ARM ; Following code is ARM code num EQU 2 ; Number of entries in jump table ENTRY ; Mark first instruction to execute start ; First instruction to call MOV r0, #0 ; Set up the three parameters MOV r1, #3 MOV r2, #2 BL arithfunc ; Call the function stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) arithfunc ; Label the function CMP r0, #num ; Treat function code as unsigned integer 2-40 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 BXHS lr ; If code is >= num then simply return ADR r3, JumpTable ; Load address of jump table LDR pc, [r3,r0,lsl#2] ; Jump to the appropriate routine JumpTable DCD DoAdd DCD DoSub DoAdd DoSub ADD r0, r1, r2 ; Operation 0 BX lr ; Return SUB r0, r1, r2 ; Operation 1 BX lr ; Return END ; Mark the end of this file 2-40 페이지의예제 2-5 에서함수 arithfunc 는세개의인수를사용하고결과를 r0 에반환합니다. 첫번째인수는두번째및세번째인수에서수행되는연산을결정합니다. argument1=0 argument1=1 Result = argument2 + argument3. Result = argument2 - argument3. 점프테이블은다음명령어와어셈블러지시문을사용하여구현합니다. EQU 어셈블러지시문입니다. 심볼에값을제공하는데사용됩니다. 2-40 페이지의예제 2-5 에서이지시문은값 2 를 num 에할당합니다. num 이코드에사용되면값 2 를대체합니다. 이방법으로 EQU 를사용하는것은 #define 을사용하여 C 에서상수를정의하는것과비슷합니다. DCD LDR 저장소에하나이상의워드를선언합니다. 2-40 페이지의예제 2-5 에서각 DCD 는점프테이블의특정절을처리하는루틴의주소를저장합니다. LDR pc,[r3,r0,lsl#2] 명령어는점프테이블의필수절주소를 PC로로드합니다. 이명령어는다음을수행합니다. r0의절번호에 4를곱해워드오프셋을제공합니다. 결과에점프테이블주소를더합니다. 결합된주소내용을 PC로로드합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-41

ARM 어셈블리언어작성 2.6.2 with LDR Rd, =label 을통한주소로드 LDR Rd,= 의사명령어는 32 비트상수를레지스터에로드할수있습니다 (2-35 페이지의 LDR Rd, =const 를통한직접로드참조 ). 또한레이블및오프셋포함레이블과같은프로그램기준식을허용합니다. 어셈블러에서는다음을수행하여 LDR r0, =label 의사명령어를변환합니다. 리터럴풀 ( 상수값을포함하기위한코드에임베드된메모리일부 ) 에 label 주소를배치합니다. 리터럴풀에서주소를읽는프로그램기준주소가포함된 LDR 명령어를생성합니다. 예를들면다음과같습니다. LDR rn [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] 범위내에리터럴풀이있는지확인해야합니다. 자세한내용은 2-36 페이지의리터럴풀배치를참조하십시오. ADR 및 ADRL 의사명령어와달리 LDR 은현재섹션외부의레이블에사용할수있습니다. 레이블이현재섹션의외부에있으면어셈블러는소스파일을어셈블할때재배치지시문을개체코드에배치합니다. 재배치지시문은링크타임에링커가주소를확인하도록지정합니다. 링커가 LDR 과리터럴풀이포함된섹션을배치하는위치에관계없이주소는유효한상태로유지됩니다. 예제 2-6 에서는이작업을수행하는방법을보여줍니다. 이예제는주예제디렉토리인 install_directory\rvds\examples 에 ldrlabel.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 주석에나열된명령어는어셈블러에서생성된 ARM 명령어입니다. 예제 2-6 start stop AREA ENTRY LDRlabel, CODE,READONLY ; Mark first instruction to execute BL func1 ; Branch to first subroutine BL func2 ; Branch to second subroutine MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) 2-42 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 func1 LDR r0, =start ; => LDR R0,[PC, #offset into ; Literal Pool 1] LDR r1, =Darea + 12 ; => LDR R1,[PC, #offset into ; Literal Pool 1] LDR r2, =Darea + 6000 ; => LDR R2, [PC, #offset into ; Literal Pool 1] BX lr ; Return LTORG ; Literal Pool 1 func2 LDR r3, =Darea + 6000 ; => LDR r3, [PC, #offset into ; Literal Pool 1] ; (sharing with previous literal) ; LDR r4, =Darea + 6004 ; If uncommented produces an error ; as Literal Pool 2 is out of range BX lr ; Return Darea SPACE 8000 ; Starting at the current location, ; clears a 8000 byte area of memory ; to zero END ; Literal Pool 2 is out of range of ; the LDR instructions above ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-43

ARM 어셈블리언어작성 LDR Rd, =label 예제 : 문자열복사 예제 2-7 에서는한문자열에다른문자열을덮어쓰는 ARM 코드루틴을보여줍니다. 이예제에서는 LDR 의사명령어를사용하여두문자열의주소를데이터섹션에서로드합니다. 다음은특히중요한예제입니다. DCB LDR, STR DCB 지시문은저장소에하나이상의바이트를정의합니다. 정수값과함께 DCB 는따옴표로묶인문자열을허용합니다. 문자열의각문자는연속된바이트로배치됩니다. 자세한내용은 7-23 페이지의 DCB 를참조하십시오. LDR 및 STR 명령어는 Post 인덱싱된주소지정을사용하여주소레지스터를업데이트합니다. 다음명령어를예로들수있습니다. LDRB r2,[r1],#1 r1 에의해지정된주소내용을사용하여 r2 를로드한다음 r1 을 1 씩증가시킵니다. 예제 2-7 문자열복사 AREA StrCopy, CODE, READONLY ENTRY ; Mark first instruction to execute start LDR r1, =srcstr ; Pointer to first string LDR r0, =dststr ; Pointer to second string BL strcopy ; Call subroutine to do copy stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) strcopy LDRB r2, [r1],#1 ; Load byte and update address STRB r2, [r0],#1 ; Store byte and update address CMP r2, #0 ; Check for zero terminator BNE strcopy ; Keep going if not MOV pc,lr ; Return AREA srcstr DCB dststr DCB END Strings, DATA, READWRITE "First string - source",0 "Second string - destination",0 2-44 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.7 다중레지스터로드및저장명령어 ARM, Thumb 및 Thumb-2 명령어세트는메모리에서여러레지스터를로드하고메모리에저장하는명령어를포함합니다. 다중레지스터전송명령어는여러레지스터의내용을메모리와사이에서이동하는효율적인방법을제공합니다. 이명령어는블록복사및하위루틴진입및종료의스택연산에가장많이사용됩니다. 일련의단일데이터전송명령어대신다중레지스터전송명령어를사용하면다음과같은장점이있습니다. 더작은코드크기. 여러명령어페치가아니라단일명령어페치오버헤드. 변경되지않은 ARM 프로세서에서다중로드또는다중저장에의한데이터의첫워드는항상비순차메모리주기이지만전송되는모든후속워드는순차메모리주기가될수있습니다. 대부분의시스템에서는순차메모리주기가더빠릅니다. 참고 번호가가장낮은레지스터는액세스되는가장낮은메모리주소에서또는이주소로전송되고번호가가장높은레지스터는액세스되는가장높은메모리주소에서또는이주소로전송됩니다. 명령어의레지스터목록에나열된레지스터순서에따른차이는없습니다. - - diag_warning 1206 어셈블러명령행옵션을사용하여레지스터목록의레지스터가오름차순으로지정되어있는지확인할수있습니다. 이단원에서는다음내용을설명합니다. 2-46페이지의 ARM 및 Thumb-2에서사용할수있는다중로드및저장명령어 2-47페이지의 LDM 및 STM을통한스택구현 2-49 페이지의 LDM 및 STM 을통한블록복사 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-45

ARM 어셈블리언어작성 2.7.1 ARM 및 Thumb-2 에서사용할수있는다중로드및저장명령어 다음명령어는 ARM 명령어세트와 Thumb-2 명령어세트에서사용할수있습니다. LDM 다중레지스터를로드합니다. STM 다중레지스터를저장합니다. PUSH 다중레지스터를스택에저장하고스택포인터를업데이트합니다. POP LDM 및 STM 명령어의경우 다중레지스터를스택에서로드하고스택포인터를업데이트합니다. 로드또는저장된레지스터목록에다음이포함될수있습니다. ARM 명령어의경우, r0 ~ r15 모두 32비트 Thumb-2 명령어의경우, r0 ~ r12 모두및선택적으로일부제한이있는 r14 또는 r15 16비트 Thumb 및 Thumb-2 명령어의경우 r0 ~ r7 모두 주소는다음중하나일수있습니다. 각전송후에증가하는주소 각전송전에증가하는주소 (ARM 명령어에만해당 ) 각전송후에감소하는주소 (ARM 명령어에만해당 ) 각전송전에감소하는주소 (16비트 Thumb 제외 ) 기준레지스터는다음중하나일수있습니다. 메모리의다음데이터블록을가리키도록업데이트되는레지스터 명령어이전상태로남아있는레지스터 (16비트 Thumb 제외 ) 기준레지스터가메모리의다음블록을가리키도록업데이트될경우이작업을쓰기되돌림이라고합니다. 즉, 인접주소가기준레지스터에다시기록됩니다. PUSH 및 POP 명령어의경우 스택포인터 (r13) 가기준레지스터이고항상업데이트됩니다. 주소는 POP 명령어의각전송후에증가되고 PUSH 명령어의각전송전에감소됩니다. 로드또는저장된레지스터목록에는다음이포함될수있습니다. ARM 명령어의경우, r0 ~ r15 모두 2-46 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 32비트 Thumb-2 명령어의경우, r0 ~ r12 모두및선택적으로일부제한이있는 r14 또는 r15 16비트 Thumb-2 및 Thumb 명령어의경우, r0 ~ r7 모두및선택적으로 r14(push에만해당 ) 또는 r15(pop에만해당 ) 2.7.2 LDM 및 STM 을통한스택구현 다중로드및저장명령어는기준레지스터를업데이트할수있습니다. 스택연산의경우기준레지스터는일반적으로스택포인트 r13 입니다. 즉, 이러한명령어를사용하여단일명령어에서임의의레지스터수에대해푸시및팝연산을구현할수있습니다. 다중로드및저장명령어는여러유형의스택에사용할수있습니다. 내림차순또는오름차순스택은상위주소에서시작하여하위주소로진행하여 ( 내림차순스택 ) 아래쪽으로증가하거나하위주소에서시작하여상위주소로진행하여 ( 오름차순스택 ) 위쪽으로증가합니다. 전체또는비어있음스택포인터는스택의마지막항목 ( 전체스택 ) 또는스택의다음빈공간 ( 빈스택 ) 을가리킬수있습니다. 프로그래머가이작업을간편하게수행하려면증가나감소대신접미사앞이나뒤에스택지향접미사를사용할수있습니다. 스택지향접미사목록은표 2-9 를참조하십시오. 표 2-9 다중로드및저장명령어의접미사 스택유형 푸시 팝 전체내림차순 STMFD(STMDB, 이전감소 ) LDMFD(LDM, 이후증가 ) 전체오름차순 STMFA(STMIB, 이전증가 ) LDMFA (LDMDA, 이후감소 ) 빈내림차순 STMED (STMDA, 이후감소 ) LDMED(LDMIB, 이전증가 ) 빈오름차순 STMEA(STM, 이후증가 ) LDMEA(LDMDB, 이전감소 ) 예를들면다음과같습니다. STMFD LDMFD r13!, {r0-r5} ; Push onto a Full Descending Stack r13!, {r0-r5} ; Pop from a Full Descending Stack ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-47

ARM 어셈블리언어작성 참고 Procedure Call Standard for the ARM Architecture(AAPCS) 와 ARM, Thumb C 및 C++ 컴파일러에서는항상전체내림차순스택을사용합니다. PUSH 및 POP 명령어는전체내림차순스택을가정합니다. 이러한명령어쓰기되돌림이포함된 STMDB 및 LDM 의동의어입니다. 중첩하위루틴에대해레지스터스택 스택연산은하위루틴진입과종료에유용합니다. 하위루틴진입시에필요한작업레지스터는스택에저장되고종료시에다시팝될수있습니다. 또한진입시링크레지스터를스택으로푸시하면복귀주소가손실되지않고추가하위루틴호출을안전하게수행할수있습니다. 이렇게하면종료시스택에서 pc 를팝하고해당값을 pc 로이동하여하위루틴에서복귀할수있습니다. 예를들면다음과같습니다. subroutine PUSH ; code BL ; code POP {r5-r7,lr} ; Push work registers and lr somewhere_else {r5-r7,pc} ; Pop work registers and pc 참고혼합 ARM 및 Thumb 시스템에서는이명령어를주의하여사용해야합니다. ARMv4T 시스템에서 pc 로직접팝하여상태를변경할수없습니다. 이경우주소를임시레지스터로팝하고 BX 명령어를사용해야합니다. ARMv5T 이상에서는이방법으로상태를변경할수있습니다. ARM 과 Thumb 을함께사용하는데대한자세한내용은 RealView Compilation Tools 개발자설명서에서 4 장 ARM 과 Thumb 의인터워킹을참조하십시오. 2-48 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.7.3 LDM 및 STM 을통한블록복사 예제 2-8 은한번에하나의워드를복사하여소스위치에서대상으로워드세트를복사하는 ARM 코드루틴입니다. 이예제는주예제디렉토리인 install_directory\rvds\examples 에 word.s 로제공되어있습니다. 이예제를어셈블, 링크및실행하는방법에대한자세한내용은 2-2 페이지의코드예제를참조하십시오. 예제 2-8 LDM 및 STM 을사용하지않는블록복사 AREA Word, CODE, READONLY ; name this block of code num EQU 20 ; set number of words to be copied ENTRY ; mark the first instruction called start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy wordcopy LDR r3, [r0], #4 ; load a word from the source and STR r3, [r1], #4 ; store it to the destination SUBS r2, r2, #1 ; decrement the counter BNE wordcopy ;... copy more stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END 이모듈은가능한한많은복사본을만들기위해 LDM 및 STM 을사용하여보다효율적으로만들수있습니다. ARM 에있는레지스터의수를고려하면한번에여덟개의워드를전송하는것이좋습니다. 복사할블록에서 8 워드배수는다음을사용하여찾을수있습니다 (r2 = 복사할워드수 ). MOVS r3, r2, LSR #3 ; number of eight word multiples 이값은이터레이션당여덟개의워드를복사하는루프를통해이터레이션수를제어하는데사용할수있습니다. 여덟개미만의워드가남아있으면 r2 가손상되지않았다는가정하에다음을사용하여남은워드수를찾을수있습니다. ANDS r2, r2, #7 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-49

ARM 어셈블리언어작성 2-50 페이지의예제 2-9 에서는복사에 LDM 및 STM 을사용하도록재작성된블록복사모듈을나열합니다. 예제 2-9 LDM 및 STM 을사용한블록복사 AREA Block, CODE, READONLY ; name this block of code num EQU 20 ; set number of words to be copied ENTRY ; mark the first instruction called start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy MOV sp, #0x400 ; Set up stack pointer (r13) blockcopy MOVS r3,r2, LSR #3 ; Number of eight word multiples BEQ copywords ; Less than eight words to move? PUSH {r4-r11} ; Save some working registers octcopy LDM r0!, {r4-r11} ; Load 8 words from the source STM r1!, {r4-r11} ; and put them at the destination SUBS r3, r3, #1 ; Decrement the counter BNE octcopy ;... copy more POP {r4-r11} ; Don't need these now - restore ; originals copywords ANDS r2, r2, #7 ; Number of odd words to copy BEQ stop ; No words left to copy? wordcopy LDR r3, [r0], #4 ; Load a word from the source and STR r3, [r1], #4 ; store it to the destination SUBS r2, r2, #1 ; Decrement the counter BNE wordcopy ;... copy more stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; ARM semihosting (formerly SWI) AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END 2-50 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.8 매크로사용 매크로정의는 MACRO 및 MEND 지시문으로묶인코드블록입니다. 매크로정의는전체코드블록을반복하는대신사용할수있는이름을정의합니다. 매크로는주로다음과같은목적으로사용됩니다. 코드블록을하나의의미있는이름으로바꿔서더간편하게소스코드의논리를따를수있도록합니다. 코드블록을여러번반복하지않도록합니다. 자세한내용은 7-33 페이지의 MACRO 및 MEND 를참조하십시오. 이단원에서는다음내용을설명합니다. 2-52페이지의테스트및분기매크로예제 2-52 페이지의부호없는정수나누기매크로예제 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-51

ARM 어셈블리언어작성 2.8.1 테스트및분기매크로예제 ARM 코드및 Thumb-2 가없는프로세서의 Thumb 에서테스트및분기연산에는두개의 ARM 명령어를구현해야합니다. 다음과같이매크로정의를정의할수있습니다. MACRO $label TestAndBranch $dest, $reg, $cc $label CMP $reg, #0 B$cc $dest MEND MACRO 지시문다음의행은매크로프로토타입문입니다. 이문은매크로호출에사용할이름 (TestAndBranch) 을정의합니다. 또한매개변수 ($label, $dest, $reg 및 $cc) 를정의합니다. 지정되지않은매개변수는빈문자열로대체됩니다. 이매크로의경우구문오류를방지하려면 $dest, $reg 및 $cc 에값을제공해야합니다. 어셈블러에서는제공된값을코드로대체합니다. 이매크로는다음과같이호출할수있습니다. test TestAndBranch NonZero, r0, NE...... NonZero 대체후에는다음과같이됩니다. test CMP r0, #0 BNE NonZero...... NonZero 2.8.2 부호없는정수나누기매크로예제 2-53 페이지의예제 2-10 에서는부호없는정수나누기를수행하는매크로를보여줍니다. 네개의매개변수를사용합니다. $Bot $Top $Div 제수가들어있는레지스터 명령어가실행되기전피제수가들어있는레지스터로, 명령어가실행된후에는나머지를포함합니다. 나누기의몫이배치되는레지스터로, 나머지만필요한경우에는 NULL("") 일수있습니다. 2-52 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 $Temp 계산하는동안사용되는임시레지스터 예제 2-10 MACRO $Lab DivMod $Div,$Top,$Bot,$Temp ASSERT $Top <> $Bot ; Produce an error message if the ASSERT $Top <> $Temp ; registers supplied are ASSERT $Bot <> $Temp ; not all different IF "$Div" <> "" ASSERT $Div <> $Top ; These three only matter if $Div ASSERT $Div <> $Bot ; is not null ("") ASSERT $Div <> $Temp ; ENDIF $Lab MOV $Temp, $Bot ; Put divisor in $Temp CMP $Temp, $Top, LSR #1 ; double it until 90 MOVLS $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top CMP $Temp, $Top, LSR #1 BLS %b90 ; The b means search backwards IF "$Div" <> "" ; Omit next instruction if $Div is null MOV $Div, #0 ; Initialize quotient ENDIF 91 CMP $Top, $Temp ; Can we subtract $Temp? SUBCS $Top, $Top,$Temp ; If we can, do so IF "$Div" <> "" ; Omit next instruction if $Div is null ADC $Div, $Div, $Div ; Double $Div ENDIF MOV $Temp, $Temp, LSR #1 ; Halve $Temp, CMP $Temp, $Bot ; and loop until BHS %b91 ; less than divisor MEND 매크로에서는두개의매개변수가동일한레지스터를사용하는지확인합니다. 또한나머지만필요한경우생성된코드를최적화합니다. 어셈블러소스에서둘이상의 DivMod 가사용되는경우여러개의레이블정의를방지하기위해매크로에서는지역레이블 (90, 91) 을사용합니다. 자세한내용은 2-14 페이지의지역레이블을참조하십시오. 2-54 페이지의예제 2-11 에서는이매크로를다음과같이호출할경우생성되는코드를보여줍니다. ratio DivMod r0,r5,r4,r2 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-53

ARM 어셈블리언어작성 예제 2-11 ASSERT r5 <> r4 ; Produce an error if the ASSERT r5 <> r2 ; registers supplied are ASSERT r4 <> r2 ; not all different ASSERT r0 <> r5 ; These three only matter if $Div ASSERT r0 <> r4 ; is not null ("") ASSERT r0 <> r2 ; ratio MOV r2, r4 ; Put divisor in $Temp CMP r2, r5, LSR #1 ; double it until 90 MOVLS r2, r2, LSL #1 ; 2 * r2 > r5 CMP r2, r5, LSR #1 BLS %b90 ; The b means search backwards MOV r0, #0 ; Initialize quotient 91 CMP r5, r2 ; Can we subtract r2? SUBCS r5, r5, r2 ; If we can, do so ADC r0, r0, r0 ; Double r0 MOV r2, r2, LSR #1 ; Halve r2, CMP r2, r4 ; and loop until BHS %b91 ; less than divisor 2-54 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.9 심볼버전추가 ARM 링커는 Base Platform ABI for the ARM Architecture[BPABI] 를준수하고 GNU 확장심볼버전관리모델을지원합니다. 기존심볼에심볼버전을추가하려면동일한주소에서버전심볼을정의해야합니다. 버전심볼의형식은다음과같습니다. name의기본버전이아닌 ver의경우, name@ver name 의기본 ver 의경우, name@@ver 버전심볼은세로막대로묶어야합니다. 예를들어기본버전을정의하려면다음명령어를실행합니다. my_versioned_symbol@@ver2 my_asm_function PROC... BX lr ENDP ; Default version 기본버전이외의버전을정의하려면다음명령어를실행합니다. my_versioned_symbol@ver1 ; Non default version my_old_asm_function PROC... BX lr ENDP RVCT 의심볼관리에대한자세한내용은 RealView Compilation Tools 링커및유틸리티설명서에서 4 장이미지심볼액세스를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-55

ARM 어셈블리언어작성 2.10 프레임지시문사용 다음중하나를수행하려는경우코드에서스택을사용하는방법을정의하려면프레임지시문을사용해야합니다. 스택해제를사용하여응용프로그램디버그 플랫또는콜그래프프로파일링사용 이러한지시문에대한자세한내용은 7-41 페이지의프레임지시문을참조하십시오. 어셈블러에서는프레임지시문을사용하여 DWARF 디버그프레임정보를개체파일에생성되는 ELF 형식으로삽입합니다. 이정보는디버거에서스택해제및프로파일링을위해필요합니다. 스택검사한정자에대한자세한내용은 install_directory\documentation\specifications\... 에있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을참조하십시오. 다음사항에유의하십시오. 프레임지시문은어셈블러에서생성한코드에영향을주지않습니다. 어셈블러에서는프레임지시문의정보를내보낸명령어에대해확인하지않습니다. 2-56 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 어셈블리언어작성 2.11 어셈블리언어변경사항 표 2-10 에서는최신 ARM/Thumb 어셈블러언어와이전의개별 ARM 및 Thumb 어셈블러언어간의기본차이점을보여줍니다. 어셈블러에서는이전 ARM 구문이허용됩니다. 표 2-10 이전 ARM 어셈블리언어의변경사항 변경내용이전 ARM 구문기본구문 LDM 및 STM 의기본주소지정모드는 IA 입니다. LDMIA, STMIA LDM, STM ARM 및 Thumb 에서전체내림차순스택연산에대해 PUSH 및 POP 니모닉을사용할수있습니다. ARM 및 Thumb 에서는다른연산을제외하고회전만포함된명령어에대해 LSL, LSR, ASR, ROR 및 RRX 명령어니모닉을사용할수있습니다. PC 상대주소지정에는 label 형식을사용합니다. 새코드에서 offset 형식을사용하면안됩니다. 더블워드메모리액세스에대해두레지스터를모두지정합니다. 사용할수있는레지스터조합에대한규칙을따라야합니다. {cond}, 사용될경우항상모든명령어의마지막요소입니다. ARM 및 Thumb-2 코드모두에서 ARM {cond} 조건부형식및 Thumb-2 IT 명령어를모두사용할수있습니다. 어셈블러에서는두코드의일관성을확인하고해당코드를현재명령어세트에따라어셈블합니다. STMFD sp!, {reglist} LDMFD sp!, {reglist} MOV Rd, Rn, LSL shift MOV Rd, Rn, LSR shift MOV Rd, Rn, ASR shift MOV Rd, Rn, ROR shift MOV Rd, Rn, RRX LDR Rd, [pc, #offset] LDRD Rd, addr_mode ADD{cond}S LDR{cond}SB ADDEQ r1, r2, r3 LDRNE r1, [r2, r3] PUSH {reglist} POP {reglist} LSL Rd, Rn, shift LSR Rd, Rn, shift ASR Rd, Rn, shift ROR Rd, Rn, shift RRX Rd, Rn LDR Rd, label LDRD Rd, Rd2, addr_mode ADDS{cond} LDRSB{cond} ITEQ E ADDEQ r1, r2, r3 LDRNE r1, [r2, r3] 또한이전어셈블러에서허용되지않은일부융통성이허용됩니다 ( 표 2-11 참조 ). 완화기본구문허용구문 표 2-11 필요조건완화 대상레지스터가첫번째연산과동일할경우명령어의 2 레지스터형식을사용할수있습니다. ADD r1, r1, r3 ADD r1, r3 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 2-57

ARM 어셈블리언어작성 ARM/Thumb 어셈블리언어를사용하여 Thumb 프로세서에대한소스코드를작성할수있습니다. Thumb-2 이전프로세서에대한 Thumb 코드를작성할경우프로세서에서사용할수있는명령어로제한해야합니다. 사용할수없는명령어를사용하려고하면어셈블러에서는오류메시지를생성합니다. Thumb-2 프로세서에대한 Thumb 코드를작성할경우가능한여러위치에 16 비트명령어를사용하여코드크기를최소화할수있습니다. 표 2-12 에서는 Thumb 어셈블리언어와 ARM 어셈블리언어간의기본차이점을보여줍니다. 어셈블러에서는 CODE16 지시문보다먼저사용되거나소스파일이 --16 명령행옵션으로어셈블된경우에만이전 Thumb 구문을허용합니다. 표 2-12 이전 Thumb 구문과현재구문간의차이점 변경내용이전 Thumb 구문새구문 LDM 및 STM 의기본주소지정모드는 IA 입니다. LDMIA, STMIA LDM, STM 플래그를업데이트하는명령어에는 S 접미사를사용해야합니다. 이변경사항은 32 비트 Thumb-2 명령어와의충돌을방지하는데필수적입니다. ALU 명령어의기본형식은대상레지스터가첫번째피연산자와동일한경우에도세개의레지스터를지정합니다. Rd 및 Rn 이둘다 Lo 레지스터이면 MOV Rd, Rn 은 ADDS Rd, Rn, #0 으로디스어셈블됩니다. ADD r1, r2, r3 SUB r4, r5, #6 MOV r0, #1 LSR r1, r2, #1 ADD r7, r8 SUB r1, #80 MOV r2, r3 MOV r8, r9 CPY r0, r1 LSL r2, r3, #0 ADDS r1, r2, r3 SUBS r4, r5, #6 MOVS r0, #1 LSRS r1, r2, #1 ADD r7, r7, r8 SUBS r1, r1, #80 ADDS r2, r3, #0 MOV r8, r9 MOV r0, r1 MOVS r2, r3 NEG Rd, Rm 는 RSBS Rd, Rm, #0 으로디스어셈블됩니다. NEG Rd, Rm RSBS Rd, Rm, #0 NOP 명령어는가능한경우 MOV r8, r8 을바꿉니다. - NOP NOP MOV r8, r8 2-58 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

3 장어셈블러참조 이장에서는 ARM 어셈블러에대한일반적인참조자료를제공합니다. 여기에는다음단원이포함되어있습니다. 3-2페이지의명령구문 3-20 페이지의소스행형식 3-21 페이지의미리정의된레지스터및보조프로세서이름 3-23 페이지의기본제공변수및상수 3-25 페이지의심볼 3-31 페이지의식, 리터럴및연산자 3-44 페이지의진단메시지 3-46 페이지의 C 사전처리기사용 이장에서는 ARM 어셈블리언어를작성하는방법에대해설명하지않습니다. 자습정보를보려면 2 장 ARM 어셈블리언어작성을참조하십시오. 이장에서는명령어, 지시문또는의사명령어에대해서도설명하지않습니다. 이러한항목에대한참조정보는개별장을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-1

어셈블러참조 3.1 명령구문 이단원에서는 armasm 과관련된정보만다룹니다. 인라인어셈블러는 C 및 C++ 컴파일러의일부로, 고유한명령구문을갖고있지않습니다. armasm 명령행은파일이름에서만대소문자를구분하고달리지정하지않는한대소문자를구분하지않습니다. 다음명령을사용하여 ARM 어셈블러를호출합니다. armasm {options} {inputfile} 여기서 options 자리에는다음과같은옵션을공백으로구분하여조합할수있습니다. --16 이전 Thumb 구문을사용하여명령어를 Thumb 명령어로해석하도록어셈블러에지시합니다. 이명령어는소스파일헤드에있는 CODE16 지시문과같습니다. --thumb 옵션을사용하면새구문을통해 Thumb 또는 Thumb-2 명령어를지정할수있습니다. --32 명령어를 ARM 명령어로해석하도록어셈블러에지시합니다. 이것이기본값입니다. --apcs [qualifiers] AAPCS(Procedure Call Standard for the ARM Architecture) 를사용할지여부를지정합니다. 또한코드섹션의일부특성을지정할수있습니다. 자세한내용은 3-9 페이지의 AAPCS 를참조하십시오. --arm --32 의동의어입니다. --bigend 빅엔디안 ARM 에적합한코드를어셈블하도록어셈블러에지시합니다. 기본값은 --littleend 입니다. --brief_diagnostics 자세한내용은 3-16 페이지의진단메시지의출력제어를참조하십시오. --littleend 리틀엔디안 ARM 에적합한코드를어셈블하도록어셈블러에지시합니다. 3-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 --checkreglist RLIST, LDM 및 STM 레지스터목록을확인하여모든레지스터번호가오름차순으로나열되도록어셈블러에지시합니다. 레지스터가순서대로나열되지않으면경고가표시됩니다. 이옵션은향후제공되지않을예정이며이후릴리스에서제거되므로대신 --diag_warning 1206을사용하십시오 (3-16페이지의진단메시지의출력제어참조 ). --cpu name 타겟 CPU 를설정합니다. 자세한내용은 3-11 페이지의 CPU 이름을참조하십시오. --debug DWARF 디버그테이블을생성하도록어셈블러에지시합니다. --debug는 -g의동의어입니다. 기본값은 DWARF 3입니다. 참고 지역심볼은 --debug 를통해유지되지않습니다. 디버깅에유용하도록지역심볼을유지하려면 --keep 을지정해야합니다. --depend dependfile --depend_format=string 소스파일종속목록을 dependfile 에저장하도록어셈블러에지시합니다. 이러한목록은 make 유틸리티에사용하기에적합합니다. 출력종속파일의형식을일부유닉스 make 프로그램과호환될수있도록유닉스스타일형식으로변경합니다. string 의값은다음중하나일수있습니다. unix 유닉스스타일경로구분기호를사용하여종속파일을생성합니다. unix_escaped unix와같지만백슬래시로공백을 escape합니다. unix_quoted unix와같지만경로이름을큰따옴표로묶습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-3

어셈블러참조 --diag_[error remark warning suppress style] --dllexport_all 자세한내용은 3-16 페이지의진단메시지의출력제어를참조하십시오. 달리지정하지않는한모든전역심볼을동적으로표시하도록어셈블리에지시합니다. 이옵션은 DLL 을빌드할때사용합니다. --dwarf2 --dwarf3 --debug 와함께사용하여 DWARF 2 디버그테이블을생성하도록어셈블러에지시합니다. --debug 와함께사용하여 DWARF 3 디버그테이블을생성하도록어셈블러에지시합니다. --debug 를지정한경우이옵션이기본옵션입니다. --errors errorfile 오류메시지를 errorfile 에출력하도록어셈블러에지시합니다. --exceptions 자세한내용은 3-18 페이지의예외테이블생성제어를참조하십시오. --exceptions_unwind --fpmode model - - fpu name 자세한내용은 3-18 페이지의예외테이블생성제어를참조하십시오. 부동소수점규칙을지정하고라이브러리특성및부동소수점최적화를설정합니다. 자세한내용은 3-10 페이지의부동소수점모델을참조하십시오. 타겟 FPU( 부동소수점단위 ) 아키텍처를선택합니다. 자세한내용은 3-12 페이지의 FPU 이름을참조하십시오. - g --debug 의동의어입니다. - i{dir} [,dir] 정규화할소스파일에디렉토리를추가합니다 (7-79 페이지의 GET 또는 INCLUDE 참조 ). 3-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 --keep 디버거에서사용할수있도록개체파일의심볼테이블에지역레이블을유지하도록어셈블러에지시합니다 (7-83 페이지의 KEEP 참조 ). --length 자세한내용은 3-14 페이지의파일에출력나열을참조하십시오. --library_type=lib 링크시에선택한관련라이브러리를사용합니다. 여기서 lib 는다음중하나일수있습니다. standardlib microlib 링크시전체 RVCT 런타임라이브러리가선택되도록지정합니다. 이것이기본값입니다. 링크시 C 마이크로라이브러리 (microlib) 가선택되도록지정합니다. 참고 라이브러리를사용하려면더욱특수화된최적화가필요한경우컴파일러, 어셈블러또는링커에서이옵션을사용할수있습니다. 링커에서이옵션을사용하여다른모든 --library_type 옵션을재정의합니다. 자세한내용은다음항목을참조하십시오. Libraries Guide의 3-4페이지의 microlib로응용프로그램빌드 2-57 페이지의 --library_type=lib 의 RealView Compilation Tools Compiler Reference Guide. --list file 어셈블러에의해생성된자세한어셈블리언어목록을 file 에출력하도록어셈블러에지시합니다. 자세한내용은 3-14 페이지의파일에출력나열을참조하십시오. -m 소스파일종속목록을 stdout 에작성하도록어셈블러에지시합니다. --maxcache n 최대소스캐시크기를 n 바이트로설정합니다. 기본값은 8MB 입니다. 크기가 8MB 보다작으면 armasm 에서경고를표시합니다. --md 소스파일종속목록을 inputfile.d 에저장하도록어셈블러에지시합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-5

어셈블러참조 --memaccess attributes 타겟메모리시스템의메모리액세스특성을지정합니다. 자세한내용은 3-13 페이지의메모리액세스특성을참조하십시오. 참고 --memaccess 옵션은향후제공되지않을예정이며이후릴리스에서제거됩니다. --no_code_gen 패스 1 후종료하도록어셈블러에지시합니다. 개체파일이생성되지않습니다. --no_esc \n 및 \t 와같은 C 스타일이스케이프특수문자를무시하도록어셈블러에지시합니다. --no_exceptions --no_exceptions_unwind --no_hide_all 자세한내용은 3-18 페이지의예외테이블생성제어를참조하십시오. 자세한내용은 3-18 페이지의예외테이블생성제어를참조하십시오. SVr4 공유개체를빌드할때심볼표시유형을제어할수있습니다. 내보낸모든정의와참조는동적으로표시됩니다 (7-76 페이지의 EXPORT 또는 GLOBAL 참조 ). --no_regs 레지스터이름을미리정의하지않도록어셈블러에지시합니다. 미리정의된레지스터이름목록을보려면 3-21 페이지의미리정의된레지스터및보조프로세서이름을참조하십시오. 이옵션은향후제공되지않을예정이며이후릴리스에서제거되므로대신 --regnames=none 을사용하십시오. --no_terse 자세한내용은 3-14 페이지의파일에출력나열을참조하십시오. --no_unaligned_access 정렬되지않은액세스가사용되지않음을나타내는개체파일의특성을설정하도록어셈블러에지시합니다. 3-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 --no_warn 경고메시지를해제합니다. -o filename 출력개체파일의이름을지정합니다. 이옵션을지정하지않으면어셈블러에서 inputfilename.o 형식의개체파일이름을만듭니다. --predefine "directive" SET 지시문중하나를미리실행하도록어셈블러에지시합니다. 자세한내용은 3-13 페이지의 SET 지시문사전실행을참조하십시오. --[no_]reduce_paths 파일경로에서중복경로이름정보를제거하거나제거하지않습니다. 이옵션은 Windows 시스템에만유효합니다. Windows 시스템에서는파일경로에 260자제한이있습니다. 절대이름이 260자넘게확장되는상대경로이름이있는경우 --reduce_paths 옵션을사용하여디렉토리를해당인스턴스와일치시키고 directory/.. 시퀀스를쌍에서제거하여절대경로이름길이를줄일수있습니다. 참고 --reduce_paths 옵션을사용하여경로길이를최소화하는것보다중첩수준이높은긴파일경로를사용하지않는것이좋습니다. 자세한내용은 RealView Compilation Tools Compiler Reference Guide 에서 2-81 페이지의 --[no_]reduce_paths 를참조하십시오. --regnames=none 레지스터이름을미리정의하지않도록어셈블러에지시합니다. 미리정의된레지스터이름목록을보려면 3-21 페이지의미리정의된레지스터및보조프로세서이름을참조하십시오. --regnames=callstd --regnames=all --apcs 옵션을사용하여지정하는 AAPCS 변형을기반으로추가레지스터이름을정의합니다. 자세한내용은 3-9 페이지의 AAPCS 를참조하십시오. --apcs 값에관계없이모든 AAPCS 레지스터를정의합니다. 자세한내용은 3-9 페이지의 AAPCS 를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-7

어셈블러참조 --show_cmdline 어셈블러에서명령행이처리된방법을보여줍니다. 명령은표준화된상태로표시되고 via 파일의내용은확장됩니다. --split_ldm --thumb 긴 LDM 및 STM 명령어에대해오류를생성하도록어셈블러에지시합니다. 자세한내용은 3-14 페이지의긴 LDM 및 STM 분할을참조하십시오. 이옵션은향후사용할수없습니다. ARM 구문을사용하여명령어를 Thumb 명령어로해석하도록어셈블러에지시합니다. 이옵션은소스파일헤드에있는 THUMB 지시문과같습니다. --unaligned_access 정렬되지않은액세스의사용을나타내는개체파일의특성을설정하도록어셈블러에지시합니다. --unsafe 다양한아키텍처의명령어를오류없이어셈블할수있습니다. 자세한내용은 3-16 페이지의진단메시지의출력제어를참조하십시오. --untyped_local_labels Thumb 코드의레이블을참조할경우 Thumb 비트를설정하지않도록어셈블러에지시합니다. 자세한내용은 4-157 페이지의 LDR 의사명령어를참조하십시오. --via file file 을열고어셈블러에대한명령행인수를읽도록어셈블러에지시합니다. 자세한내용은 RealView Compilation Tools Compiler Reference Guide 에서부록 A via 파일구문을참조하십시오. --width 자세한내용은 3-14 페이지의파일에출력나열를참조하십시오. --xref 자세한내용은 3-14 페이지의파일에출력나열을참조하십시오. inputfile 어셈블러의입력파일을지정합니다. 입력파일은 ARM 또는 Thumb 어셈블리언어소스파일이어야합니다. 3.1.1 사용가능한옵션목록보기 사용가능한어셈블러명령행옵션에대한요약을보려면다음명령을입력합니다. armasm --help 3-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.1.2 환경변수를통한명령행옵션지정 RVCT31_ASMOPT 환경변수값을설정하여명령행옵션을지정할수있습니다. 이구문은명령행구문과동일합니다. 어셈블러에서는 RVCT31_ASMOPT 의값을읽고명령문자열의맨앞에삽입합니다. 이는 RVCT31_ASMOPT 에지정된옵션을명령행의인수로재정의할수있음을의미합니다. 3.1.3 AAPCS AAPCS(Procedure Call Standard for the ARM Architecture) 는 BSABI(ABI( 응용프로그램바이너리인터페이스 ) for the ARM Architecture( 기본표준 )) 사양에포함되어있습니다. AAPCS 를준수하는코드를작성하여별도로컴파일되고어셈블된모듈을함께사용할수있습니다. --apcs 옵션은 AAPCS 를사용할지여부를지정합니다. 또한코드섹션의일부특성을지정할수있습니다. 자세한내용은 install_directory\documentation\specifications\... 에있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을참조하십시오. 참고 AAPCS 한정자는어셈블러에서생성한코드에영향을주지않습니다. 이한정자는 inputfile 의코드가 AAPCS 의특정변수로컴파일되는프로그래머의어설션입니다. 이한정자를통해어셈블러에서생성한개체파일에서특성이설정됩니다. 링커에서는이러한특성을사용하여파일확장성을확인하고적절한라이브러리변형을선택합니다. qualifier 의값은다음과같습니다. none /interwork /nointerwork /ropi inputfile 이 AAPCS 를사용하지않음을지정합니다. AAPCS 레지스터는설정되지않습니다. none 을사용하면다른한정자를사용할수없습니다. inputfile 의코드가 ARM/Thumb 인터워킹에적합함을지정합니다. 자세한내용은 RealView Compilation Tools 개발자설명서에서 4 장 ARM 과 Thumb 의인터워킹을참조하십시오. inputfile 의코드가 ARM/Thumb 인터워킹에적합하지않음을지정합니다. 이것이기본값입니다. inputfile 의내용이읽기전용위치독립적코드임을지정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-9

어셈블러참조 /noropi inputfile 의내용이읽기전용위치독립적이지않은코드임을지정합니다. 이것이기본값입니다. /pic /ropi 의동의어입니다. /nopic /noropi 의동의어입니다. /rwpi /norwpi inputfile 의내용이읽기 / 쓰기위치독립적코드임을지정합니다. inputfile 의내용이읽기 / 쓰기위치독립적이지않은코드임을지정합니다. 이것이기본값입니다. /pid /rwpi 의동의어입니다. /nopid /norwpi 의동의어입니다. /fpic inputfile 의내용이 FPIC 주소지정을필요로하는읽기전용위치독립적코드임을지정합니다. 3.1.4 부동소수점모델 다음은부동소수점모델을지정하는옵션입니다. --fpmode model 타겟부동소수점모델을선택하고링크할때가장적합한라이브러리를선택하는특성을설정합니다. 참고이옵션은작성한코드를변경하지않습니다. model 은다음중하나일수있습니다. ieee_full ieee_fixed IEEE 표준이보장하는모든기능, 작업및표현이단정밀도와배정밀도로제공됩니다. 런타임에작동모드를동적으로선택할수있습니다. 가장가까운수로반올림되며부정확한예외가발생하지않는 IEEE 표준입니다. ieee_no_fenv 가장가까운수로반올림되며예외가발생하지않는 IEEE 표준입니다. 이모드는 Java 부동소수점산술모델과호환됩니다. 3-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 std 0으로플러시되는 IEEE 유한값으로, 가장가까운수로반올림되며예외가발생하지않습니다. 이값은 C 및 C++ 와호환됩니다. 기본옵션입니다. 유한값은 IEEE 표준에서예측한값입니다. IEEE 모델에서정의한일부환경에서는 NaN과무한값이생성되지않을수있으며, 생성된다고해도동일한부호를갖지않을수있습니다. 또한 0의부호가 IEEE 모델에서예측하는것과다를수있습니다. fast 속도가향상되는대신정확도가떨어지도록최적화를변경합니다. 이옵션은 IEEE 와호환되지않으며표준 C 가아닙니다. 3.1.5 CPU 이름 다음은 CPU 이름을지정하는옵션입니다. --cpu name 타겟 CPU 를설정합니다. 일부명령어는잘못된타겟 CPU 에대해어셈블될경우오류또는경고를생성합니다 (3-16 페이지의진단메시지의출력제어참조 ). name 의유효한값은 4T, 5TE 또는 6T2 와같은아키텍처이름이거나 ARM7TDMI 와같은부품번호입니다. 아키텍처에대한자세한내용은 ARM 아키텍처참조문서를참조하십시오. 기본값은 ARM7TDMI 입니다. 링크타임에소프트웨어라이브러리선택이주는영향에대한자세한내용은 RealView Compilation Tools 링커및유틸리티설명서를참조하십시오. 유효한 CPU 이름목록보기 다음명령을통해어셈블러를호출하면유효한 CPU 및아키텍처이름목록을볼수있습니다. armasm --cpu list ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-11

어셈블러참조 3.1.6 FPU 이름 다음은 FPU 이름을지정하는옵션입니다. --fpu name 타겟 FPU( 부동소수점단위 ) 아키텍처를선택합니다. 이옵션을지정하면 --cpu 옵션으로설정된암시적 FPU에우선합니다. 부동소수점명령어는잘못된타겟 FPU에대해어셈블될경우오류또는경고를생성합니다. 어셈블러에서는개체파일의 name에해당하는빌드특성을설정합니다. 그러면링커에서이러한특성에따라개체파일간호환성을확인하고라이브러리를선택합니다. name 에사용할수있는값은다음과같습니다. none vfpv3 vfpv2 softvfp softvfp+vfpv2 softvfp+vfpv3 부동소수점아키텍처를선택하지않습니다. 그러면어셈블된개체파일이다른모든개체파일과호환됩니다. VFPv3 아키텍처를준수하는하드웨어벡터부동소수점단위를선택합니다. VFPv2 아키텍처를준수하는하드웨어벡터부동소수점단위를선택합니다. 소프트웨어부동소수점링키지를선택합니다. --fpu 옵션을지정하지않고선택된 --cpu 옵션에특정 FPU 가포함되어있지않은경우이옵션이기본옵션입니다. VFP 명령어를사용하는소프트웨어부동소수점링키지가있는부동소수점라이브러리를선택합니다. 이옵션은 --fpu vfpv2를사용하는것과같습니다. VFP 명령어를사용하는소프트웨어부동소수점링키지가있는부동소수점라이브러리를선택합니다. 이옵션은 --fpu vfpv3을사용하는것과같습니다. 링크타임에이러한값이소프트웨어라이브러리선택에주는영향에대한자세한내용은 RealView Compilation Tools 링커및유틸리티설명서를참조하십시오. 3-12 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 유효한 FPU 이름목록보기 다음명령을통해어셈블러를호출하면유효한 FPU 이름목록을볼수있습니다. armasm --fpu list 3.1.7 메모리액세스특성 타겟메모리시스템의메모리액세스특성을지정하려면다음을사용하십시오. --memaccess attributes 기본값은바이트, 하프워드및워드의정렬된로드및저장을활성화하는것입니다. attributes 는기본값을수정하며다음중하나일수있습니다. +L41 정렬되지않은 LDR 을활성화합니다. -L22 하프워드로드를활성화하지않습니다. -S22 하프워드저장을활성화하지않습니다. -L22-S22 하프워드로드및저장을활성화하지않습니다. 참고 --memaccess 옵션은향후제공되지않을예정이며이후릴리스에서제거됩니다. 3.1.8 SET 지시문사전실행 다음옵션을사용하여 SET 지시문중하나를미리실행하도록어셈블러에지시할수있습니다. --predefine "directive" directive 는따옴표로묶어야합니다. 자세한내용은 7-8 페이지의 SETA, SETL 및 SETS 를참조하십시오. 또한어셈블러에서는변수값을설정하기전에해당 GBLL, GBLS 또는 GBLA 지시문을실행하여변수를정의합니다. 변수이름은대소문자를구분합니다. 참고 directive에문자열을포함하려면시스템의명령행인터페이스에 \" 같은특수문자조합을입력해야합니다. 또는 --via file을사용하여 --predefine 인수를포함할수있습니다. 명령행인터페이스는 --via 파일의인수를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-13

어셈블러참조 3.1.9 긴 LDM 및 STM 분할 다음옵션을사용하여많은수의레지스터가있는 LDM 및 STM 명령어에대해오류를생성하도록어셈블러에지시합니다. --split_ldm 이옵션은다음과같은전송된레지스터의최대수가초과된경우 LDM 및 STM 명령어에대해오류를생성합니다. 모든 STM 및 PC를로드하지않는 LDM의경우, 5 PC를로드하는 LDM의경우, 4 많은수의레지스터를전송할수없도록하면다음과같은 ARM 시스템에서인터럽트대기시간을줄일수있습니다. 캐시또는작성버퍼가없는시스템 ( 예 : 캐시가없는 ARM7TDMI) 대기상태가 0인 32비트메모리를사용하는시스템 이외에도많은수의레지스터를전송할수없도록하면다음과같이됩니다. 코드크기가항상증가합니다. 캐시된시스템또는작성버퍼가있는프로세서의경우중요한이점이없습니다. 메모리대기상태가 0 이아닌시스템또는주변장치가느린시스템의경우이점이없습니다. 이런시스템의인터럽트대기시간은가장느린메모리또는주변장치액세스에필요한주기수에따라결정됩니다. 일반적으로이것은여러레지스터전송에의해삽입된대기시간보다훨씬큽니다. 3.1.10 파일에출력나열 출력을파일에나열하려면다음옵션을사용합니다. --list file 이옵션은어셈블러에서생성한자세한어셈블리언어목록을 file 에출력하도록해당어셈블러에지시합니다. - 을 file 로지정하면목록이 stdout 으로전송됩니다. file 을지정하지않을경우 --list= 을사용하여출력을 inputfile.lst 로보냅니다. 3-14 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 참고 파일이름없이 --list 를사용하여출력을 inputfile.lst 로보낼수있습니다. 그러나이구문은향후제공되지않을예정이므로이구문을사용하면어셈블러에서경고를표시합니다. 이구문은이후릴리스에서제거됩니다. 대신 --list= 를사용하십시오. --list 동작을제어하려면다음명령행옵션을사용합니다. --no_terse terse 플래그를해제합니다. 이옵션을설정하면조건부어셈블리로인해건너뛴행이목록에표시되지않습니다. terse 옵션을해제하면이러한행이목록에표시됩니다. 기본값은설정입니다. --width 목록페이지너비를설정합니다. 기본값은 79 자입니다. --length 목록페이지길이를설정합니다. 길이 0 은페이지번호가지정되지않은목록을나타냅니다. 기본값은 66 행입니다. --xref 심볼에대한상호참조정보를나열하도록어셈블러에지시합니다. 여기에는매크로내부와외부모두에서이러한심볼이사용되었거나정의된위치도포함됩니다. 기본값은해제입니다. 3.1.11 프로젝트템플릿옵션 프로젝트템플릿은특정구성에대한명령행옵션과같은프로젝트정보가포함된파일입니다. 이러한파일은프로젝트템플릿작업디렉토리에저장됩니다. 다음옵션을사용하여프로젝트템플릿의사용을제어할수있습니다. --[no_]project=[filename] --reinitialize_workdir --workdir=directory 프로젝트템플릿파일을사용하거나사용하지않습니다. 프로젝트템플릿작업디렉토리를다시초기화할수있습니다. 프로젝트템플릿의작업디렉토리를제공할수있습니다. 이러한각옵션에대한자세한내용은다음을참조하십시오. RealView Compilation Tools Compiler Reference Guide의 2-79페이지의 --[no_]project=filename RealView Compilation Tools Compiler Reference Guide의 2-82페이지의 --reinitialize_workdir ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-15

어셈블러참조 RealView Compilation Tools Compiler Reference Guide. 의 2-101 페이지의 --workdir=directory 3.1.12 진단메시지의출력제어 다음은진단메시지의출력을제어하는다양한옵션입니다. --brief_diagnostics 더간단한형식의진단출력이사용되는모드를사용하거나사용하지않습니다. 이옵션을지정하면원래소스행이표시되지않고오류메시지텍스트가너무길어한행에맞지않아도다음행으로이어지지않습니다. 기본값은 --no_brief_diagnostics 입니다. --diag_style {arm ide gnu} 진단메시지를표시하는데사용되는스타일을지정합니다. arm ARM 어셈블러스타일을사용하여메시지를표시합니다. --diag_style 을지정하지않은경우이옵션이기본옵션입니다. ide 오류가발생한행의행번호및문자수를포함합니다. 이값은괄호안에표시됩니다. gnu GNU 스타일을사용하여메시지를표시합니다. 옵션 --diag_style=ide을선택하면암시적으로 --brief_diagnostics 옵션이선택됩니다. 명령행에서명시적으로 --no_brief_diagnostics 를선택하면 --diag_style=ide에의해암시적으로선택된 --brief_diagnostics가무시됩니다. --diag_style=arm 옵션이나 --diag_style=gnu 옵션의선택은 --brief_diagnostics 선택을의미하지않습니다. --diag_error tag[, tag,...] 지정된태그가있는진단메시지를오류심각도로설정합니다 (3-17 페이지의표 3-1 참조 ). --diag_remark tag[, tag,...] 지정된태그가있는진단메시지를설명심각도로설정합니다 (3-17 페이지의표 3-1 참조 ). 3-16 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 --diag_warning tag[, tag,...] 지정된태그가있는진단메시지를경고심각도로설정합니다 (3-17 페이지의표 3-1 참조 ). --diag_suppress tag[, tag,...] 지정된태그가있는진단메시지를표시하지않습니다. --unsafe 다양한아키텍처의명령어를오류없이어셈블할수있습니다. 해당오류메시지를경고메시지로변경합니다. 또한연산자우선순위에대한경고를표시하지않습니다 (3-39 페이지의이진연산자참조 ). --diag_ 옵션이 4 이면표시되지않은메시지수를나타내는 tag 가있어야합니다. 둘이상의태그를지정할수있습니다. 예를들어숫자 1293 및 187 이있는경고메시지를표시하지않으려면다음명령을실행합니다. armasm --diag_suppress 1293,187... 어셈블러접두사 A 는 --diag_error, --diag_remark 및 --diag_warning 과함께사용하거나메시지를표시하지않을때사용할수있습니다. 예를들면다음과같습니다. armasm --diag_suppress A1293,A187... 진단메시지는잘라내어명령행에직접붙여넣을수있습니다. 접두사를사용하는것은선택사항입니다. 그러나접두사문자가포함될경우 armasm 식별문자와일치해야합니다. 다른접두사가있으면어셈블러에서는메시지번호를무시합니다. 표 3-1 에서는옵션설명에사용된심각도의의미에대해설명합니다. 표 3-1 진단메시지의심각도 심각도 치명적오류 설명 치명적오류는어셈블리가중지되는문제를나타냅니다. 이오류에는명령행오류, 내부오류및포함파일누락이포함됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-17

어셈블러참조 표 3-1 진단메시지의심각도 ( 계속 ) 심각도 설명 오류오류는어셈블리언어의구문또는의미규칙위반을나타냅니다. 어셈블리가계속되지만개체코드가생성되지않습니다. 경고 주의 경고는코드에서문제를나타낼수있는일반적이지않은상황을나타냅니다. 심각도가오류인문제가더발견되지않으면어셈블리가계속되고개체코드가생성됩니다. 주의는일반적이지만권장되지않는어셈블리언어사용을나타냅니다. 이러한진단은기본적으로생성되지않습니다. 심각도가오류인문제가더발견되지않으면어셈블리가계속되고개체코드가생성됩니다. 3.1.13 예외테이블생성제어 예외테이블생성을제어하는옵션에는다음과같은네가지가있습니다. --exceptions --no_exceptions --exceptions_unwind --no_exceptions_unwind 발견한모든함수에대해예외테이블생성을설정하도록어셈블러에지시합니다. 예외테이블생성을해제하도록어셈블러에지시합니다. 디버그테이블은생성되지않습니다. 이것이기본값입니다. 가능한경우함수에대해해제테이블을생성하도록어셈블러에지시합니다. 이것이기본값입니다. 모든함수에대해해제없음테이블을생성하도록어셈블러에지시합니다. 보다세밀하게제어하려는경우 FRAME UNWIND ON 및 FRAME UNWIND OFF 지시문을사용합니다 (7-54 페이지의 FRAME UNWIND ON 및 7-54 페이지의 FRAME UNWIND OFF 참조 ). 3-18 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 해제테이블 function 은 PROC/ENDP 또는 FUNC/ENDFUNC 지시문으로묶인코드입니다. 예외는해제테이블이포함된함수를통해전파될수있습니다. 어셈블러에서는디버그프레임정보에서해제정보를생성합니다. 예외는해제없음테이블이포함된함수를통해전파될수없습니다. 예외처리런타임환경에서는예외를처리하는동안해제없음테이블이발견되면프로그램을종료합니다. 어셈블러에서는모든함수및비함수에대해해제없음테이블엔트리를생성할수있습니다. 어셈블러에서는함수내의스택사용을설명하기에충분한 FRAME 지시문이함수에포함된경우함수에대해해제테이블을생성할수있습니다. 함수는 EHABI(ARM 아키텍처용예외처리 ABI), 섹션 9.1 사용제한에설명된조건을준수해야합니다. 어셈블러에서해제테이블을생성할수없는경우에는해제없음테이블을생성합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-19

어셈블러참조 3.2 소스행형식 ARM 어셈블리언어모듈에있는소스행의일반형식은다음과같습니다. {symbol} {instruction directive pseudo-instruction} {;comment} 소스행의세부분은모두선택적입니다. 명령어는첫번째열에서시작할수없습니다. 선행심볼이없는경우에도명령어앞에는공백이있어야합니다. 명령어, 의사명령어또는지시문은이설명서에서와마찬가지로모두대문자로작성할수있으며, 소문자로만작성할수도있습니다. 대소문자를함께사용하여명령어, 의사명령어또는지시문을작성하면안됩니다. 빈행을사용하여코드를읽기쉽게만들수있습니다. symbol 은대개레이블입니다 (3-28 페이지의레이블및 3-29 페이지의지역레이블참조 ). 명령어와의사명령어에서심볼은항상레이블이지만일부지시문에서는변수나상수의심볼입니다. 지시문설명을보면각경우를확실하게구별할수있습니다. symbol 은첫번째열에서시작해야하고공백이나탭과같은공백문자를포함할수없습니다 (3-25 페이지의심볼명명규칙참조 ). 3-20 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.3 미리정의된레지스터및보조프로세서이름 모든레지스터및보조프로세서이름은대소문자를구분합니다. 3.3.1 미리선언된레지스터이름다음레지스터이름이미리선언됩니다. r0-r15 및 R0-R15 a1 ~ a4( 인수, 결과또는스크래치레지스터, r0 ~ r3의동의어 ) v1 ~ v8( 변수레지스터, r4 ~ r11) sb 및 SB( 정적기준, r9) ip 및 IP( 내부프로시저호출스크래치레지스터, r12) sp 및 SP( 스택포인터, r13) lr 및 LR( 링크레지스터, r14) pc 및 PC( 프로그램카운터, r15) 3.3.2 미리선언된확장레지스터이름다음확장레지스터이름이미리선언됩니다. q0 ~ q15 및 Q0 ~ Q15(NEON 쿼드워드레지스터 ) d0 ~ d31 및 D0 ~ D31(NEON 더블워드레지스터, VFP 배정밀도레지스터 ) s0 ~ s31 및 S0 ~ S31(VFP 단정밀도레지스터 ) ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-21

어셈블러참조 3.3.3 미리선언된 XScale 레지스터이름 Intel XScale CPU용으로어셈블할때다음레지스터이름이미리선언됩니다. acc0 ~ acc7 및 ACC0 ~ ACC7(XScale 누산기 ) Wireless MMX가포함된 Intel XScale CPU용으로어셈블할때다음레지스터이름이미리선언됩니다. wr0-wr15, wr0-wr15 및 WR0-WR15 wc0-wc15, wc0-wc15 및 WC0-WC15 wcid, wcid 및 WCID wcon, wcon 및 WCON wcssf, wcssf 및 WCSSF wcasf, wcasf 및 WCASF 3.3.4 미리선언된보조프로세서이름다음보조프로세서이름과보조프로세서레지스터이름이미리선언됩니다. p0 ~ p15( 보조프로세서 0 ~ 15) c0 ~ c15( 보조프로세서레지스터 0 ~ 15) 3-22 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.4 기본제공변수및상수 표 3-2에서는 ARM 어셈블러에서정의한기본제공변수를보여줍니다. 표 3-2 기본제공변수 {ARCHITECTURE} 선택된 ARM 아키텍처이름을저장합니다. {AREANAME} 현재 AREA 이름을저장합니다. {ARMASM_VERSION} 각 armasm 버전과함께증가하는정수를저장합니다. ads$version {ARMASM_VERSION} 값과동일합니다. {CODESIZE} {CONFIG} 의동의어입니다. {COMMANDLINE} 명령행의내용을저장합니다. {CONFIG} {CPU} {ENDIAN} 어셈블러에서 ARM 코드를어셈블하면 32 값을갖고, Thumb 코드를어셈블하면 16 값을갖습니다. 선택된 cpu 이름을저장합니다. 기본값은 ARM7TDMI 입니다. 명령행 --cpu 옵션에아키텍처가지정되면 {CPU} 는 "Generic ARM" 값을저장합니다. 어셈블러가빅엔디안모드에있으면 bigbig- 값을갖고, 리틀엔디안모드에있으면 little 값을갖습니다. {FPIC} /fpic가설정되면 True 값을갖습니다. 기본값은 False입니다. {FPU} 선택된 fpu 이름을저장합니다. 기본값은 SoftVFP입니다. {INPUTFILE} 현재소스파일의이름을저장합니다. {INTER} /inter가설정되면 True 값을갖습니다. 기본값은 False입니다. {LINENUM} 현재소스파일의행번호를나타내는정수를저장합니다. {OPT} 현재설정된목록옵션의값입니다. OPT 지시문을사용하여현재목록옵션을저장하거나옵션내변경을지시하거나원래값을복원할수있습니다. {PC} 또는현재명령어의주소입니다. {PCSTOREOFFSET} STR pc,[...] 또는 STM Rb,{..., pc} 명령어의주소와저장된 pc 값간의오프셋입니다. 이값은지정된 CPU 나아키텍처에따라달라집니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-23

어셈블러참조 표 3-2 기본제공변수 ( 계속 ) {ROPI} /ropi 가설정되면 True 값을갖습니다. 기본값은 False 입니다. {RWPI} /rwpi 가설정되면 True 값을갖습니다. 기본값은 False 입니다. {VAR} 또는 @ 저장영역위치카운터의현재값입니다. 기본제공변수는 SETA, SETL 또는 SETS 지시문을사용하여설정할수없습니다. 기본제공변수는다음과같은식또는조건에서사용할수있습니다. IF {ARCHITECTURE} = "4T" ads$version 은모두소문자여야합니다. 기타기본제공변수는대문자나소문자로만작성하거나대소문자를함께사용하여작성할수있습니다. 기본제공변수 {ARMASM_VERSION} 을사용하여 armasm 버전을구분할수있습니다. ADS 이전 ARM 어셈블러에는기본제공변수 {ARMASM_VERSION} 이없습니다. 레거시개발도구용코드버전을빌드해야할경우기본제공변수 ads$version 을테스트할수있습니다. 다음과같은코드를사용합니다. IF :DEF: ads$version ; code for RVCT or ADS ELSE ; code for SDT ENDIF 표 3-3 에서는 ARM 어셈블러에서정의한기본제공부울상수를보여줍니다. 표 3-3 기본제공부울상수 {FALSE} 논리상수 false 입니다. {TRUE} 논리상수 true 입니다. 3-24 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.5 심볼 심볼을사용하여변수, 주소및숫자상수를나타낼수있습니다. 주소를나타내는심볼은레이블이라고도합니다. 다음을참조하십시오. 심볼명명규칙 3-26페이지의변수 3-26 페이지의숫자상수 3-27 페이지의변수의어셈블리타임대체 3-28 페이지의레이블 3-29 페이지의지역레이블 3.5.1 심볼명명규칙 심볼이름에는다음과같은일반규칙이적용됩니다. 심볼이름은해당범위내에서고유해야합니다. 심볼이름에는대문자, 소문자, 숫자상수또는밑줄문자를사용할수있습니다. 심볼이름은대소문자를구분하며심볼이름의모든문자가중요합니다. 지역레이블을제외하고심볼이름의첫문자로숫자문자를사용하면안됩니다 (3-29 페이지의지역레이블참조 ). 심볼은기본제공변수이름또는미리정의된심볼이름과같은이름을사용하면안됩니다 (3-21 페이지의미리정의된레지스터및보조프로세서이름및 3-23 페이지의기본제공변수및상수참조 ). 명령어니모닉이나지시문과같은이름을사용할경우다음과같이이중막대를사용하여심볼이름을구분합니다. 예를들면다음과같습니다. ASSERT 막대는심볼의일부가아닙니다. $a, $t, $t.x 또는 $d 심볼은프로그램레이블로사용하면안됩니다. 이러한심볼은개체파일내에서 ARM, Thumb, ThumbEE 및데이터를표시하는데사용되는매핑심볼입니다. 컴파일러로작업하는경우와같이심볼에다양한문자를사용해야할경우다음과같이단일막대를사용하여심볼이름을구분합니다. 예를들면다음과같습니다..text ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-25

어셈블러참조 막대는심볼의일부가아닙니다. 막대안에서는막대, 세미콜론또는새행을사용할수없습니다. 3.5.2 변수 변수값은어셈블리가수행될때변경될수있습니다. 변수유형에는다음세가지가있습니다. 숫자 논리 문자열 변수유형은변경할수없습니다. 숫자변수의가능한값범위는숫자상수나숫자식의가능한값범위와동일합니다 ( 숫자상수및 3-32 페이지의숫자식참조 ). 논리변수에사용할수있는값은 {TRUE} 또는 {FALSE} 입니다 (3-35 페이지의논리식참조 ). 문자열변수에사용할수있는값범위는문자열식의값범위와동일합니다 (3-31 페이지의문자열식참조 ). GBLA, GBLL, GBLS, LCLA, LCLL 및 LCLS 지시문을사용하여변수를나타내는심볼을선언하고 SETA, SETL 및 SETS 지시문을사용하여값을할당합니다. 다음을참조하십시오. 7-5페이지의 GBLA, GBLL 및 GBLS 7-7페이지의 LCLA, LCLL 및 LCLS 7-8페이지의 SETA, SETL 및 SETS 3.5.3 숫자상수 숫자상수는 32 비트정수입니다. 부호없는숫자를사용하여 0 ~ 2 32-1 범위에서숫자상수를설정하거나부호있는숫자를사용하여 31 ~ 2 3-1 범위에서숫자상수를설정할수있습니다. 그러나어셈블러에서는 -n 과 2 32 -n 을구분하지못합니다. >= 와같은관계연산자는부호없는해석을사용합니다. 즉, 0 > -1 은 {FALSE} 입니다. EQU 지시문을사용하여상수를정의합니다 (7-74 페이지의 EQU 참조 ). 숫자상수를정의한후에는해당값을변경할수없습니다. 3-32 페이지의숫자식및 3-33 페이지의숫자리터럴도참조하십시오. 3-26 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.5.4 변수의어셈블리타임대체 어셈블리언어의전체행이나행의일부에문자열변수를사용할수있습니다. 변수를대체할값이있는위치에 $ 접두사가포함된변수를사용합니다. 달러문자는행의구문을검사하기전에소스코드행으로문자열을대체하도록어셈블러에지시합니다. 숫자및논리변수도대체할수있습니다. 변수의현재값은대체전에 16 진수문자열 ( 논리변수의경우, T 또는 F) 로변환됩니다. 심볼이름에다음문자를사용할수있는경우마침표를사용하여변수이름의끝을표시합니다 (3-25 페이지의심볼명명규칙참조 ). 변수를사용하려면먼저변수내용을설정해야합니다. 대체하지않을 $ 가필요하면 $$ 를사용합니다. 이렇게하면단일 $ 로변환됩니다. $ 접두사가포함된변수를문자열에포함할수있습니다. 이경우다른위치와마찬가지로대체가발생합니다. 따옴표로묶은세로막대가대체에영향을주지않는것을제외하고세로막대내에서는대체가발생하지않습니다. 예제 ; straightforward substitution GBLS add4ff ; add4ff SETS "ADD r4,r4,#0xff" ; set up add4ff $add4ff.00 ; invoke add4ff ; this produces ADD r4,r4,#0xff00 ; elaborate substitution GBLS s1 GBLS s2 GBLS fixup GBLA count ; count SETA 14 s1 SETS "a$$b$count" ; s1 now has value a$b0000000e s2 SETS "abc" fixup SETS " xy$s2.z " ; fixup now has value xyabcz C$$code MOV r4,#16 ; but the label here is C$$code ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-27

어셈블러참조 3.5.5 레이블 레이블은명령어나데이터의메모리에서주소를나타내는심볼입니다. 레이블은프로그램기준, 레지스터기준또는절대레이블일수있습니다. 프로그램기준레이블 이레이블은숫자상수를더하거나뺀 PC를나타냅니다. 이레이블을분기명령어의타겟으로사용하거나코드섹션에포함된데이터의작은항목에액세스합니다. 명령어또는데이터정의지시문중하나에서레이블을사용하여프로그램기준레이블을정의할수있습니다. 다음을참조하십시오. 7-23페이지의 DCB 7-24페이지의 DCD 및 DCDU 7-26페이지의 DCFD 및 DCFDU 7-27페이지의 DCFS 및 DCFSU 7-28페이지의 DCI 7-29페이지의 DCQ 및 DCQU 7-30페이지의 DCW 및 DCWU 레지스터기준레이블 이레이블은숫자상수를더한명명된레지스터를나타냅니다. 이레이블은주로데이터섹션의데이터에액세스하는데사용됩니다. 저장맵을사용하여이레이블을정의할수있습니다. EQU 지시문을사용하여저장맵에정의된레이블을기반으로추가레지스터기준레이블을정의할수있습니다. 다음을참조하십시오. 7-20페이지의 MAP 7-22페이지의 SPACE 7-25페이지의 DCDO 7-74페이지의 EQU 절대주소 이레이블은숫자상수입니다. 이레이블은 0 ~ 2 32-1 범위의정수이고메모리주소를직접지정합니다. 3-28 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.5.6 지역레이블 지역레이블은 0 ~ 99 범위의숫자이며, 경우에따라숫자다음에이름이올수있습니다. 영역에서둘이상의지역레이블에동일한숫자를사용할수있습니다. 지역레이블은어셈블리언어모듈의소스행에서 symbol 대신사용할수있습니다 (3-20페이지의소스행형식참조 ). 명령어나지시문없이레이블만있는행 명령어가있는행 코드또는데이터생성지시문이있는행 일반적으로지역레이블은프로그램기준레이블이사용되는위치에서사용됩니다 (3-28 페이지의레이블참조 ). 일반적으로지역레이블은루틴내루프및조건부코드또는지역으로만사용되는작은하위루틴에사용됩니다. 지역레이블은특히매크로에서유용합니다 (7-33 페이지의 MACRO 및 MEND 참조 ). ROUT 지시문을사용하여지역레이블범위를제한합니다 (7-86 페이지의 ROUT 참조 ). 지역레이블에대한참조는동일범위내일치레이블을참조합니다. 범위내에서어느한방향으로도일치하는레이블이없으면오류메시지가생성되고어셈블리가실패합니다. 같은범위내에서도둘이상의지역레이블에같은숫자를사용할수있습니다. 기본적으로어셈블러에서는지역레이블참조를다음항목에링크합니다. 범위내에한숫자가있는경우같은숫자의최신지역레이블 범위내에이전숫자가있는경우같은숫자의뒤따르는지역레이블 필요한경우선택적매개변수를사용하여이검색패턴을수정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-29

어셈블러참조 구문 지역레이블구문은다음과같습니다. n{routname} 지역레이블에대한참조구문은다음과같습니다. %{F B}{A T}n{routname} 인수설명 : n 지역레이블의수입니다. routname 현재범위의이름입니다. % 참조를추가합니다. F 정방향으로만검색하도록어셈블러에지시합니다. B 역방향으로만검색하도록어셈블러에지시합니다. A 모든매크로수준을검색하도록어셈블러에지시합니다. T 현재매크로수준만검색하도록어셈블러에지시합니다. F 와 B 를모두지정하지않으면어셈블러에서는먼저역방향으로검색한다음정방향으로검색합니다. A 와 T 를모두지정하지않으면어셈블러에서는현재수준에서최상위까지모든매크로를검색하지만하위수준매크로는검색하지않습니다. 레이블이나레이블참조에서 routname 을지정하면어셈블러에서는이매개변수를가장가까운이전 ROUT 지시문에대해확인합니다. 일치하지않으면어셈블러에서는오류메시지를생성하고어셈블리가실패합니다. 3-30 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.6 식, 리터럴및연산자 이단원에는다음소단원이포함되어있습니다. 문자열식 3-32페이지의문자열리터럴 3-32페이지의숫자식 3-33페이지의숫자리터럴 3-34페이지의부동소수점리터럴 3-35페이지의레지스터기준및프로그램기준식 3-35페이지의논리식 3-36페이지의논리리터럴 3-36페이지의연산자우선순위 3-38페이지의단항연산자 3-39페이지의이진연산자 3.6.1 문자열식 문자열식은문자열리터럴, 문자열변수, 연산자의문자열조작및괄호의조합으로구성됩니다. 다음을참조하십시오. 3-26페이지의변수 3-32 페이지의문자열리터럴 3-38 페이지의단항연산자 3-40 페이지의문자열조작연산자 7-8 페이지의 SETA, SETL 및 SETS 문자열리터럴에배치할수없는문자는 :CHR: 단항연산자를사용하여문자열식에배치할수있습니다. 0 에서 255 사이의 ASCII 문자를사용할수있습니다. 문자열식의값의길이는 512 자를초과할수없으며, 0 일수있습니다. 예제 improb SETS "literal":cc:(strvar2:left:4) ; sets the variable improb to the value "literal" ; with the left-most four characters of the ; contents of string variable strvar2 appended ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-31

어셈블러참조 3.6.2 문자열리터럴 문자열리터럴은큰따옴표문자로묶인일련의문자로구성됩니다. 문자열리터럴의길이는입력행의길이로제한됩니다 (3-20 페이지의소스행형식참조 ). 문자열에따옴표나달러문자를포함하려면다음두문자를사용합니다. --no_esc 를지정하지않으면 C 문자열이스케이프시퀀스도사용할수있습니다 (3-2 페이지의명령구문참조 ). 예제 abc SETS "this string contains only one "" double quote" def SETS "this string contains only one $$ dollar symbol" 3.6.3 숫자식 숫자식은숫자상수, 숫자변수, 일반숫자리터럴, 이진연산자및괄호의조합으로구성됩니다. 다음을참조하십시오. 3-26페이지의숫자상수 3-26 페이지의변수 3-33 페이지의숫자리터럴 3-39 페이지의이진연산자 7-8 페이지의 SETA, SETL 및 SETS 전체식이레지스터또는 PC 가포함되지않은값으로평가될경우숫자식에레지스터기준또는프로그램기준식이포함될수있습니다. 숫자식은 32 비트정수로평가됩니다. 0 ~ 2 32-1 범위의부호없는숫자또는 -2 31 ~ 2 31-1 범위의부호있는숫자로숫자식을해석할수있습니다. 그러나어셈블러에서는 -n 과 2 32 -n 을구분하지못합니다. >= 와같은관계연산자는부호없는해석을사용합니다. 즉, 0 > -1 은 {FALSE} 입니다. 예제 a SETA 256*256 ; 256*256 is a numeric expression MOV r1,#(a*22) ; (a*22) is a numeric expression 3-32 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 3.6.4 숫자리터럴 숫자리터럴은다음형식을사용할수있습니다. decimal-digits 0xhexadecimal-digits &hexadecimal-digits n_base-n-digits 'character' 인수설명 : decimal-digits 0에서 9 사이의숫자만사용하는문자시퀀스입니다. hexadecimal-digits 0 에서 9 사이의숫자와 A 에서 F 사이또는 a 에서 f 사이의문자만사용하는문자시퀀스입니다. n_ 2 에서 9 사이의한자리숫자로, 뒤에밑줄문자가옵니다. base-n-digits 0 에서 (n -1) 사이의숫자만사용하는문자시퀀스입니다. character 작은따옴표를제외한단일문자입니다. 작은따옴표가필요하면 \' 를사용합니다. 이경우숫자리터럴값은문자의숫자코드입니다. 이외의다른문자는사용하면안됩니다. 문자시퀀스는 0 에서 2 32-1 사이의정수로평가되어야합니다 (0 에서 2 64-1 사이의정수로평가되는 DCQ 및 DCQU 지시문제외 ). 예제 a SETA 34906 addr DCD 0xA10E LDR r4,=&1000000f DCD 2_11001010 c3 SETA 8_74007 DCQ 0x0123456789abcdef LDR r1,='a' ; pseudo-instruction loading 65 into r1 ADD r3,r2,#'\'' ; add 39 to contents of r2, result to r3 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-33

어셈블러참조 3.6.5 부동소수점리터럴 부동소수점리터럴에는다음형식을사용할수있습니다. {-}digits E{-}digits {-}{digits}.digits{e{-}digits} 0xhexdigits &hexdigits 0f_hexdigits 0d_hexdigits 인수설명 : digits hexdigits 0 에서 9 사이의숫자만사용하는문자시퀀스입니다. E 는대문자또는소문자일수있습니다. 이러한형식은일반부동소수점표시에해당합니다. 0 에서 9 사이의숫자와 A 에서 F 사이또는 a 에서 f 사이의문자만사용하는문자시퀀스입니다. 이러한형식은컴퓨터숫자의내부표시에해당합니다. 무한값과 NaN 을입력하거나사용중인정확한비트패턴을확인하려는경우이러한형식을사용합니다. 0x_ 및 & 형식을사용하는경우임의의자릿수의 16 진수로부동소수점비트패턴을지정할수있습니다. 0f_ 형식을사용하는경우정확히 8 자리 16 진수로부동소수점비트패턴을지정해야합니다. 0d_ 형식을사용하는경우정확히 16 자리 16 진수로부동소수점비트패턴을지정해야합니다. 단정밀도부동소수점값의범위는다음과같습니다. 최대 3.40282347e+38 최소 1.17549435e-38 배정밀도부동소수점값의범위는다음과같습니다. 최대 1.79769313486231571e+308 최소 2.22507385850720138e-308 3-34 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 예제 DCFD 1E308,-4E-100 DCFS 1.0 DCFD 3.725e15 DCFS 0x7FC00000 ; Quiet NaN DCFD &FFF0000000000000 ; Minus infinity 3.6.6 레지스터기준및프로그램기준식 레지스터기준식은숫자상수를더하거나뺀명명된레지스터로평가됩니다 (7-20 페이지의 MAP 참조 ). 프로그램기준식은숫자상수를더하거나뺀 PC( 프로그램카운터 ) 로평가되며, 일반적으로숫자식과결합된레이블입니다. 참고 프로그램기준주소에사용되는값은다음과같습니다. 실행될명령어다음에나오는명령어의주소 OR 0xFFFFFFFC(ARM 코드의경우에는차이가없음 ) 위의수에숫자상수를더하거나뺍니다. 예제 LDR r4,=data+4*n ; n is an assembly-time variable ; code MOV pc,lr data DCD value0 ; n-1 DCD directives DCD valuen ; data+4*n points here ; more DCD directives 3.6.7 논리식 논리식은논리리터럴 ({TRUE} 또는 {FALSE}), 논리변수, 부울연산자, 관계및괄호의조합으로구성됩니다 (3-43 페이지의부울연산자참조 ). 관계는변수, 리터럴, 상수또는적절한관계연산자가포함된식의조합으로구성됩니다 (3-42 페이지의관계연산자참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-35

어셈블러참조 3.6.8 논리리터럴 논리리터럴은다음과같습니다. {TRUE} {FALSE} 3.6.9 연산자우선순위 어셈블러에는식에사용할수있는다양한연산자세트가포함되어있습니다. 대부분의연산자는 C 와같은상위언어의해당연산자와비슷합니다 (3-38 페이지의단항연산자및 3-39 페이지의이진연산자참조 ). 식을평가할때는다음과같은엄격한우선순위가적용됩니다. 1. 괄호로묶은식이가장먼저평가됩니다. 2. 연산자는우선순위에따라적용됩니다. 3. 인접단항연산자는오른쪽에서왼쪽으로평가됩니다. 4. 동일한우선순위의이진연산자는왼쪽에서오른쪽으로평가됩니다. armasm 및 C 의연산자우선순위 어셈블러우선순위는 C 의우선순위와정확히같지는않습니다. 예를들어 armasm 에서 (1 + 2 :SHR: 3) 은 (1 + (2 :SHR: 3)) = 1 로평가됩니다. C 에서해당식은 ((1 + 2) >> 3) = 0 으로평가됩니다. 괄호를사용하여우선순위를명시적으로만드는것이좋습니다. 코드에 C 에서다르게구문분석되는식이들어있고 --unsafe 옵션을사용하지않으면 armasm 에서대개경고를표시합니다. A1466W: Operator precedence means that expression would evaluate differently in C 표 3-4 에서는 armasm 의연산자우선순위를보여주고 C 의우선순위와비교합니다 (3-37 페이지의표 3-5 참조 ). 이테이블에서우선순위는다음과같습니다. 최상위우선순위연산자는목록의맨위에있습니다. 최상위우선순위연산자가가장먼저평가됩니다. 3-36 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 같은우선순위의연산자는왼쪽에서오른쪽으로평가됩니다. 표 3-4 armasm 의연산자우선순위 armasm 우선순위 단항연산자 해당 C 연산자 단항연산자 * / :MOD: * / % 문자열조작 해당없음 :SHL: :SHR: :ROR: :ROL: << >> + - :AND: :OR: :EOR: + - & = > >= < <= /= <> == > >= < <=!= :LAND: :LOR: :LEOR: && 표 3-5 C의연산자우선순위 C 우선순위단항연산자 * / % + -( 이진연산자 ) << >> < <= > >= ==!= & ^ && ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-37

어셈블러참조 3.6.10 단항연산자 단항연산자의우선순위가가장높고먼저평가됩니다. 단항연산자는피연산자앞에나옵니다. 인접연산자는오른쪽에서왼쪽으로평가됩니다. 표 3-6 에서는문자열을반환하는단항연산자를보여줍니다. 연산자사용법설명 :CHR: :CHR:A ASCII 코드 A 가포함된문자를반환합니다. 표 3-6 문자열을반환하는단항연산자 :LOWERCASE: :LOWERCASE:string 모든대문자를소문자로변환하여지정된문자열을반환합니다. :REVERSE_CC: :REVERSE_CC:cond_code cond_code에서조건코드의반대조건을반환하거나, cond_code에 유효한조건코드가들어있지않으면오류를반환합니다. :STR: :STR:A 논리식에사용되는경우숫자식이나문자열 "T" 또는 "F" 에해 당하는 8자리 16진수문자열을반환합니다. :UPPERCASE: :UPPERCASE:string 모든소문자를대문자로변환하여지정된문자열을반환합니다. 표 3-7 에서는숫자값을반환하는단항연산자를보여줍니다. 연산자사용법설명 표 3-7 숫자또는논리값을반환하는단항연산자??A 심볼 A를정의하는행에서생성된실행가능코드의바이트수입니 다. + 및 - +A -A 단항더하기및단항빼기. + 및 - 는숫자및프로그램기준식에서사용할수있습니다. :BASE: :BASE:A A가 PC 상대또는레지스터기준식이면 :BASE: 는레지스터구성요 소의수를반환합니다. :BASE: 는매크로에매우유용합니다. :CC_ENCODING: :CC_ENCODING:cond_code cond_code에서조건코드의숫자값을반환하거나, cond_code에유효 한조건코드가들어있지않으면오류를반환합니다. :DEF: :DEF:A A 가정의되어있으면 {TRUE} 이고, 그렇지않으면 {FALSE} 입니다. :INDEX: :INDEX:A A가레지스터기준식이면 :INDEX: 는기준레지스터의오프셋을반 환합니다. :INDEX: 는매크로에매우유용합니다. :LEN: :LEN:A 문자열 A 의길이입니다. 3-38 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 표 3-7 숫자또는논리값을반환하는단항연산자 ( 계속 ) 연산자 사용법 설명 :LNOT: :LNOT:A A의논리보수입니다. :NOT: :NOT:A A의비트단위보수입니다. a :RCONST: :RCONST:Rn r0 ~ r15에해당하는 0 ~ 15의레지스터번호입니다. a. ~ 는 :NOT: 의별칭입니다 ( 예 : ~A). 3.6.11 이진연산자 이진연산자는해당하위식쌍사이에서작성됩니다. 이진연산자의우선순위는단항연산자보다낮습니다. 이진연산자는이섹션에우선순위에따라나타납니다. 참고 이우선순위는 C 의우선순위와같지않습니다 (3-36 페이지의 armasm 및 C 의연산자우선순위참조 ). 곱하기연산자 곱하기연산자는모든이진연산자중우선순위가가장높으며, 숫자식에만사용할수있습니다. 표 3-8 에서는곱하기연산자를보여줍니다. 표 3-8 곱하기연산자 연산자 별칭 사용법 설명 * A*B 곱하기 / A/B 나누기 :MOD: % A:MOD:B A 모듈로 B ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-39

어셈블러참조 문자열조작연산자 3-40페이지의표 3-9에서는문자열조작연산자를보여줍니다. 나누기연산자에서 LEFT 및 RIGHT: A는문자열이어야합니다. B는숫자식이어야합니다. CC에서 A와 B는둘다문자열이어야합니다. 표 3-9 문자열조작연산자 연산자 사용법 설명 :CC: A:CC:B B가 A의끝에연결됨 :LEFT: A:LEFT:B A의가장왼쪽 B 문자 :RIGHT: A:RIGHT:B A의가장오른쪽 B 문자 시프트연산자 시프트연산자는첫번째피연산자를두번째피연산자로지정된양만큼시프트또는회전하는방식으로숫자식에사용됩니다. 표 3-10 에서는시프트연산자를보여줍니다. 표 3-10 시프트연산자 연산자별칭사용법설명 :ROL: A:ROL:B A를 B비트만큼왼쪽으로 회전 :ROR: A:ROR:B A를 B비트만큼오른쪽으 로회전 :SHL: << A:SHL:B A를 B비트만큼왼쪽으로 시프트 :SHR: >> A:SHR:B A를 B비트만큼오른쪽으 로시프트 3-40 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 참고 SHR 은논리시프트이며부호비트를전파하지않습니다. 더하기, 빼기및논리연산자 더하기및빼기연산자는숫자식에적용됩니다. 논리연산자는숫자식에적용됩니다. 연산은비트단위즉, 결과를생성하는각피연산자비트별로개별적으로수행됩니다. 표 3-11 에서는더하기, 빼기및논리연산자를보여줍니다. 표 3-11 더하기, 빼기및논리연산자 연산자 별칭 사용법 설명 + A+B A와 B를더함 - A-B A에서 B를뺌 :AND: && A:AND:B A와 B의비트단위 AND :EOR: ^ A:EOR:B A와 B의비트단위배타적 OR :OR: A:OR:B A와 B의비트단위 OR ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-41

어셈블러참조 관계연산자 표 3-12 에서는관계연산자를보여줍니다. 이연산자는논리값을생성하는동일한타입의두피연산자에사용됩니다. 피연산자는다음중하나일수있습니다. 숫자 프로그램기준 레지스터기준 문자열 문자열은 ASCII 순서를사용하여정렬됩니다. 문자열 A 가문자열 B 의선행하위문자열이거나문자열 A 의가장왼쪽에있는문자가문자열 B 의가장왼쪽에있는문자보다작으면문자열 A 가문자열 B 보다작습니다. 산술값은부호가없으므로 0>-1 값은 {FALSE} 입니다. 연산자별칭사용법설명 = == A=B A 와 B 가같음 > A>B A 가 B 보다큼 표 3-12 관계연산자 >= A>=B A 가 B 보다크거나같음 < A<B A 가 B 보다작음 <= A<=B A 가 B 보다작거나같음 /= <>!= A/=B A 와 B 가같지않음 3-42 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 부울연산자 이연산자는우선순위가가장낮은연산자이며피연산자에대해표준논리연산을수행합니다. 세가지경우모두에서 A 와 B 는둘다 {TRUE} 또는 {FALSE} 로평가되는식이어야합니다. 표 3-13 에서는부울연산자를보여줍니다. 연산자사용법설명 :LAND: A:LAND:B A 와 B 의논리 AND 표 3-13 부울연산자 :LEOR: A:LEOR:B A 와 B 의논리배타적 OR :LOR: A:LOR:B A 와 B 의논리 OR ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-43

어셈블러참조 3.7 진단메시지 어셈블러는다양한추가진단메시지를제공할수있습니다. 기본적으로이러한진단메시지는표시되지않지만, 명령행옵션을사용하여어셈블러에서제공하는메시지를제어할수있습니다. 자세한내용은 3-16 페이지의진단메시지의출력제어를참조하십시오. 이단원에는다음소단원이포함되어있습니다. 인터럭 IT 블록생성 3-45 페이지의 Thumb 분기타겟정렬 3.7.1 인터럭 --cpu 옵션을사용하여선택한프로세서의파이프라인으로인해코드에서발생할수있는인터럭에대한경고메시지를표시할수있습니다. 이렇게하려면어셈블러를호출할때다음명령행옵션을사용합니다. armasm --diag_warning 1563 참고 --cpu 옵션으로 Cortex-A8 과같은다중실행프로세서를지정하면어셈블러경고를예상할수없습니다. 3.7.2 IT 블록생성 다음과같은코드를작성하는경우 AREA x,code THUMB MOVNE r0,r1 ; (1) NOP IT NE MOVNE r0,r1 ; (2) END 어셈블러는첫번째 MOVNE 명령어전에 IT 명령어를생성합니다. 3-44 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

어셈블러참조 Thumb 코드를어셈블할때이러한 IT 블록의자동생성에대한경고메시지를얻을수있습니다. 이렇게하려면어셈블러를호출할때다음명령행옵션을사용합니다. armasm --diag_warning 1763 3.7.3 Thumb 분기타겟정렬 일부프로세서에서워드로정렬되지않은 Thumb 명령어는루프에서실행되기위해하나이상의추가주기를사용하는경우가있습니다. 따라서분기타겟이워드로정렬되도록하는것이유용할수있습니다. 어셈블러에서는 Thumb 코드의분기타겟이워드로정렬되지않은경우경고를생성할수있습니다. 이렇게하려면어셈블러를호출할때다음명령행옵션을사용합니다. armasm --diag_warning 1604 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 3-45

어셈블러참조 3.8 C 사전처리기사용 어셈블리언어소스파일에서 C 사전처리기명령을사용할수있습니다. 이경우 C 사전처리기를사용하여파일을사전처리한후 armasm 을사용하여어셈블해야합니다. 자세한내용은 RealView Compilation Tools 컴파일러사용설명서를참조하십시오. armasm 은결과파일에서 #line 명령을올바로해석하며, #line 명령의정보를사용하여오류메시지와 debug_line 테이블을생성할수있습니다. 예제 3-1 에서는 source.s 파일을사전처리하고어셈블하기위해작성하는명령을보여줍니다. 이예제에서는사전처리기에서 preprocessed.s 라는파일을출력하고 armasm 에서 preprocessed.s 를어셈블합니다. 예제 3-1 어셈블리언어소스파일사전처리 armcc -E source.s > preprocessed.s armasm preprocessed.s 3-46 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

4 장 ARM 및 Thumb 명령어 이장에서는 ARM 어셈블러에서지원하는 ARM, Thumb(32비트및 16비트 ) 및 ThumbEE 명령어에대해설명합니다. 여기에는다음단원이포함되어있습니다. 4-3페이지의명령어요약 4-10 페이지의 Thumb 에서명령어너비선택 4-12 페이지의메모리액세스명령어 4-43 페이지의일반데이터처리명령어 4-75 페이지의곱하기명령어 4-96 페이지의포화명령어 4-101 페이지의병렬명령어 4-109 페이지의패킹및패킹해제명령어 4-117 페이지의분기명령어 4-124 페이지의보조프로세서명령어 4-132 페이지의기타제한 4-148 페이지의 ThumbEE 명령어 4-152 페이지의의사명령어 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-1

ARM 및 Thumb 명령어 일부명령어단원에는아키텍처소단원이있습니다. 아키텍처소단원이없는명령어는모든버전의 ARM 명령어세트와모든버전의 Thumb 명령어세트에서사용할수있습니다. 4-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.1 명령어요약 표 4-1 에서는 ARM, Thumb, Thumb-2 및 ThumbEE 명령어세트에서사용할수있는명령어에대해간략히설명합니다. 이표를사용하면이장의나머지부분에서설명하는개별명령어와의사명령어를찾을수있습니다. 참고다른언급이없는한 ThumbEE 명령어는 Thumb 명령어와동일합니다. 표 4-1 명령어위치 니모닉 간단한설명 페이지 아키텍처 a ADC, ADD carry 포함더하기, 더하기 4-48페이지 모두 ADR 프로그램또는레지스터기준주소로드 ( 짧은범위 ) 4-25페이지 모두 ADRL 의사명령어 프로그램또는레지스터기준주소로드 ( 중간범위 ) 4-153페이지 x6m AND 논리 AND 4-53페이지 모두 ASR 오른쪽으로산술시프트 4-69페이지 모두 B 분기 4-118페이지 모두 BFC, BFI 비트필드지우기및삽입 4-110페이지 T2 BIC 비트지우기 4-53페이지 모두 BKPT 브레이크포인트 4-133페이지 5 BL 링크포함분기 4-118페이지 모두 BLX 링크포함분기및변경명령어세트 4-118페이지 T BX 분기, 변경명령어세트 4-118페이지 T BXJ 분기, Jazelle로변경 4-118페이지 J, x7m CBZ, CBNZ 0인경우 (0이아닌경우 ) 비교및분기 4-122페이지 T2 CDP 보조프로세서데이터처리연산 4-125페이지 x6m CDP2 보조프로세서데이터처리연산 4-125페이지 5, x6m ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-3

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 아키텍처 a CHKA 배열검사 4-150페이지 EE CLREX 단독지우기 4-41페이지 K, x6m CLZ 선행 0 수계산 4-56페이지 5, x6m CMN, CMP 음수비교, 비교 4-57페이지 모두 CPS 프로세서상태변경 4-139페이지 6 CPY 복사 4-59페이지 6 DBG 디버그 4-145페이지 7 DMB, DSB 데이터메모리장벽, 데이터동기화장벽 4-145페이지 7, 6M ENTERX, LEAVEX ThumbEE로또는 ThumbEE에서상태변경 4-149페이지 EE EOR 배타적 OR 4-53페이지 모두 HB, HBL, HBLP, HBP 처리기분기, 지정된처리기로분기 4-151페이지 EE ISB 명령어동기화장벽 4-145페이지 7, 6M IT If-Then 4-71페이지 T2 LDC 보조프로세서로드 4-130페이지 x6m LDC2 보조프로세서로드 4-130페이지 5, x6m LDM 다중레지스터로드 4-29페이지 모두 LDR 레지스터로드명령어 4-12페이지 모두 LDR 의사명령어 레지스터로드의사명령어 4-157페이지 모두 LDREX 단독레지스터로드 4-38페이지 6, x6m LDREXB, LDREXH 바이트및하프워드단독레지스터로드 4-38페이지 K, x6m LDREXD 더블워드단독레지스터로드 4-38페이지 K, x7m LSL, LSR 왼쪽으로논리시프트, 오른쪽으로논리시프트 4-69페이지 모두 MAR 레지스터에서 40비트누산기로이동 4-147페이지 XScale 4-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 아키텍처 a MCR 레지스터에서보조프로세서로이동 4-126페이지 x6m MCR2 레지스터에서보조프로세서로이동 4-126페이지 5, x6m MCRR 여러레지스터에서보조프로세서로이동 4-126페이지 5E, x6m MCRR2 여러레지스터에서보조프로세서로이동 4-126페이지 6, x6m MIA, MIAPH, MIAxy 내부 40비트누산으로곱하기 4-94페이지 XScale MLA 곱하기누산 4-76페이지 x6m MLS 곱하기및빼기 4-76페이지 T2 MOV 이동 4-59페이지 모두 MOVT 맨위로이동 4-62페이지 T2 MOV32 의사명령어 레지스터로 32비트상수이동 4-155페이지 T2 MRA 40비트누산기에서레지스터로이동 4-147페이지 XScale MRC 보조프로세서에서레지스터로이동 4-128페이지 모두 MRC2 보조프로세서에서레지스터로이동 4-128페이지 5, x6m MRS PSR에서레지스터로이동 4-135페이지 모두 MSR 레지스터에서 PSR로이동 4-137페이지 모두 MUL 곱하기 4-76페이지 모두 MVN 이동하지않음 4-59페이지 모두 NOP 연산없음 4-143페이지 모두 ORN 논리 OR NOT 4-53페이지 T2 ORR 논리 OR 4-53페이지 모두 PKHBT, PKHTB 하프워드패킹 4-115페이지 6, x7m PLD 데이터사전로드 4-27페이지 5E, x6m PLI 사전로드명령어 4-27페이지 7 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-5

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉간단한설명페이지아키텍처 a PUSH, POP 레지스터푸시, 팝 4-32 페이지모두 QADD, QDADD, QDSUB, QSUB 포화산술 4-97 페이지 5E, x7m QADD8, QADD16, QASX, QSUB8, QSUB16, QSAX 병렬부호있는포화산술 4-102 페이지 6, x7m REV, REV16, REVSH 바이트순서반전 4-67페이지 6 RBIT 비트반전 4-67페이지 T2 RFE 예외에서복귀 4-34페이지 T2, x7m ROR 레지스터를오른쪽으로회전 4-69페이지 모두 RSB 역방향빼기 4-48페이지 모두 RSC carry 포함역방향빼기 4-48페이지 x6m SBC carry 포함빼기 4-48페이지 모두 SADD8, SADD16, SASX 병렬부호있는산술 4-102페이지 6, x7m SBFX, UBFX 부호있는및부호없는비트필드추출 4-111페이지 T2 SDIV 부호있는나누기 4-74페이지 7M, 7R SEL APSR GE 플래그에따라바이트선택 4-65페이지 6, x7m SEV 이벤트설정 4-143페이지 K, 6M SETEND 메모리액세스에엔디안설정 4-142페이지 6, x7m SHADD8, SHADD16, SHASX, SHSUB8, SHSUB16, SHSAX 병렬부호있는양분산술 4-102 페이지 6, x7m SMC 보안모니터호출 4-141페이지 Z SMLAD 이중부호있는곱하기누산 4-89페이지 6, x7m (32<=32+16x16+16x16) SMLAL 부호있는곱하기누산 (64 <= 64 + 32 x 32) 4-78페이지 x6m SMLALxy 부호있는곱하기누산 (64 <= 64 + 16 x 16) 4-83페이지 5E, x7m 4-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 아키텍처 a SMLALD long에대한이중부호있는곱하기누산 4-91페이지 6, x7m (64 <= 64 + 16 x 16 + 16 x 16) SMLSD 이중부호있는곱하기빼기누산 4-89페이지 6, x7m (32 <= 32 + 16 x 16-16 x 16) SMLSLD long에대한이중부호있는곱하기빼기누산 4-91페이지 6, x7m (64 <= 64 + 16 x 16-16 x 16) SMMUL 부호있는상위워드곱하기 (32 <= TopWord(32 x 32)) 4-87페이지 6, x7m SMUAD, SMUSD 이중부호있는곱하기및결과더하기또는빼기 4-85페이지 6, x7m SMULL 부호있는곱하기 (64 <= 32 x 32) 4-78페이지 x6m SMULxy 부호있는곱하기 (32 <= 16 x 16) 4-80페이지 5E, x7m SMULWy 부호있는곱하기 (32 <= 32 x 16) 4-82페이지 5E, x7m SRS 반환상태저장 4-36페이지 T2, x7m SSAT 부호있는포화 4-99페이지 6, x6m SSAT16 부호있는포화, 병렬하프워드 4-107페이지 6, x7m SSUB8, SSUB16, SSAX 병렬부호있는산술 4-102페이지 6, x7m STC 보조프로세서저장 4-130페이지 x6m STC2 보조프로세서저장 4-130페이지 5, x6m STM 다중레지스터저장 4-29페이지 모두 STR 레지스터저장명령어 4-12페이지 모두 STREX 단독레지스터저장 4-38페이지 6, x6m STREXB, STREXH 단독레지스터저장바이트, 하프워드 4-38페이지 K, x6m STREXD 더블워드단독레지스터저장 4-38페이지 K, x7m SUB 빼기 4-48페이지 모두 SUBS pc, LR 스택없이예외에서반환 4-52페이지 T2, x7m ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-7

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 아키텍처 a SVC( 이전 SWI) 관리자호출 4-134페이지 모두 SWP, SWPB 레지스터와메모리스왑 (ARM에만해당 ) 4-42페이지 모두, x7m SXT 부호있는확장 4-112페이지 6 SXTA 더하기포함부호있는확장 4-112페이지 6, x7m TBB, TBH 테이블분기바이트, 하프워드 4-123페이지 T2 TEQ, TST 동등테스트, 테스트 4-63페이지 모두 UADD8, UADD16, UASX 병렬부호없는산술 4-102페이지 6, x7m UDIV 부호없는나누기 4-74페이지 7M, 7R UHADD8, UHADD16, UHASX, UHSUB8, UHSUB16, UHSAX 병렬부호없는양분산술 4-102 페이지 6, x7m UMAAL long에대한부호없는곱하기누산 4-93페이지 6, x7m (64 <= 32 + 32 + 32 x 32) UMLAL, UMULL 부호없는곱하기누산, 곱하기 4-78페이지 x6m (64 <= 32 x 32 + 64), (64 <= 32 x 32) UQADD8, UQADD16, UQASX, UQSUB8, UQSUB16, UQSAX 병렬부호없는포화산술 4-102 페이지 6, x7m USAD8 부호없는절대차의합 4-105페이지 6, x7m USADA8 부호없는절대차의합누산 4-105페이지 6, x7m USAT 부호없는포화 4-99페이지 6, x6m USAT16 부호없는포화, 병렬하프워드 4-107페이지 6, x7m USUB8, USUB16, USAX 병렬부호없는산술 4-102페이지 6, x7m UXT 부호없는확장 4-112페이지 6 4-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 표 4-1 명령어위치 ( 계속 ) 니모닉간단한설명페이지아키텍처 a UXTA 더하기포함부호없는확장 4-112 페이지 6, x7m V* 자세한내용은 5 장 NEON 및 VFP 프로그래밍을참조하십시오. WFE, WFI, YIELD 이벤트대기, 인터럽트대기, 양도 4-143 페이지 T2, 6M a. 아키텍처열의항목은다음과같은의미를갖습니다. 모두 해당명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 5 해당명령어는 ARMv5T*, ARMv6* 및 ARMv7 아키텍처에서사용할수있습니다. 5E 해당명령어는 ARMv5TE, ARMv6* 및 ARMv7 아키텍처에서사용할수있습니다. 6 해당명령어는 ARMv6* 및 ARMv7 아키텍처에서사용할수있습니다. 6M 해당명령어는 ARMv6-M 및 ARMv7 아키텍처에서사용할수있습니다. x6m 해당명령어는 ARMv6-M 프로파일에서사용할수없습니다. 7 해당명령어는 ARMv7 아키텍처에서사용할수있습니다. 7M 해당명령어는 ARMv7-M 프로파일에서사용할수있습니다. x7m 해당명령어는 ARMv6-M 또는 ARMv7-M 프로파일에서사용할수없습니다. 7R 해당명령어는 ARMv7-R 프로파일에서사용할수있습니다. EE 해당명령어는 ARM 아키텍처의 ThumbEE 변형에서사용할수있습니다. J 해당명령어는 ARMv5TEJ, ARMv6* 및 ARMv7 아키텍처에서사용할수있습니다. K 해당명령어는 ARMv6K 및 ARMv7 아키텍처에서사용할수있습니다. T 해당명령어는 ARMv4T, ARMv5T*, ARMv6* 및 ARMv7 아키텍처에서사용할수있습니다. T2 해당명령어는 ARMv6T2 및 ARMv7 아키텍처에서사용할수있습니다. XScale 해당명령어는 ARM 아키텍처의 XScale 버전에서사용할수있습니다. Z 해당명령어는보안확장이구현된경우사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-9

ARM 및 Thumb 명령어 4.2 Thumb 에서명령어너비선택 ARMv6T2 이상프로세서를위한 Thumb 코드를작성할경우일부명령어에는 16 비트인코딩이나 32 비트인코딩이있을수있습니다. 일반적으로어셈블러는두인코딩을모두사용할수있는경우 16 비트인코딩을생성합니다. 이동작의예외에대해서는일부명령어의다른동작을참조하십시오. 4.2.1 명령어너비지정자,.W 및.N 이동작을재정의하려면.W 너비지정자를사용할수있습니다. 이너비지정자를사용하면 16 비트인코딩을사용할수있는경우에도어셈블러에서 32 비트인코딩을생성합니다. ARM 또는 Thumb(ARMv6T2 이상 ) 코드로어셈블될수있는코드에서.W 지정자를사용할수있습니다..W 지정자는 ARM 코드로어셈블될때는아무런영향을주지않습니다. 명령어가 16 비트로인코딩되도록하려면.N 너비지정자를사용할수있습니다. 이경우명령어가 16 비트로인코딩될수없거나 ARM 코드로어셈블하면어셈블러에서오류를생성합니다. 명령어너비지정자를사용하는경우다음과같이명령어니모닉과조건코드 ( 있는경우 ) 바로뒤에너비지정자를배치해야합니다. BCS.W label ; forces 32-bit instruction even for a short branch B.N label : faults if label out of range for 16-bit instruction 4.2.2 일부명령어의다른동작 정방향참조의경우,.W 가없는 LDR, ADR 및 B 는 32 비트명령어를사용하여도달할수있는타겟에서오류를발생시키는경우에도항상 16 비트명령어를생성합니다. 외부참조의경우,.W 가없는 LDR 및 B 는항상 32 비트명령어를생성합니다. 4-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.2.3 진단경고 진단경고를사용하여분기명령어가 16 비트로인코딩될수있었지만.W 를지정했기때문에 32 비트로인코딩된경우를감지할수있습니다. --diag_warning 1607 이경고는기본적으로해제됩니다. 참고최종주소가알려지지않기때문에이진단에서는재배치된분기명령어에대한경고를생성하지않습니다. 분기가 32비트명령어의범위를벗어나는경우링커에서비니어를삽입할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-11

ARM 및 Thumb 명령어 4.3 메모리액세스명령어 이단원에는다음소단원이포함되어있습니다. 4-13 페이지의주소정렬 모든메모리액세스명령어에적용되는정렬에대한고려사항 4-15페이지의 LDR 및 STR( 즉치오프셋 ) 즉치오프셋, 사전인덱싱된즉치오프셋또는사후인덱싱된즉치오프셋을사용하여로드및저장 4-18페이지의 LDR 및 STR( 레지스터오프셋 ) 레지스터오프셋, 사전인덱싱된레지스터오프셋또는사후인덱싱된레지스터오프셋을사용하여로드및저장 4-20페이지의 LDR 및 STR( 사용자모드 ) 사용자모드권한을사용하여로드및저장 4-22페이지의 LDR(pc 기준 ) 레지스터로드. 주소는 pc를기준으로한오프셋입니다. 4-25페이지의 ADR 프로그램기준또는레지스터기준주소로드 4-27페이지의 PLD 및 PLI 나중에사용할주소사전로드 4-29페이지의 LDM 및 STM 다중레지스터로드및저장 4-32페이지의 PUSH 및 POP 스택에하위레지스터및 LR( 선택적 ) 푸시스택에서하위레지스터및 pc( 선택적 ) 팝 4-34페이지의 RFE 예외에서복귀 4-36페이지의 SRS 반환상태저장 4-12 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4-38페이지의 LDREX 및 STREX 단독레지스터로드및저장 4-41페이지의 CLREX 단독지우기 4-42페이지의 SWP 및 SWPB 레지스터와메모리간데이터스왑 참고 LDR 의사명령어도있습니다 (4-157 페이지의 LDR 의사명령어참조 ). 이의사명령어는 LDR 명령어로어셈블되거나 MOV 또는 MVN 명령어로어셈블됩니다. 4.3.1 주소정렬 대부분의경우 4 바이트로전송할주소는 4 바이트워드로정렬해야하고 2 바이트로전송할주소는 2 바이트워드로정렬해야합니다. ARMv6T2 이상에서는정렬되지않은액세스가허용됩니다. ARMv7 이상에서는정렬되지않은액세스가사용가능하며기본액세스방법입니다. ARMv6 이하에서는시스템에시스템보조프로세서 (cp15) 가있을경우정렬검사를사용할수있습니다. 워드로정렬되지않은 32 비트전송은정렬검사를사용할경우정렬예외를발생시킵니다. 모든액세스가정렬되는경우 --no_unaligned_access 명령행옵션을사용하면, 정렬되지않는옵션을가질수있는라이브러리함수에서링크를방지할수있습니다. 시스템에시스템보조프로세서 (cp15) 가없거나정렬검사를사용하지않을경우다음사항이적용됩니다. STR 의경우지정된주소가 4 의배수로잘립니다. LDR의경우 : 1. 지정된주소가 4의배수로잘립니다. 2. 4바이트의데이터가결과주소에서로드됩니다. 3. 주소의비트 [1:0] 에따라로드된데이터가 1, 2 또는 3 바이트씩오른쪽으로회전합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-13

ARM 및 Thumb 명령어 이경우리틀엔디안메모리시스템에서는주소가지정된바이트가레지스터의최하위바이트를차지합니다. 이경우빅엔디안메모리시스템에서는주소가지정된바이트가다음바이트를차지합니다. 주소의비트 [0] 이 0일경우, 비트 [31:24] 주소의비트 [0] 이 1일경우, 비트 [15:8] 4-14 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.3.2 LDR 및 STR( 즉치오프셋 ) 즉치오프셋, 사전인덱싱된즉치오프셋또는사후인덱싱된즉치오프셋을사용하여로드및저장 구문 op{type}{cond} Rt, [Rn {, #offset}] op{type}{cond} Rt, [Rn, #offset]! op{type}{cond} Rt, [Rn], #offset opd{cond} Rt, Rt2, [Rn {, #offset}] opd{cond} Rt, Rt2, [Rn, #offset]! opd{cond} Rt, Rt2, [Rn], #offset ; immediate offset ; pre-indexed ; post-indexed ; immediate offset, doubleword ; pre-indexed, doubleword ; post-indexed, doubleword 인수설명 : op 다음중하나일수있습니다. LDR STR 레지스터로드 레지스터저장 type 다음중하나일수있습니다. B 부호없는바이트 ( 로드시 32 비트로 0 확장 ) SB 부호있는바이트 (LDR 에만해당, 32 비트로부호확장 ) H 부호없는하프워드 ( 로드시 32 비트로 0 확장 ) SH 부호있는하프워드 (LDR 에만해당, 32 비트로부호확장 ) - 워드용으로, 생략됨 cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rt 로드또는저장할레지스터입니다. Rn 메모리주소의기준이되는레지스터입니다. offset 오프셋입니다. offset 이생략되면주소는 Rn 의내용입니다. Rt2 더블워드연산의경우로드또는저장할추가레지스터입니다. 모든옵션을모든명령어세트와아키텍처에서사용할수있는것은아닙니다. 자세한내용은 4-16 페이지의오프셋범위및아키텍처를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-15

ARM 및 Thumb 명령어 오프셋범위및아키텍처 표 4-2 에서는이러한명령어의오프셋범위와사용가능성을보여줍니다. 표 4-2 오프셋및아키텍처, LDR/STR, 워드, 하프워드및바이트 명령어 즉치오프셋 사전인덱싱된오프셋 사후인덱싱된오프셋 아키텍처 ARM, 워드또는바이트 a -4095 ~ 4095-4095 ~ 4095-4095 ~ 4095 모두 ARM, 부호있는바이트, 하프워드또는부호있는하프워드 -255 ~ 255-255 ~ 255-255 ~ 255 모두 ARM, 더블워드 -255 ~ 255-255 ~ 255-255 ~ 255 v5te + 32 비트 Thumb, 워드, 하프워드, 부호있는하프워드, 바이트또는부호있는바이트 a -255 ~ 4095-255 ~ 255-255 ~ 255 v6t2, v7 32 비트 Thumb, 더블워드 -1020 ~ 1020 c -1020 ~ 1020 c -1020 ~ 1020 c v6t2, v7 16 비트 Thumb, 워드 b 0 ~ 124 c 사용할수없음사용할수없음모든 T 16 비트 Thumb, 부호없는하프워드 b 0 ~ 62 d 사용할수없음사용할수없음모든 T 16 비트 Thumb, 부호없는바이트 b 0 ~ 31 사용할수없음사용할수없음모든 T 16 비트 Thumb, 워드, Rn 은 r13 임 e 0 ~ 1020 c 사용할수없음사용할수없음모든 T 16 비트 ThumbEE, 워드 b -28 ~ 124 c 사용할수없음사용할수없음 T-2EE 16 비트 ThumbEE, 워드, Rn 은 r9 임 e 0 ~ 252 c 사용할수없음사용할수없음 T-2EE 16 비트 ThumbEE, 워드, Rn 은 r10 임 e 0 ~ 124 c 사용할수없음사용할수없음 T-2EE a. 워드로드의경우 Rt는 pc일수있습니다. pc로로드하면로드된주소로분기됩니다. ARMv4에서는로드된주소의비 트 [1:0] 이 0b00이어야합니다. ARMv5 이상에서는비트 [1:0] 이 0b10이면안됩니다. 비트 [0] 이 1이면실행이 Thumb 상태에서계속되고, 그렇지않으면실행이 ARM 상태에서계속됩니다. b. Rt 및 Rn은 r0 ~ r7 범위에있어야합니다. c. 4의배수여야합니다. d. 2의배수여야합니다. e. Rt는 r0 ~ r7 범위에있어야합니다. 4-16 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 더블워드레지스터제한 Thumb-2 명령어의경우, Rt 또는 Rt2에 sp 또는 pc를지정하면안됩니다. ARM 명령어의경우 Rt는짝수의레지스터여야합니다. Rt는 lr이면안됩니다. Rt에는 r12를사용하지않는것이좋습니다. Rt2는 R(t + 1) 이어야합니다. 예제 LDR r8,[r10] ; loads r8 from the address in r10. LDRNE r2,[r5,#960]! ; (conditionally) loads r2 from a word ; 960 bytes above the address in r5, and ; increments r5 by 960. STR r2,[r9,#consta-struc] ; consta-struc is an expression evaluating ; to a constant in the range 0-4095. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-17

ARM 및 Thumb 명령어 4.3.3 LDR 및 STR( 레지스터오프셋 ) 레지스터오프셋, 사전인덱싱된레지스터오프셋또는사후인덱싱된레지스터오프셋을사용하여로드및저장 구문 op{type}{cond} Rt, [Rn, +/-Rm {, shift}] ; register offset op{type}{cond} Rt, [Rn, +/-Rm {, shift}]! ; pre-indexed op{type}{cond} Rt, [Rn], +/-Rm {, shift} opd{cond} Rt, Rt2, [Rn, +/-Rm {, shift}] ; post-indexed ; register offset, doubleword opd{cond} Rt, Rt2, [Rn, +/-Rm {, shift}]! ; pre-indexed, doubleword opd{cond} Rt, Rt2, [Rn], +/-Rm {, shift} ; post-indexed, doubleword 인수설명 : op 다음중하나일수있습니다. LDR 레지스터로드 STR 레지스터저장 type 다음중하나일수있습니다. B 부호없는바이트 ( 로드시 32비트로 0 확장 ) SB 부호있는바이트 (LDR에만해당, 32비트로부호확장 ) H 부호없는하프워드 ( 로드시 32비트로 0 확장 ) SH 부호있는하프워드 (LDR에만해당, 32비트로부호확장 ) - 워드용으로, 생략됨 cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rt 로드또는저장할레지스터입니다. Rn 메모리주소의기준이되는레지스터입니다. Rm 오프셋으로사용할값이들어있는레지스터입니다. Rm 은 r15 이면안됩니다. -Rm 은 Thumb 코드에서허용되지않습니다. shift 선택적시프트입니다. Rt2 더블워드연산의경우로드또는저장할추가레지스터입니다. 4-18 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 모든옵션을모든명령어세트와아키텍처에서사용할수있는것은아닙니다. 자세한내용은 4-19 페이지의오프셋레지스터및시프트옵션을참조하십시오. 오프셋레지스터및시프트옵션 표 4-3 에서는이러한명령어의오프셋범위와사용가능성을보여줍니다. 표 4-3 옵션및아키텍처, LDR/STR( 레지스터오프셋 ) 명령어 +/-Rm a 시프트아키텍처 ARM, 워드또는바이트 b +/-Rm LSL #0-31 LSR #1-32 모두 ASR #1-32 ROR #1-31 RRX ARM, 부호있는바이트, 하프워드또는부호있는하프워드 +/-Rm 사용할수없음모두 ARM, 더블워드 +/-Rm 사용할수없음 v5te + 32비트 Thumb, 워드, 하프워드, 부호있는하프 +Rm LSL #0-3 v6t2, v7 워드, 바이트또는부호있는바이트 a 32 비트 Thumb, 더블워드 +Rm 사용할수없음 v6t2, v7 16 비트 Thumb, 모두 c +Rm 사용할수없음모든 T 16 비트 ThumbEE, 워드 b +Rm LSL #2( 필수 ) T-2EE 16 비트 ThumbEE, 하프워드, 부호있는하프워드 b +Rm LSL #1( 필수 ) T-2EE 16 비트 ThumbEE, 바이트, 부호있는바이트 b +Rm 사용할수없음 T-2EE a. +/-Rm 이표시되면 -Rm, +Rm 또는 Rm 을사용할수있습니다. +Rm 이표시되면 -Rm 을사용할수없습니다. b. 워드로드의경우 Rt 는 pc 일수있습니다. pc 로로드하면로드된주소로분기됩니다. ARMv4 에서는로드된주소의비트 [1:0] 이 0b00 이어야합니다. ARMv5 이상에서는비트 [1:0] 이 0b10 이면안됩니다. 비트 [0] 이 1 이면실행이 Thumb 상태에서계속되고, 그렇지않으면실행이 ARM 상태에서계속됩니다. c. Rt, Rn 및 Rm 은모두 r0 ~ r7 범위에있어야합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-19

ARM 및 Thumb 명령어 더블워드레지스터제한 Thumb-2 명령어의경우, Rt 또는 Rt2에 sp 또는 pc를지정하면안됩니다. ARM 명령어의경우 Rt는짝수의레지스터여야합니다. Rt는 lr이면안됩니다. Rt에는 r12를사용하지않는것이좋습니다. Rt2는 R(t + 1) 이어야합니다. 4.3.4 LDR 및 STR( 사용자모드 ) 사용자모드권한을사용하여바이트, 하프워드또는워드로드및저장 이러한명령어가권한모드에서실행되면사용자모드에서실행된경우와동일한제한을갖고메모리에액세스합니다. 사용자모드에서이러한명령어는일반메모리액세스와똑같은방식으로동작합니다. 구문 op{type}t{cond} Rt, [Rn {, #offset}] op{type}t{cond} Rt, [Rn] {, #offset} ; immediate offset (Thumb-2 only) ; post-indexed (ARM only) op{type}t{cond} Rt, [Rn], +/-Rm {, shift} ; post-indexed (register) (ARM only) 인수설명 : op 다음중하나일수있습니다. LDR 레지스터로드 STR 레지스터저장 type 다음중하나일수있습니다. B 부호없는바이트 ( 로드시 32비트로 0 확장 ) SB 부호있는바이트 (LDR에만해당, 32비트로부호확장 ) H 부호없는하프워드 ( 로드시 32비트로 0 확장 ) SH 부호있는하프워드 (LDR에만해당, 32비트로부호확장 ) - 워드용으로, 생략됨 cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). 4-20 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 Rt 로드또는저장할레지스터입니다. Rn 메모리주소의기준이되는레지스터입니다. offset 오프셋입니다. offset 이생략되면주소는 Rn 의값입니다. Rm 오프셋으로사용할값이포함된레지스터입니다. Rm 은 r15 이면안됩니다. shift 선택적시프트입니다. 오프셋범위및아키텍처 4-16 페이지의표 4-2 에서는이러한명령어의오프셋범위와사용가능성을보여줍니다. 표 4-4 오프셋및아키텍처, LDR/STR( 사용자모드 ) 명령어 즉치오프셋 사후인덱싱된오프셋 +/-Rm a 시프트 아키텍처 ARM, 워드또는바이트 사용할수없음 -4095 ~ 4095 +/-Rm LSL #0-31 모두 LSR #1-32 ASR #1-32 ROR #1-31 RRX ARM, 부호있는바이트, 하프워드또는부호있는하프워드 사용할수없음 -255 ~ 255 +/-Rm 사용할수 없음 모두 32 비트 Thumb, 워드, 하프워드, 부호있는하프워드, 바이트또는부호있는바이트 0 ~ 255 사용할수없음사용할수없음 v6t2, v7 a. -Rm, +Rm 또는 Rm 을사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-21

ARM 및 Thumb 명령어 4.3.5 LDR(pc 기준 ) 레지스터로드. 주소는 pc 를기준으로한오프셋입니다. 참고 4-152 페이지의의사명령어도참조하십시오. 구문 LDR{type}{cond}{.W} Rt, label LDRD{cond} Rt, Rt2, label ; Doubleword 인수설명 : type 다음중하나일수있습니다. B 부호없는바이트 ( 로드시 32 비트로 0 확장 ) SB 부호있는바이트 (LDR 에만해당, 32 비트로부호확장 ) H 부호없는하프워드 ( 로드시 32 비트로 0 확장 ) SH 부호있는하프워드 (LDR 에만해당, 32 비트로부호확장 ) - 워드용으로, 생략됨 cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 )..W 선택적명령어너비지정자입니다. 자세한내용은 4-23 페이지의 Thumb-2 의 LDR(pc 기준 ) 을참조하십시오. Rt 로드또는저장할레지스터입니다. Rt2 로드또는저장할두번째레지스터입니다. label 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. label 은현재명령어의제한된거리안에있어야합니다. 자세한내용은 4-23 페이지의오프셋범위및아키텍처를참조하십시오. 4-22 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 오프셋범위및아키텍처 어셈블러는자동으로 pc 를기준으로오프셋을계산하며, label 이범위를벗어날경우오류를생성합니다. 표 4-5 에서는레이블과현재명령어사이의가능한오프셋을보여줍니다. 표 4-5 pc 기준오프셋 명령어오프셋범위아키텍처 ARM LDR, LDRB, LDRSB, LDRH, LDRSH a +/- 4095 모두 ARM LDRD +/- 255 v5te + 32 비트 Thumb LDR, LDRB, LDRSB, LDRH, LDRSH a +/- 4095 v6t2, v7 32 비트 Thumb LDRD +/- 1020 b v6t2, v7 16 비트 Thumb LDR c 0 ~ 1020 b 모든 T a. 워드로드의경우 Rt는 pc일수있습니다. pc로로드하면로드된주소로분기됩니다. ARMv4에서는로드된주소의비트 [1:0] 이 0b00이어야합니다. ARMv5 이상에서는비트 [1:0] 이 0b10이면안됩니다. 비트 [0] 이 1이면실행이 Thumb 상태에서계속되고, 그렇지않으면실행이 ARM 상태에서계속됩니다. b. 4의배수여야합니다. c. Rt는 r0 ~ r7 범위에있어야합니다. 바이트, 하프워드또는더블워드 16비트명령어는없습니다. Thumb-2 의 LDR(pc 기준 ).W 너비지정자를사용하여 Thumb-2 코드에서 32 비트명령어를생성하도록 LDR 에지시할수있습니다. LDR.W 는 16 비트 LDR 을사용하여타겟에도달할수있는경우에도항상 32 비트명령어를생성합니다. 정방향참조의경우,.W 가없는 LDR 은 32 비트 Thumb-2 LDR 명령어를사용하여도달할수있는타겟에서오류를발생시키는경우에도 Thumb 코드에서항상 16 비트명령어를생성합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-23

ARM 및 Thumb 명령어 더블워드레지스터제한 Thumb-2 명령어의경우, Rt 또는 Rt2에 sp 또는 pc를지정하면안됩니다. ARM 명령어의경우 Rt는짝수의레지스터여야합니다. Rt는 lr이면안됩니다. Rt에는 r12를사용하지않는것이좋습니다. Rt2는 R(t + 1) 이어야합니다. 4-24 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.3.6 ADR ADR 은즉치값을 pc 값에더하고결과를대상레지스터에기록합니다. 구문 ADR{cond}{.W} Rd,label 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 )..W 선택적명령어너비지정자입니다. 자세한내용은 4-26 페이지의 Thumb-2 의 ADR 을참조하십시오. Rd 로드할레지스터입니다. label 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. label 은현재명령어의제한된거리안에있어야합니다. 자세한내용은 4-26 페이지의오프셋범위및아키텍처를참조하십시오. 사용법 ADR 은주소가프로그램기준또는레지스터기준주소이기때문에위치독립적인코드를생성합니다. ADRL 의사명령어를사용하면더넓은범위의유효주소를어셈블할수있습니다 (4-153 페이지의 ADRL 의사명령어참조 ). label 이프로그램기준주소이면 ADR 명령어와동일한어셈블러영역에있는주소로평가되어야합니다 (7-69 페이지의 AREA 참조 ). ADR 을사용하여 BX 또는 BLX 명령어의타겟을생성하는경우타겟에 Thumb 명령어가포함되어있으면주소의 Thumb 비트 ( 비트 0) 를설정하는것은사용자의책임입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-25

ARM 및 Thumb 명령어 오프셋범위및아키텍처 어셈블러는자동으로 pc 를기준으로오프셋을계산하며, label 이범위를벗어날경우오류를생성합니다. 4-23 페이지의표 4-5 에서는레이블과현재명령어사이의가능한오프셋을보여줍니다. 표 4-6 pc 기준오프셋 명령어오프셋범위아키텍처 ARM ADR 자세한내용은 4-45 페이지의 Operand2 의상수를참조하십시오. 모두 32 비트 Thumb ADR +/- 4095 v6t2, v7 16 비트 Thumb ADR a 0 ~ 1020 b 모든 T a. Rd는 r0 ~ r7 범위에있어야합니다. b. 4의배수여야함 Thumb-2 의 ADR.W 너비지정자를사용하여 Thumb-2 코드에서 32 비트명령어를생성하도록 ADR 에지시할수있습니다..W 가있는 ADR 은주소가 16 비트명령어로생성될수있는경우에도항상 32 비트명령어를생성합니다. 정방향참조의경우,.W 가없는 ADR 은 32 비트 Thumb-2 ADD 명령어로생성할수있는주소에서오류를발생시킬수있는경우에도 Thumb 코드에서항상 16 비트명령어를생성합니다. 4-26 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.3.7 PLD 및 PLI 데이터및명령어사전로드. 프로세서는주소에서데이터나명령어를곧로드할것이라는신호를메모리시스템에보낼수있습니다. PLD 및 PLI 의구현은선택사항입니다. 두명령어는구현되어있지않은경우 NOP 로실행됩니다. 구문 PLtype{cond} [Rn {, #offset}] PLtype{cond} [Rn, +/-Rm {, shift}] PLtype{cond} label 인수설명 : type D( 데이터 ) 또는 I( 명령어 ) 입니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). 참고이명령어는 ARM 에서무조건명령어입니다. cond 는위의 IT 명령어를통해 Thumb-2 코드에서만사용할수있습니다. Rn 메모리주소의기준이되는레지스터입니다. offset 즉치오프셋입니다. 오프셋이생략되면주소는 Rn 의값입니다. Rm 오프셋으로사용할값이포함된레지스터입니다. Rm 은 r15 이면안됩니다. shift 선택적시프트입니다. label 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. 오프셋범위 오프셋은사전로드가발생하기전에 Rn의값에적용됩니다. 이결과는사전로드할메모리주소로사용됩니다. 허용되는오프셋범위는다음과같습니다. ARM 명령어의경우, -4095 ~ +4095 Thumb-2 명령어의경우, -255 ~ +4095 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-27

ARM 및 Thumb 명령어 어셈블러에서는자동으로 pc 를기준으로오프셋을계산하며, label 이범위를벗어날경우오류를생성합니다. 레지스터또는시프트된레지스터오프셋 ARM 에서는 Rn 의값에서 Rm 의값을더하거나뺍니다. Thumb-2 에서는 Rm 의값을 Rn 의값에더할수만있습니다. 이결과는사전로드할메모리주소로사용됩니다. 허용되는시프트범위는다음과같습니다. Thumb-2 명령어의경우, LSL 0 ~ 3 ARM 명령어의경우다음중하나입니다. LSL 0 ~ 31 LSR 1 ~ 32 ASR 1 ~ 32 ROR 1 ~ 31 RRX 사전로드할주소정렬 사전로드명령어에대해서는정렬검사가수행되지않습니다. 아키텍처 ARM PLD 는 ARMv5TE 이상에서사용할수있고 ARM PLI 는 ARMv7 에서사용할수있습니다. 32 비트 Thumb PLD 는 ARMv6T2 이상에서사용할수있고 32 비트 Thumb PLI 는 ARMv7 에서사용할수있습니다. 16 비트 Thumb PLD 또는 PLI 명령어는없습니다. 4-28 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.3.8 LDM 및 STM 다중레지스터로드및저장. ARM 상태에서는레지스터 r0 ~ r15 의모든조합을전송할수있지만 Thumb 상태에서는일부조합을전송하지못할수있습니다. 4-32 페이지의 PUSH 및 POP 도참조하십시오. 구문 op{addr_mode}{cond} Rn{!}, reglist{^} 인수설명 : op 다음중하나일수있습니다. LDM STM 다중레지스터로드 다중레지스터저장 addr_mode 다음중하나입니다. IA 각전송후에주소를증가시킵니다. 기본값이며생략할수있습니다. IB 각전송전에주소를증가시킵니다 (ARM 에만해당 ). DA 각전송후에주소를감소시킵니다 (ARM 에만해당 ). DB 각전송전에주소를감소시킵니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rn 기준레지스터로, 전송할초기주소가들어있는 ARM 레지스터입니다. Rn 은 r15 이면안됩니다.! 선택적접미사입니다.! 기호가있을경우최종주소가 Rn 에다시기록됩니다. reglist 로드또는저장할하나이상의레지스터가포함된목록으로, 중괄호로묶입니다. 이목록에는레지스터범위가포함될수도있습니다. 이목록에하나이상의레지스터나레지스터범위가포함될경우쉼표로구분해야합니다 (4-31 페이지의예제참조 ). 자세한내용은 4-30 페이지의 32 비트 Thumb-2 명령어의 reglist 에대한제한을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-29

ARM 및 Thumb 명령어 ^ ARM 상태에서만사용할수있는선택적접미사로, 사용자모드나시스템모드에서는사용할수없습니다. 이접미사의용도는다음과같습니다. 명령어가 LDM( 또는 LDMIA) 이고 reglist에일반다중레지스터전송외에도 pc(r15) 가포함되어있는경우 SPSR이 CPSR로복사됩니다. 이는예외처리기에서복귀하기위한것으로, 예외모드에서만사용해야합니다. 또는현재모드레지스터대신사용자모드레지스터내부또는외부로데이터를전송합니다. 32 비트 Thumb-2 명령어의 reglist 에대한제한 32비트 Thumb-2 명령어의경우 목록에 SP를포함할수없습니다. STM 명령어의목록에 pc를포함할수없습니다. LDM 명령어의목록에 pc와 LR을둘다포함할수없습니다. 이목록에는둘이상의레지스터가있어야합니다. reglist 에서레지스터를하나만사용하여 STM 또는 LDM 명령어를기록하는경우어셈블러에서해당하는 STR 또는 LDR 명령어를자동으로대체합니다. 디스어셈블리목록을소스코드와비교할때는이러한사항에주의해야합니다. --diag_warning 1645 어셈블러명령행옵션을사용하여명령어대체가발생하는시기를확인할수있습니다. 16 비트명령어 이러한명령어의 16 비트버전하위세트는 Thumb-2 코드및다른 Thumb 사용가능프로세서의 Thumb 코드에서사용할수있습니다. 16비트명령어에는다음제한이적용됩니다. reglist의모든레지스터가 Lo 레지스터여야합니다. Rn이 Lo 레지스터여야합니다. addr_mode가생략되어야하거나 IA여야합니다. 즉, 각전송후에주소가증가해야합니다. 쓰기되돌림을지정해야합니다. 4-30 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 또한 PUSH 및 POP 명령어를이형식으로표시할수있습니다. 일부형식의 PUSH 및 POP 은 16 비트명령어이기도합니다. 자세한내용은 4-32 페이지의 PUSH 및 POP 을참조하십시오. 참고 이러한 16 비트명령어는 Thumb-2EE 에서사용할수없습니다. pc로로드 pc로로드하면로드된주소에있는명령어로분기됩니다. ARMv4에서는로드된주소의비트 [1:0] 이 0b00이어야합니다. ARMv5T 이상의경우 비트 [1:0] 은 0b10이면안됩니다. 비트 [0] 이 1이면실행이 Thumb 상태에서계속됩니다. 비트 [0] 이 0이면실행이 ARM 상태에서계속됩니다. 쓰기되돌림을사용하여기준레지스터로드및저장 ARM 코드또는 Thumb-1 코드에서 Rn 이 reglist 에있고! 접미사로쓰기되돌림이지정될경우다음사항이적용됩니다. 명령어가 STM 또는 STMIA 이고 Rn 이 reglist 에서가장작은숫자의레지스터일경우 Rn 의초기값이저장됩니다. Rn 의로드되거나저장된값은신뢰할수없습니다. Thumb-2 코드에서 Rn 이 reglist 에있고! 접미사로쓰기되돌림이지정될경우다음사항이적용됩니다. 모든 32 비트명령어를예상할수없습니다. 16 비트명령어는 Thumb-1 코드에서와동일한방식으로동작하지만이러한명령어는향후사용할수없습니다. 예제 LDM r8,{r0,r2,r9} ; LDMIA is a synonym for LDM STMDB r1!,{r3-r6,r11,r12} ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-31

ARM 및 Thumb 명령어 올바르지않은예제 STM r5!,{r5,r4,r9} ; value stored for r5 unpredictable LDMDA r2, {} ; must be at least one register in list 4.3.9 PUSH 및 POP 전체내림차순스택에레지스터푸시및전체내림차순스택에서레지스터팝 구문 PUSH{cond} reglist POP{cond} reglist 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). reglist 레지스터가포함된비어있지않은목록으로, 중괄호로묶입니다. 이목록에는레지스터범위가포함될수도있습니다. 이목록에하나이상의레지스터나레지스터범위가포함될경우쉼표로구분해야합니다. 사용법 PUSH 와 POP 은기준레지스터가 r13(sp) 이고조정된주소가기준레지스터에다시기록된 STMDB 와 LDM( 또는 LDMIA) 의동의어입니다. 이러한경우권장되는니모닉은 PUSH 와 POP 입니다. 레지스터는스택에번호순서대로저장됩니다. 즉, 가장낮은번호의레지스터가최하위주소에저장됩니다. 4-32 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 pc 가있는 reglist 를사용하는 POP 이명령어는스택에서 pc 로팝된주소로분기를생성합니다. 일반적으로이분기는시작위치에있는스택에 lr 이푸시된하위루틴에서되돌아옵니다. ARMv5T 이상의경우 비트 [1:0] 은 0b10이면안됩니다. 비트 [0] 이 1이면실행이 Thumb 상태에서계속됩니다. 비트 [0] 이 0이면실행이 ARM 상태에서계속됩니다. ARMv4 에서는로드된주소의비트 [1:0] 이 0b00 이어야합니다. 상태를변경하는데 POP 을사용할수없습니다. 16 비트명령어 이러한명령어의 16 비트버전하위세트는 Thumb-2 코드및다른 Thumb 사용가능프로세서의 Thumb 코드에서사용할수있습니다. 16 비트명령어에는다음제한이적용됩니다. PUSH 에 LR 이포함될수있고 POP 에 pc 가포함될수있다는점을제외하고 reglist 에있는모든레지스터가 Lo 레지스터여야합니다. 예제 PUSH PUSH POP {r0,r4-r7} {r2,lr} {r0,r10,pc} ; no 16-bit version available ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-33

ARM 및 Thumb 명령어 4.3.10 RFE 예외에서복귀 구문 RFE{addr_mode}{cond} Rn{!} 인수설명 : addr_mode 다음중하나입니다. IA 각전송후에주소를증가시킵니다 ( 전체내림차순스택 ). IB 각전송전에주소를증가시킵니다 (ARM 에만해당 ). DA 각전송후에주소를감소시킵니다 (ARM 에만해당 ). DB 각전송전에주소를감소시킵니다. addr_mode 가생략된경우기본적으로각전송후에주소를증가시킵니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). 참고 이명령어는 ARM 에서무조건명령어입니다. cond 는위의 IT 명령어를통해 Thumb-2 코드에서만사용할수있습니다. Rn 기준레지스터를지정합니다. Rn 에 r15 를사용하면안됩니다.! 선택적접미사입니다.! 기호가있을경우최종주소가 Rn 에다시기록됩니다. 사용법 이전에 SRS 명령어 (4-36 페이지의 SRS 참조 ) 를사용하여반환상태를저장한경우 RFE 를사용하여예외에서복귀할수있습니다. Thumb-2EE 에서는기준레지스터의값이 0 일경우실행이 HandlerBase - 4 에서 NullCheck 처리기로분기됩니다. 연산 Rn 에들어있는주소와그다음주소에서 pc 와 CPSR 을로드하고, 경우에따라 Rn 을업데이트합니다. 4-34 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 참고정보 RFE 는 pc 에주소를기록합니다. 이주소는다음과같이예외반환후사용중인명령어세트를기준으로올바로정렬되어야합니다. ARM 으로복귀할경우 pc 에기록된주소가워드로정렬되어야합니다. Thumb-2 로복귀할경우 pc 에기록된주소가하프워드로정렬되어야합니다. Jazelle 로복귀할경우 pc 에기록된주소의정렬에대한제한이없습니다. 이러한규칙을위반하면예상할수없는결과가발생합니다. 그러나유효한예외엔트리메커니즘후에이명령어를사용하여복귀한경우소프트웨어에서특별한예방조치를취하지않아도됩니다. 주소가워드로정렬되지않은경우 RFE 는 Rn 의최하위 2 비트를무시합니다. RFE 가생성하는메모리의개별워드에액세스하는시간순서는아키텍처면에서정의되지않습니다. 따라서액세스순서가중요한, 메모리에매핑된 I/O 위치에대해서는이명령어를사용하면안됩니다. mode 에의해사용자모드가지정될경우 CPSR 에쓰기에대해일반규칙이적용됩니다. 자세한내용은 ARM 아키텍처참조문서를참조하십시오. mode 에의해모니터모드가지정될경우예상할수없는결과가발생합니다 (4-141 페이지의 SMC 참조 ). 아키텍처 이 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이명령어의 16 비트버전은없습니다. 예제 RFE r13! ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-35

ARM 및 Thumb 명령어 4.3.11 SRS 반환상태저장 구문 SRS{addr_mode}{cond} {r13{!}}, #modenum 인수설명 : addr_mode 다음중하나입니다. IA 각전송후에주소를증가시킵니다. IB 각전송전에주소를증가시킵니다 (ARM 에만해당 ). DA 각전송후에주소를감소시킵니다 (ARM 에만해당 ). DB 각전송전에주소를감소시킵니다. addr_mode 가생략된경우기본적으로각전송후에주소를증가시킵니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). 참고이명령어는 ARM 에서무조건명령어입니다. cond 는위의 IT 명령어를통해 Thumb-2 코드에서만사용할수있습니다.! 선택적접미사입니다.! 기호가있을경우최종주소가 modenum 에의해지정된모드의 r13 에다시기록됩니다. modenum 해당뱅크 r13 이기준레지스터로사용되는모드의번호를지정합니다 (2-5 페이지의프로세서모드참조 ). 연산 SRS 는현재모드의 r14 와 SPSR 을 modenum 에의해지정된모드의 r13 에들어있는주소와그다음워드에각각저장하고, 경우에따라 modenum 에의해지정된모드의 r13 을업데이트합니다. 이명령어는스택액세스를위한일반적인용도의 STM 명령어와함께사용할수있습니다 (4-29 페이지의 LDM 및 STM 참조 ). 사용법 SRS 를사용하면자동으로선택된스택이아닌다른스택에예외처리기의반환상태를저장할수있습니다. 4-36 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 Thumb-2EE 에서는기준레지스터의값이 0 일경우실행이 HandlerBase - 4 에서 NullCheck 처리기로분기됩니다. 참고정보 주소가워드로정렬되지않은경우 SRS 는지정된주소의최하위 2 비트를무시합니다. SRS 가생성하는메모리의개별워드에액세스하는시간순서는아키텍처면에서정의되지않습니다. 따라서액세스순서가중요한, 메모리에매핑된 I/O 위치에대해서는이명령어를사용하면안됩니다. 사용자및시스템모드에서는 SPSR 이없으므로 SRS 를예상할수없습니다. 아키텍처 이 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이명령어의 16 비트버전은없습니다. 예제 R13_usr EQU 16 SRSFD #R13_usr ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-37

ARM 및 Thumb 명령어 4.3.12 LDREX 및 STREX 단독레지스터로드및저장 구문 LDREX{cond} Rt, [Rn {, #offset}] STREX{cond} Rd, Rt, [Rn {, #offset}] LDREXB{cond} Rt, [Rn] STREXB{cond} Rd, Rt, [Rn] LDREXH{cond} Rt, [Rn] STREXH{cond} Rd, Rt, [Rn] LDREXD{cond} Rt, Rt2, [Rn] STREXD{cond} Rd, Rt, Rt2, [Rn] 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 반환된상태에대한대상레지스터입니다. Rt 로드또는저장할레지스터입니다. Rt2 더블워드를로드또는저장할두번째대상레지스터입니다. Rn 메모리주소의기준이되는레지스터입니다. offset Rn 의값에적용되는오프셋입니다. offset 은 Thumb-2 명령어에서만사용할수있습니다. offset 이생략될경우오프셋은 0 으로간주됩니다. LDREX LDREX 는메모리에서데이터를로드합니다. 실제주소에공유 TLB 특성이있을경우, LDREX 는실제주소를현재프로세서의단독액세스로태그설정하고다른모든실제주소에서이프로세서의단독액세스태그를지웁니다. 또는실행프로세서에미결정태그가설정된실제주소가있다는사실을태그설정합니다. 4-38 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 STREX STREX 는메모리에대한조건부저장을수행합니다. 조건은다음과같습니다. 실제주소에공유 TLB 특성이없고실행프로세서에미결정태그가설정된실제주소가있는경우저장작업이수행되고태그가지워지며 Rd 에서값 0 이반환됩니다. 실제주소에공유 TLB 특성이없고실행프로세서에미결정태그가설정된실제주소가없는경우저장작업이수행되지않고 Rd 에서값 1 이반환됩니다. 실제주소에공유 TLB 특성이있고실제주소가실행프로세서의단독액세스로태그설정된경우저장작업이수행되고태그가지워지며 Rd 에서값 0 이반환됩니다. 실제주소에공유 TLB 특성이있고실제주소가실행프로세서의단독액세스로태그설정되지않은경우저장작업이수행되지않고 Rd 에서값 1 이반환됩니다. 제한 offset 은 ARM 명령어에서사용할수없습니다. offset 의값은 0 ~ 1020 범위에있는 4 의배수일수있습니다. Rd, Rt, Rt2 또는 Rn 에 r15 를사용하면안됩니다. STREX 의경우, Rd 가 Rt, Rt2 또는 Rn 과동일한레지스터이면안됩니다. LDREX 의경우, Rt 와 Rt2 가동일한레지스터이면안됩니다. ARM 명령어의경우 Rt가짝수의레지스터여야하고 r14이면안됩니다. Rt2가 R(d+1) 이어야합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-39

ARM 및 Thumb 명령어 사용법 LDREX 및 STREX 를사용하여다중프로세서와공유메모리시스템에서프로세서간통신을구현합니다. 성능상의이유로해당 LDREX 명령어와 STREX 명령어사이의명령어수를최소로유지해야합니다. 참고 STREX 명령어에사용된주소는가장최근에실행된 LDREX 명령어에사용된주소와같아야합니다. 다른주소에대해 STREX 명령어를실행하면예상할수없는결과가발생합니다. 아키텍처 ARM LDREX 및 STREX 는 ARMv6 이상에서사용할수있습니다. ARM LDREXB, LDREXH, LDREXD, STREXB, STREXD 및 STREXH 는 ARMv6K 이상에서사용할수있습니다. LDREXD 와 STREXD 를 ARMv7-M 프로파일에서사용할수없다는점을제외하고이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서모두사용할수있습니다. 이러한명령어의 16 비트버전은없습니다. 예제 MOV r1, #0x1 ; load the ëlock takení value try LDREX r0, [LockAddr] ; load the lock value CMP r0, #0 ; is the lock free? STREXEQ r0, r1, [LockAddr] ; try and claim the lock CMPEQ r0, #0 ; did this succeed? BNE try ; no - try again... ; yes - we have the lock 4-40 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.3.13 CLREX 단독지우기주소에단독액세스에대한요청이들어있는실행프로세서의지역레코드를지웁니다. 구문 CLREX{cond} 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). 참고이명령어는 ARM 에서무조건명령어입니다. cond 는위의 IT 명령어를통해 Thumb-2 코드에서만사용할수있습니다. 사용법 CLREX 명령어를사용하여밀접하게결합된단독액세스모니터를공개액세스상태로되돌립니다. 이렇게하면메모리를위한더미저장소가필요없게됩니다. 동기화기본형식지원에대한자세한내용은 ARM 아키텍처참조문서를참조하십시오. CLREX 가주소에단독액세스에대한요청이들어있는실행프로세서의전역레코드도지우는지여부는구현시정의됩니다. 아키텍처이 ARM 명령어는 ARMv6K 이상에서사용할수있습니다. 이 32비트 Thumb-2 명령어는 ARMv6K 이상의 T 변형에서사용할수있습니다. 16비트 Thumb CLREX 명령어는없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-41

ARM 및 Thumb 명령어 4.3.14 SWP 및 SWPB 레지스터와메모리간데이터스왑 구문 SWP{B}{cond} Rt, Rt2, [Rn] 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). B 선택적접미사입니다. B 가있으면바이트가스왑되고, 그렇지않으면 32 비트워드가스왑됩니다. Rt 대상레지스터입니다. Rt2 소스레지스터입니다. Rt2 는 Rt 와동일한레지스터일수있습니다. Rn 메모리에주소를포함합니다. Rn 은 Rt 및 Rt2 둘다와다른레지스터여야합니다. 사용법 SWP 및 SWPB 를사용하여세마포를구현할수있습니다. 메모리에있는데이터가 Rt 로로드됩니다. Rt2 의내용이메모리에저장됩니다. Rt2 가 Rt 와동일한레지스터이면레지스터의내용과메모리위치의내용이스왑됩니다. 참고 ARMv6 이상에서는 SWP 및 SWPB 를향후사용할수없습니다. ARMv6 이상에서더복잡한세마포를구현하는명령어에대해서는 4-38 페이지의 LDREX 및 STREX 를참조하십시오. 아키텍처 이러한 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. Thumb SWP 또는 SWPB 명령어는없습니다. 4-42 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4 일반데이터처리명령어 이단원에는다음소단원이포함되어있습니다. 4-44페이지의유연한두번째피연산자 4-48페이지의 ADD, SUB, RSB, ADC, SBC 및 RSC 각각 carry를포함하거나포함하지않은더하기, 빼기및역방향빼기 4-52페이지의 SUBS pc, LR 스택을팝하지않고예외에서복귀 4-53페이지의 AND, ORR, EOR, BIC 및 ORN 논리 AND, OR, 배타적 OR, OR NOT 및비트지우기 4-56페이지의 CLZ 선행 0 수계산 4-57페이지의 CMP 및 CMN 비교및음수비교 4-59페이지의 MOV 및 MVN 이동및이동하지않음. 4-62페이지의 MOVT 맨위로이동, 광역 4-63페이지의 TST 및 TEQ 테스트및동등테스트 4-65페이지의 SEL APSR GE 플래그의상태에따라각피연산자에서바이트선택 4-67페이지의 REV, REV16, REVSH 및 RBIT 바이트또는비트반전 4-69페이지의 ASR, LSL, LSR, ROR 및 RRX 오른쪽으로산술시프트 4-71페이지의 IT If-Then. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-43

ARM 및 Thumb 명령어 4-74페이지의 SDIV 및 UDIV 부호있는나누기및부호없는나누기 4.4.1 유연한두번째피연산자 대부분의 ARM 및 Thumb-2 일반데이터처리명령어에는유연한두번째피연산자가있습니다. 이피연산자는각명령어의구문에대한설명에 Operand2 로표시됩니다. ARM 명령어와 Thumb-2 명령어의 Operand2 에대해허용되는옵션에는몇가지차이점이있습니다. 구문 Operand2에는다음두가지형식을사용할수있습니다. #constant Rm{, shift} 인수설명 : constant 숫자상수로평가되는식입니다. ARM 과 Thumb-2 에서사용할수있는상수의범위는동일하지않습니다. 자세한내용은 4-45 페이지의 Operand2 의상수를참조하십시오. Rm 두번째피연산자에대한데이터가들어있는 ARM 레지스터입니다. 레지스터내의비트패턴은다양한방법으로시프트하거나회전할수있습니다. shift Rm 에적용할선택적시프트로. 다음중하나일수있습니다. ASR #n n 비트만큼오른쪽으로산술시프트. 1 n 32. LSL #n n 비트만큼왼쪽으로논리시프트. 0 n 31. LSR #n n 비트만큼오른쪽으로논리시프트. 1 n 32. ROR #n n 비트만큼오른쪽으로회전. 1 n 31. RRX. 확장포함 1 비트만큼오른쪽으로회전합니다. type Rs ARM 에서만사용할수있습니다. 다음은각요소에대한설명입니다. type ASR, LSL, LSR, ROR 중하나입니다. Rs 시프트양을제공하는 ARM 레지스터입니다. 최하위바이트만사용됩니다. 4-44 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 참고 시프트연산의결과는명령어의 Operand2 로사용되지만 Rm 자체는변경되지않습니다. Operand2 의상수 ARM 명령어에서는 32 비트워드내에서임의의짝수비트수만큼 8 비트값을오른쪽으로회전하여얻을수있는모든값을 constant 에지정할수있습니다. 32 비트 Thumb-2 명령어에서 constant 는다음중하나일수있습니다. 32 비트워드내에서임의의비트수만큼 8 비트값을왼쪽으로시프트하여얻을수있는모든상수 0x00XY00XY 형식의모든상수 0xXY00XY00 형식의모든상수 0xXYXYXYXY 형식의모든상수 이외에도일부명령어에서는 constant 에더넓은범위의값을지정할수있습니다. 이러한상수에대한자세한내용은각명령어에대한설명을참조하십시오. 2, 4 또는 6 비트만큼 8 비트값을회전하여얻은상수는 ARM 데이터처리명령어에서만사용할수있고 Thumb-2 에서는사용할수없습니다. 이외의다른모든 ARM 상수는 Thumb-2 에서도사용할수있습니다. ASR n 비트만큼오른쪽으로산술시프트는내용이 2 의보수부호있는정수로간주될경우 Rm 에들어있는값을 2 n 으로나눕니다. 원래비트 [31] 은레지스터의 n 비트왼쪽에복사됩니다. LSR 및 LSL n 비트만큼오른쪽으로논리시프트는내용이부호없는정수로간주될경우 Rm 에들어있는값을 2 n 으로나눕니다. 레지스터의왼쪽 n 비트는 0 으로설정됩니다. n 비트만큼왼쪽으로논리시프트는내용이부호없는정수로간주될경우 Rm 에들어있는값을 2 n 으로곱합니다. 이경우경고없이오버플로가발생할수있습니다. 레지스터의오른쪽 n 비트는 0 으로설정됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-45

ARM 및 Thumb 명령어 ROR n 비트만큼오른쪽으로회전은레지스터의오른쪽 n 비트를결과의왼쪽 n 비트로이동합니다. 이때다른모든비트도 n 비트만큼오른쪽으로이동합니다 (4-46 페이지의그림 4-1 참조 ). 31 1 0... Carry Flag 그림 4-1 ROR RRX 확장포함오른쪽으로회전은 Rm 의내용을 1 비트만큼오른쪽으로회전합니다. carry 플래그는 Rm 의비트 [31] 로복사됩니다 ( 그림 4-2 참조 ). S 접미사가지정된경우 Rm 의이전비트 [0] 값이 carry 플래그로시프트됩니다 (carry 플래그참조 ). 31 30 1 0 Carry Flag...... 그림 4-2 RRX carry 플래그 명령어가다음중하나일경우 carry 플래그는 Rm에서시프트된마지막비트로업데이트됩니다. S 접미사를사용하는경우, MOV, MVN, AND, ORR, ORN, EOR 또는 BIC S 접미사가필요없는경우, TEQ 또는 TST 4-46 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 명령어대체 일부명령어쌍 (ADD 와 SUB, ADC 와 SBC, AND 와 BIC, MOV 와 MVN, CMP 와 CMN) 은 constant 의부정이나논리반전을제외하고서로동일합니다. constant 값을사용할수없지만해당논리반전이나부정을사용할수있는경우어셈블러는둘중한명령어를대체하고 constant 를반전시키거나부정합니다. 디스어셈블리목록을소스코드와비교할때는이러한사항에주의해야합니다. --diag_warning 1645 어셈블러명령행옵션을사용하여명령어대체가발생하는시기를확인할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-47

ARM 및 Thumb 명령어 4.4.2 ADD, SUB, RSB, ADC, SBC 및 RSC 각각 carry 를포함하거나포함하지않은더하기, 빼기및역방향빼기 4-102 페이지의병렬더하기및빼기도참조하십시오. 구문 op{s}{cond} {Rd}, Rn, Operand2 op{cond} {Rd}, Rn, #imm12 ; Thumb-2 only 인수설명 : op 다음중하나입니다. ADD 더하기 ADC carry 포함더하기 SUB 빼기 RSB 역방향빼기 SBC carry 포함빼기 RSC carry 포함역방향빼기 (ARM에만해당 ) S 선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 첫번째피연산자가들어있는레지스터입니다. Operand2 imm12 유연한두번째피연산자입니다. 옵션에대한자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. 0 ~ 4095 범위에있는값입니다. Thumb-2 코드에서 ADD 및 SUB 명령어에만허용됩니다. 사용법 ADD 명령어는 Rn 의값과 Operand2 의값을더합니다. SUB 명령어는 Rn 의값에서 Operand2 의값을뺍니다. RSB( 역방향빼기 ) 명령어는 Operand2 의값에서 Rn 의값을뺍니다. 이명령어는 Operand2 의다양한옵션때문에유용합니다. 4-48 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 ADC, SBC 및 RSC 를사용하여복수워드산술을통합할수있습니다 (4-51 페이지의복수워드산술예제참조 ). ADC(carry 포함더하기 ) 명령어는 carry 플래그와함께 Rn 의값과 Operand2 의값을더합니다. SBC(carry 포함빼기 ) 명령어는 Rn 의값에서 Operand2 의값을뺍니다. carry 플래그가지워지면결과는 1 씩감소합니다. RSC(carry 포함역방향빼기 ) 명령어는 Operand2 의값에서 Rn 의값을뺍니다. carry 플래그가지워지면결과는 1 씩감소합니다. 경우에따라어셈블러가한명령어를다른명령어로대체할수있습니다. 디스어셈블리목록을읽을때는이러한사항에주의해야합니다. 자세한내용은 4-47 페이지의명령어대체를참조하십시오. Thumb-2 명령어에서 r15 사용 이러한명령어에서는대부분의경우 Rd 또는피연산자에 r15 를사용할수없습니다. 예외적으로 0 ~ 4095 범위에있는상수 Operand2 값을사용하고 S 접미사가없는 ADD 및 SUB 명령어에서는 Rn 에 r15 를사용할수있습니다. 이러한명령어는 pc 상대주소를생성하는데유용합니다. 이경우 pc 값의비트 [1] 이 0 으로읽히므로계산할기본주소는항상워드로정렬됩니다. 4-52 페이지의 SUBS pc, LR 도참조하십시오. 4-25 페이지의 ADR 도참조하십시오. ARM 명령어에서 r15 사용 r15 를 Rn 으로사용하면명령어주소에 8 을더한값이사용됩니다. r15를 Rd로사용할경우다음사항이적용됩니다. 실행이결과에해당하는주소로분기됩니다. S 접미사를사용하면현재모드의 SPSR이 CPSR로복사됩니다. 이접미사를사용하여예외에서복귀할수있습니다 (RealView Compilation Tools 개발자설명서의 6장프로세서예외처리참조 ). 4-25 페이지의 ADR 도참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-49

ARM 및 Thumb 명령어 주의 사용자모드또는시스템모드에서 r15 를 Rd 로사용할경우 S 접미사를사용하면안됩니다. 이러한명령어를실행하면예상할수없는결과가발생하지만어셈블러에서어셈블리타임에경고를표시할수없습니다. 레지스터에의해제어된시프트가있는데이터처리명령어에서는 Rd 또는피연산자에 r15 를사용할수없습니다 (4-44 페이지의유연한두번째피연산자참조 ). 조건플래그 S 를지정하면이러한명령어가결과에따라 N, Z, C 및 V 플래그를업데이트합니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. ADDS Rd, Rn, #imm imm 범위 0 ~ 7. Rd 및 Rn 은모두 Lo 레지스터여야합니다. ADDS Rd, Rn, Rm Rd, Rn 및 Rm 은모두 Lo 레지스터여야합니다. ADD Rd, Rd, Rm ARMv6 이하의경우 Rd 나 Rm 중하나이상이 Hi 레지스터여야합니다. ARMv6T2 이상의경우이제한이적용되지않습니다. ADDS Rd, Rd, #imm imm 범위 0 ~ 255. Rd 는 Lo 레지스터여야합니다. ADCS Rd, Rd, Rm Rd, Rn 및 Rm 은모두 Lo 레지스터여야합니다. ADD SP, SP, #imm imm 범위 0 ~ 508( 워드로정렬됨 ) ADD Rd, SP, #imm ADD Rd, pc, #imm imm 범위 0 ~ 1020( 워드로정렬됨 ). Rd 는 Lo 레지스터여야합니다. imm 범위 0 ~ 1020( 워드로정렬됨 ). Rd 는 Lo 레지스터여야합니다. 이명령어에서 pc 의비트 [1:0] 은 0 으로읽습니다. SUBS Rd, Rn, Rm Rd, Rn 및 Rm 은모두 Lo 레지스터여야합니다. SUBS Rd, Rn, #imm imm 범위 0 ~ 7. Rd 및 Rn 은모두 Lo 레지스터여야합니다. SUBS Rd, Rd, #imm imm 범위 0 ~ 255. Rd 는 Lo 레지스터여야합니다. 4-50 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 SBCS Rd, Rd, Rm Rd, Rn 및 Rm 은모두 Lo 레지스터여야합니다. SUB SP, SP, #imm imm 범위 0 ~ 508( 워드로정렬됨 ) RSBS Rd, Rn, #0 Rd 및 Rn 은모두 Lo 레지스터여야합니다. 예제 ADD r2, r1, r3 SUBS r8, r6, #240 ; sets the flags on the result RSB r4, r4, #1280 ; subtracts contents of r4 from 1280 ADCHI r11, r0, r3 ; only executed if C flag set and Z ; flag clear RSCSLE r0,r5,r0,lsl r4 ; conditional, flags set 올바르지않은예제 RSCSLE r0,r15,r0,lsl r4 ; r15 not permitted with register ; controlled shift 복수워드산술예제 이러한두명령어는 r2 및 r3 에들어있는 64 비트정수를 r0 및 r1 에포함된다른 64 비트정수에더하고결과를 r4 및 r5 에배치합니다. ADDS r4, r0, r2 ; adding the least significant words ADC r5, r1, r3 ; adding the most significant words 이러한명령어는다른정수에서 96 비트정수를뺍니다. SUBS SBCS SBC r3, r6, r9 r4, r7, r10 r5, r8, r11 다시말하면위예제에서는복수워드값에연속레지스터를사용합니다. 이작업을수행할필요는없습니다. 예를들어다음예제는완전히유효합니다. SUBS SBCS SBC r6, r6, r9 r9, r2, r1 r2, r8, r11 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-51

ARM 및 Thumb 명령어 4.4.3 SUBS pc, LR 스택을팝하지않고예외반환 참고이명령어는 Thumb-2 에서특별한경우의명령어입니다. ARM 코드에서동일한명령어를 4-48 페이지의 ADD, SUB, RSB, ADC, SBC 및 RSC 에서설명하는 SUB 명령어의일반형식으로사용할수있습니다. 구문 SUBS{cond} pc, LR, #imm 인수설명 : imm 즉치상수입니다. Thumb-2 코드에서는범위 0 ~ 255 로제한되고 ARM 코드에서는유연한두번째피연산자입니다. 자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). 사용법 스택에반환상태가없는경우 SUBS pc, LR 을사용하여예외에서복귀할수있습니다. SUBS pc, LR 은링크레지스터에서값을빼고 pc 에결과를로드한후 SPSR 을 CPSR 로복사합니다. 참고정보 SUBS pc, LR 은 pc 에주소를기록합니다. 이주소는다음과같이예외반환후사용중인명령어세트를기준으로올바로정렬되어야합니다. ARM 으로복귀할경우 pc 에기록된주소가워드로정렬되어야합니다. Thumb-2 로복귀할경우 pc 에기록된주소가하프워드로정렬되어야합니다. Jazelle 로복귀할경우 pc 에기록된주소의정렬에대한제한이없습니다. 이러한규칙을위반하면예상할수없는결과가발생합니다. 그러나유효한예외엔트리메커니즘후에이명령어를사용하여복귀한경우소프트웨어에서특별한예방조치를취하지않아도됩니다. 4-52 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 Thumb-2 에서 MOVS pc, lr 기호는 SUBS pc, lr, #0 의동의어입니다. 아키텍처 이 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 이명령어의 16 비트 Thumb 버전은없습니다. 4.4.4 AND, ORR, EOR, BIC 및 ORN 논리 AND, OR, 배타적 OR, 비트지우기및 OR NOT 구문 op{s}{cond} Rd, Rn, Operand2 인수설명 : op 다음중하나입니다. AND 논리 AND ORR 논리 OR EOR 논리배타적 OR BIC 논리 AND NOT ORN 논리 OR NOT(Thumb-에만해당 ) S 선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 첫번째피연산자가들어있는레지스터입니다. Operand2 유연한두번째피연산자입니다. 옵션에대한자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-53

ARM 및 Thumb 명령어 사용법 AND, EOR 및 ORR 명령어는 Rn 및 Operand2 의값에대해비트단위 AND, 배타적 OR 및 OR 연산을수행합니다. BIC( 비트지우기 ) 명령어는 Operand2 값의해당비트보수가포함된 Rn 의비트에대해 AND 연산을수행합니다. ORN Thumb-2 명령어는 Operand2 값의해당비트보수가포함된 Rn 의비트에대해 OR 연산을수행합니다. 경우에따라어셈블러가 BIC 를 AND 로, AND 를 BIC 로, ORN 을 ORR 로또는 ORR 을 ORN 으로대체할수있습니다. 디스어셈블리목록을읽을때는이러한사항에주의해야합니다. 자세한내용은 4-47 페이지의명령어대체를참조하십시오. Thumb-2 명령어에서 r15 사용 이러한명령어의 Rd 또는피연산자에 r15 를사용할수없습니다. ARM 명령어에서 r15 사용 참고 ARMv7 에서는이러한 ARM 명령어에서 r15 를향후사용할수없습니다. r15 를 Rn 으로사용하면명령어주소에 8 을더한값이사용됩니다. r15 를 Rd 로사용할경우다음사항이적용됩니다. 실행이결과에해당하는주소로분기됩니다. S 접미사를사용하면현재모드의 SPSR 이 CPSR 로복사됩니다. 이접미사를사용하여예외에서복귀할수있습니다 (RealView Compilation Tools 개발자설명서의 6 장프로세서예외처리참조 ). 주의사용자모드또는시스템모드에서 r15 를 Rd 로사용할경우 S 접미사를사용하면안됩니다. 이러한명령어를실행하면예상할수없는결과가발생하지만어셈블러에서어셈블리타임에경고를표시할수없습니다. 레지스터에의해제어된시프트가있는데이터처리명령어에서는피연산자에 r15 를사용할수없습니다 (4-44 페이지의유연한두번째피연산자참조 ). 4-54 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 조건플래그 S 를지정하면이러한명령어는다음을수행합니다. 결과에따라 N 및 Z 플래그를업데이트합니다. Operand2 를계산하는동안 C 플래그를업데이트할수있습니다 (4-44 페이지의유연한두번째피연산자참조 ). V 플래그를변경하지않습니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. ANDS Rd, Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. EORS Rd, Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. ORRS Rd, Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. BICS Rd, Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. 처음세경우에서는 OPS Rd, Rm, Rd 를지정하는지여부에관계없이명령어가동일합니다. ARM/Thumb-2 예제 AND r9,r2,#0xff00 ORREQ r2,r0,r5 EORS r0,r0,r3,ror r6 ANDS r9, r8, #0x19 EORS r7, r11, #0x18181818 BIC r0, r1, #0xab ORN r7, r11, r14, ROR #4 ORNS r7, r11, r14, ASR #32 올바르지않은예제 EORS r0,r15,r3,ror r6 ; r15 not permitted with register ; controlled shift ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-55

ARM 및 Thumb 명령어 4.4.5 CLZ 선행 0 수계산 구문 CLZ{cond} Rd, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd는 r15이면안됩니다. Rm 피연산자레지스터입니다. Rm은 r15이면안됩니다. 사용법 CLZ 명령어는 Rm 의값에서선행 0 수를계산하고 Rd 에결과를반환합니다. 결과값은소스레지스터에비트가설정되지않은경우 32 이고, 31 비트가설정된경우 0 입니다. 조건플래그 이명령어는플래그를변경하지않습니다. 아키텍처이 ARM 명령어는 ARMv5 이상에서사용할수있습니다. 이 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이명령어의 16비트 Thumb 버전은없습니다. 예제 CLZ CLZNE r4,r9 r2,r3 결과 Rd 값에의해왼쪽으로시프트된 Rm 이뒤에오는 CLZ Thumb-2 명령어를사용하여레지스터 Rm 값을표준화합니다. Rm 이 0 인경우 MOV 대신 MOVS 를사용하여플래그를설정합니다. CLZ r5, r9 MOVS r9, r9, LSL r5 4-56 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.6 CMP 및 CMN 비교및음수비교 구문 CMP{cond} Rn, Operand2 CMN{cond} Rn, Operand2 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rn 첫번째피연산자가들어있는 ARM 레지스터입니다. Operand2 유연한두번째피연산자입니다. 옵션에대한자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. 사용법 이러한명령어는레지스터값을 Operand2 와비교하며결과에서조건플래그를업데이트하지만레지스터에결과를배치하지않습니다. CMP 명령어는 Rn 의값에서 Operand2 의값을뺍니다. 이명령어는결과가버려진다는점을제외하고 SUBS 명령어와동일합니다. CMN 명령어는 Rn 의값에 Operand2 의값을더합니다. 이명령어는결과가버려진다는점을제외하고 ADDS 명령어와동일합니다. 경우에따라어셈블러에서 CMN 을 CMP 로또는 CMP 를 CMN 으로대체할수있습니다. 디스어셈블리목록을읽을때는이러한사항에주의해야합니다. 자세한내용은 4-47 페이지의명령어대체를참조하십시오. ARM 명령어에서 r15 사용 참고 ARMv7 에서는이러한 ARM 명령어에서 r15 를향후사용할수없습니다. r15 를 Rn 으로사용하면명령어주소에 8 을더한값이사용됩니다. 레지스터에의해제어된시프트가있는데이터처리명령어에서는피연산자에 r15 를사용할수없습니다 (4-44 페이지의유연한두번째피연산자참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-57

ARM 및 Thumb 명령어 Thumb-2 명령어에서 r15 사용 이러한명령어의피연산자에 r15 를사용할수없습니다. 조건플래그 이러한명령어는결과에따라 N, Z, C 및 V 플래그를업데이트합니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. CMP Rn, Rm CMN Rn, Rm Rn 및 Rm 은모두 Lo 레지스터여야합니다. CMP Rn, #imm Rn 은 Lo 레지스터여야합니다. imm 범위 0 ~ 255. 예제 CMP r2, r9 CMN r0, #6400 CMPGT r13, r7, LSL #2 올바르지않은예제 CMP r2, r15, ASR r0 ; r15 not permitted with register controlled shift 4-58 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.7 MOV 및 MVN 이동및이동하지않음 구문 MOV{S}{cond} Rd, Operand2 MOV{cond} Rd, #imm16 MVN{S}{cond} Rd, Operand2 인수설명 : S 선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Operand2 유연한두번째피연산자입니다. 옵션에대한자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. imm16 0 ~ 65535 범위에있는값입니다. 사용법 MOV 명령어는 Operand2 의값을 Rd 로복사합니다. MVN 명령어는 Operand2 값을가지고값에대해비트단위논리 NOT 연산을수행한후결과를 Rd 에배치합니다. 경우에따라어셈블러에서 MVN 을 MOV 로또는 MOV 를 MVN 으로대체할수있습니다. 디스어셈블리목록을읽을때는이러한사항에주의해야합니다. 자세한내용은 4-47 페이지의명령어대체를참조하십시오. Thumb-2 MOV 및 MVN 에서 r15 사용 Thumb-2 MOV 또는 MVN 명령어에서는 Rd 또는 Operand2 에 r15 를사용할수없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-59

ARM 및 Thumb 명령어 ARM MOV 및 MVN 에서 r15 사용 참고 MOV Rd,Rm 구문은 Rd 또는 Rn = pc 와함께사용할수있지만둘모두와함께사용할수는없습니다. 다른모든경우는 ARMv7 ARM 에서향후제공되지않을예정입니다. r15 를 Rd 로사용하면명령어주소에 8 을더한값이사용됩니다. r15 를 Rd 로사용할경우다음사항이적용됩니다. 실행이결과에해당하는주소로분기됩니다. S 접미사를사용하면현재모드의 SPSR 이 CPSR 로복사됩니다. 이접미사를사용하여예외에서복귀할수있습니다 (RealView Compilation Tools 개발자설명서의 6 장프로세서예외처리참조 ). 주의 사용자모드또는시스템모드에서 r15 를 Rd 로사용할경우 S 접미사를사용하면안됩니다. 이러한명령어를실행하면예상할수없는결과가발생하지만어셈블러에서어셈블리타임에경고를표시할수없습니다. 레지스터에의해제어된시프트가있는데이터처리명령어에서는 Rd 또는피연산자에 r15 를사용할수없습니다 (4-44 페이지의유연한두번째피연산자참조 ). 조건플래그 S 를지정하면이러한명령어는다음을수행합니다. 결과에따라 N 및 Z 플래그를업데이트합니다. Operand2 를계산하는동안 C 플래그를업데이트할수있습니다 (4-44 페이지의유연한두번째피연산자참조 ). V 플래그를변경하지않습니다. 4-60 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. MOVS Rd, imm. Rd 는 Lo 레지스터여야합니다. imm 범위 0 ~ 255. MOVS Rd, Rm. Rd 및 Rm 은모두 Lo 레지스터여야합니다. MOV Rd, Rm. ARMv5 이하에서는 Rd 또는 Rm 중하나이상이 Hi 레지스터여야합니다. ARMv6 이상에서는이제한이적용되지않습니다. 아키텍처 ARM 명령어의 #imm16 형식은 ARMv6T2 에서사용할수있습니다. ARM 명령어의다른형식은모든버전의 ARM 아키텍처에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 16 비트 Thumb 명령어는 ARM 아키텍처의모든 T 변형에서사용할수있습니다. 예제 MVNNE r11, #0xF000000B ; ARM only. This constant is not available in T2. 올바르지않은예제 MVN r15,r3,asr r0 ; r15 not permitted with register controlled shift ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-61

ARM 및 Thumb 명령어 4.4.8 MOVT 맨위로이동. 하위하프워드에영향을주지않고레지스터의상위하프워드에 16 비트즉치값을기록합니다. 구문 MOVT{cond} Rd, #immed_16 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd는 pc일수없습니다. immed_16 16비트즉치상수입니다. 사용법 MOVT 는 Rd[31:16] 에 immed_16 을기록합니다. 쓰기는 Rd[15:0] 에영향을주지않습니다. MOV, MOVT 명령어쌍을사용하여 32 비트상수를생성할수있습니다. 4-155 페이지의 MOV32 의사명령어도참조하십시오. 조건플래그 이명령어는플래그를변경하지않습니다. 아키텍처이 ARM 명령어는 ARMv6T2 이상에서사용할수있습니다. 이 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이명령어의 16비트 Thumb 버전은없습니다. 4-62 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.9 TST 및 TEQ 비트테스트및동등테스트 구문 TST{cond} Rn, Operand2 TEQ{cond} Rn, Operand2 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rn 첫번째피연산자가들어있는 ARM 레지스터입니다. Operand2 유연한두번째피연산자입니다. 옵션에대한자세한내용은 4-44 페이지의유연한두번째피연산자를참조하십시오. 사용법 이러한명령어는레지스터값을 Operand2 에대해테스트하며결과에서조건플래그를업데이트하지만레지스터에결과를배치하지않습니다. TST 명령어는 Rn 의값과 Operand2 의값에대해비트단위 AND 연산을수행합니다. 이명령어는결과가버려진다는점을제외하고 ANDS 명령어와동일합니다. TEQ 명령어는 Rn 의값과 Operand2 의값에대해비트단위배타적 OR 연산을수행합니다. 이명령어는결과가버려진다는점을제외하고 EORS 명령어와동일합니다. TEQ 명령어를사용하면 CMP 와마찬가지로 V 또는 C 플래그에영향을주지않고두값이동일한지여부를테스트할수있습니다. TEQ 는값의부호를테스트하는데도유용합니다. 비교후, N 플래그는두피연산자부호비트의논리배타적 OR 이됩니다. r15 사용 Thumb-2 TST 또는 TEQ 명령어에서는 Rn 또는 Operand2 에 r15 를사용할수없습니다. 이단원의나머지부분은 ARM 명령어에적용됩니다. r15 를 Rn 으로사용하면명령어주소에 8 을더한값이사용됩니다. 레지스터에의해제어된시프트가있는데이터처리명령어에서는피연산자에 r15 를사용할수없습니다 (4-44 페이지의유연한두번째피연산자참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-63

ARM 및 Thumb 명령어 조건플래그 이러한명령어는다음을수행합니다. 결과에따라 N 및 Z 플래그를업데이트합니다. Operand2 를계산하는동안 C 플래그를업데이트할수있습니다 (4-44 페이지의유연한두번째피연산자참조 ). V 플래그를변경하지않습니다. 16 비트명령어 TST 명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. TST Rn, Rm Rn 및 Rm 은모두 Lo 레지스터여야합니다. 예제 TST TEQEQ TSTNE r0, #0x3F8 r10, r9 r1, r5, ASR r1 올바르지않은예제 TEQ r15, r1, ROR r0 ; r15 not permitted with register ; controlled shift 4-64 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.10 SEL APSR GE 플래그의상태에따라각피연산자에서바이트선택 구문 SEL{cond} {Rd}, Rn, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 첫번째피연산자가들어있는레지스터입니다. Rm 두번째피연산자가들어있는레지스터입니다. 연산 SEL 명령어는다음과같이 APSR GE 플래그에따라 Rn 또는 Rm에서바이트를선택합니다. GE[0] 이설정되면 Rd[7:0] 을 Rn[7:0] 에서가져오고, 그렇지않으면 Rm[7:0] 에서가져옵니다. GE[1] 이설정되면 Rd[15:8] 을 Rn[15:8] 에서가져오고, 그렇지않으면 Rm[15:8] 에서가져옵니다. GE[2] 가설정되면 Rd[23:16] 을 Rn[23:16] 에서가져오고, 그렇지않으면 Rm[23:16] 에서가져옵니다. GE[3] 이설정되면 Rd[31:24] 를 Rn[31:24] 에서가져오고, 그렇지않으면 Rm[31:24] 에서가져옵니다. 사용법 Rd, Rn 또는 Rm에 r15를사용하면안됩니다. 부호있는병렬명령어중하나다음에 SEL 명령어를사용합니다 (4-102 페이지의병렬더하기및빼기참조 ). 이명령어를사용하면복수바이트또는하프워드데이터에서최대값또는최소값을선택할수있습니다. 조건플래그 이명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-65

ARM 및 Thumb 명령어 아키텍처 이 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이명령어의 16 비트 Thumb 버전은없습니다. 예제 SEL SELLT r0, r4, r5 r4, r0, r4 다음명령어시퀀스는 r4 의각바이트를 r1 및 r2 에해당하는바이트의부호없는최소값과같게설정합니다. USUB8 SEL r4, r1, r2 r4, r2, r1 4-66 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.11 REV, REV16, REVSH 및 RBIT 워드또는하프워드내에서바이트또는비트반전 구문 op{cond} Rd, Rn 인수설명 : op 다음중하나입니다. REV 워드에서바이트순서를반전시킵니다. REV16 각하프워드에서개별바이트순서를반전시킵니다. REVSH 하위하프워드에서바이트순서를반전시키거나 32 비트로부호확장합니다. RBIT 32 비트워드에서비트순서를반전시킵니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd 는 r15 이면안됩니다. Rn 피연산자가들어있는레지스터입니다. Rn 은 r15 이면안됩니다. 사용법 이러한명령어를사용하여엔디안을변경할수있습니다. REV REV16 32 비트빅엔디안데이터를리틀엔디안데이터로또는 32 비트리틀엔디안데이터를빅엔디안데이터로변환합니다. 16 비트빅엔디안데이터를리틀엔디안데이터로또는 16 비트리틀엔디안데이터를빅엔디안데이터로변환합니다. REVSH 다음과같이변환합니다. 16비트부호있는빅엔디안데이터를 32비트부호있는리틀엔디안데이터로변환합니다. 16비트부호있는리틀엔디안데이터를 32비트부호있는빅엔디안데이터로변환합니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-67

ARM 및 Thumb 명령어 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. REV Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. REV16 Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. REVSH Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. 아키텍처 RBIT 를제외하고이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. ARM RBIT 명령어는 ARMv6T2 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 16 비트 Thumb 명령어는 ARMv6 이상의모든 T 변형에서사용할수있습니다. 예제 REV r3, r7 REV16 r0, r0 REVSH r0, r5 ; Reverse Signed Halfword REVHS r3, r7 ; Reverse with Higher or Same condition RBIT r7, r8 4-68 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.12 ASR, LSL, LSR, ROR 및 RRX 오른쪽으로산술시프트, 왼쪽으로논리시프트, 오른쪽으로논리시프트, 오른쪽으로회전및확장을포함하여오른쪽으로회전 이러한명령어는시프트된레지스터두번째피연산자가있는 MOV 명령어와같습니다. 구문 op{s}{cond} Rd, Rm, Rs op{s}{cond} Rd, Rm, #sh RRX{S}{cond} Rd, Rm 인수설명 : op ASR, LSL, LSR 또는 ROR 중하나입니다. S 선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rm Rs sh 첫번째피연산자가들어있는레지스터입니다. 이피연산자는오른쪽으로시프트됩니다. Rm 의값에적용할시프트값이들어있는레지스터입니다. 최하위바이트만사용됩니다. 상수시프트입니다. 허용되는값의범위는다음과같이명령어에따라달라집니다. ASR 1 ~ 32 LSL 0 ~ 31 LSR 1 ~ 32 ROR 1 ~ 31 사용법 ASR 은레지스터내용을 2 의제곱으로나눈부호있는값을제공하며부호비트를왼쪽의비어있는비트위치로복사합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-69

ARM 및 Thumb 명령어 LSL 은레지스터를 2 의제곱으로곱한값을제공하고, LSR 은레지스터를 2 의가변제곱으로나눈부호없는값을제공합니다. 두명령어는모두비어있는비트위치에 0 을삽입합니다. ROR 은레지스터내용을특정한값만큼회전한값을제공합니다. 오른쪽끝으로회전된비트는왼쪽의비어있는비트위치로삽입됩니다. RRX 는레지스터내용을 1 비트오른쪽으로시프트한값을제공합니다. 이전 carry 플래그는비트 [31] 로시프트됩니다. S 접미사가있으면이전비트 [0] 이 carry 플래그에배치됩니다. 조건플래그 S 를지정하면이러한명령어는결과에따라 N 및 Z 플래그를업데이트합니다. 시프트값이 0 일경우 C 플래그는변경되지않습니다. 시프트값이 0 이아닐경우 C 플래그는시프트된마지막비트로업데이트됩니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. ASRS Rd, Rm, #sh Rd 및 Rm 은모두 Lo 레지스터여야합니다. ASRS Rd, Rd, Rs Rd 및 Rs 는모두 Lo 레지스터여야합니다. LSLS Rd, Rm, #sh Rd 및 Rm 은모두 Lo 레지스터여야합니다. LSLS Rd, Rd, Rs Rd 및 Rs 는모두 Lo 레지스터여야합니다. LSRS Rd, Rm, #sh Rd 및 Rm 은모두 Lo 레지스터여야합니다. LSRS Rd, Rd, Rs Rd 및 Rs 는모두 Lo 레지스터여야합니다. RORS Rd, Rd, Rs Rd 및 Rs 는모두 Lo 레지스터여야합니다. 예제 ASR LSLS LSR ROR r7, r8, r9 r1, r2, r3 r4, r5, r6 r4, r5, r6 4-70 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.4.13 IT IT(If-Then) 명령어는다음 Thumb 명령어 (IT 블록 ) 를최대네개까지조건명령어로만듭니다. 조건은모두동일할수도있고일부명령어의조건이다른명령어의조건과논리적으로반대일수도있습니다. 내용의상당부분을 2.4 단원 ( 조건부실행 ) 으로이동합니다. 참고 : 해당 armasm 은 IT 명령어를자동으로생성하므로코드에서명시적 IT 명령어를반드시사용할필요는없습니다. 구문 IT{x{y{z}}} {cond} 인수설명 : x IT 블록의두번째명령어조건입니다. y IT 블록의세번째명령어조건입니다. z IT 블록의네번째명령어조건입니다. cond IT 블록의첫번째명령어조건입니다. IT 블록의두번째, 세번째및네번째명령어조건은다음중하나일수있습니다. T 이경우명령어에적용되는조건은 cond입니다. E 그렇지않으면명령어에적용되는조건은 cond의반대조건입니다. 사용법 CMP, CMN 및 TST를제외한 IT 블록 16비트명령어는조건코드플래그에영향을주지않습니다. IT 블록명령어를조건명령어로만들지않고조건코드플래그에영향을주려면 IT를 AL 조건과함께사용하면됩니다. IT 블록의명령어는구문의 {cond} 부분에서조건도지정해야합니다. 어셈블러에서는이조건을 IT 명령어의조건에대해확인합니다. 어셈블러에서는 ARM 어셈블리중에 IT 명령어를받아들이고다음명령어의조건에대해확인하지만이에대한코드를생성하지는않습니다. 제한다음명령어는 IT 블록에서사용할수없습니다. IT 조건부분기 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-71

ARM 및 Thumb 명령어 CBZ 및 CBNZ TBB 및 TBH CPS, CPSID 및 CPSIE SETEND. 또한무조건분기는블록의마지막명령어인경우에만 IT 블록에서사용할수있습니다. 조건플래그 이명령어는플래그를변경하지않습니다. 예외 IT 명령어와해당 IT 블록사이또는 IT 블록내에서는예외가발생할수있습니다. 이러한예외가발생하면 r14 및 SPSR 에적합한반환정보가포함된적절한예외처리기가시작됩니다. 예외반환에사용되도록설계된명령어는예외에서복귀하고 IT 블록의실행을올바로다시시작하는기본방법으로사용될수있습니다. 이것은 pc 수정명령어를 IT 블록의명령어로분기할수있는유일한방법입니다. 아키텍처 이 16 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 예제 ITTE NE ; assemblers can allow IT to be omitted ANDNE r0,r0,r1 ; 16-bit AND, not ANDS ADDSNE r2,r2,#1 ; 32-bit ADDS (16-bit ADDS does not set flags in IT block) MOVEQ r2,r3 ; 16-bit MOV(CPY) ITT AL ; emit 2 non-flag setting 16-bit instructions ADDAL r0,r0,r1 ; 16-bit ADD, not ADDS SUBAL r2,r2,#1 ; 16-bit SUB, not SUB ADD r0,r0,r1 ; expands into 32-bit ADD IT NE ADD r0,r0,r1 ; syntax error: no condition code used in IT block 4-72 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 참고정보 IT 블록으로분기 예외에나와있는명령어를제외하고 IT 블록의명령어는분기명령어또는 pc 를변경하는기타명령어에서시작하는분기의대상이될수없습니다. IT 블록시작분기 pc를수정하는명령어는블록의마지막명령어를제외하고 IT 블록에서사용하면안됩니다. IT 블록의분기 IT 블록의분기는무조건분기로인코딩되어야합니다 ( 이러한분기는 IT 조건에의해조건부분기가됨 ). 이경우유효범위가늘어나므로경우에따라조건부분기를 IT 블록에배치하는것이좋습니다. ITT EQ MOVEQ r0,r1 BEQ dloop IT 블록의예상할수없는명령어어셈블러에서는 IT 블록에예상할수없는명령어 ( 예 : B, BL 및 CPS) 에대해경고를표시합니다. 또한 pc를변경하는명령어 ( 예 : BX, CZB 및 RFE) 에대해서도경고를표시합니다. 어셈블러는 IT 블록내부의지시문은고려하지않습니다. BKPT IT 블록의 BKPT 명령어는조건이실패한경우에도항상실행됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-73

ARM 및 Thumb 명령어 4.4.14 SDIV 및 UDIV 부호있는나누기및부호없는나누기 구문 SDIV{cond} {Rd}, Rn, Rm UDIV{cond} {Rd}, Rn, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 나눌값이들어있는레지스터입니다. Rm 제수가들어있는레지스터입니다. 레지스터제한 pc 또는 sp 는 Rd, Rn 또는 Rm 에사용할수없습니다. 아키텍처 이러한 32 비트 Thumb 명령어는 ARMv7-R 과 ARMv7-M 에서만사용할수있습니다. ARM 또는 16 비트 Thumb SDIV 및 UDIV 명령어는없습니다. 4-74 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5 곱하기명령어 이단원에는다음소단원이포함되어있습니다. 4-76페이지의 MUL, MLA 및 MLS 곱하기, 곱하기누산및곱하기빼기 (32비트 x 32비트, 하위 32비트결과 ) 4-78페이지의 UMULL, UMLAL, SMULL 및 SMLAL 부호없는및부호있는 long 곱하기및곱하기누산 (32비트 x 32비트, 64비트결과또는 64비트누산이기 ) 4-80페이지의 SMULxy 및 SMLAxy 부호있는곱하기및부호있는곱하기누산 (16비트 x 16비트, 32비트결과 ) 4-82페이지의 SMULWy 및 SMLAWy 부호있는곱하기및부호있는곱하기누산 (32비트 x 16비트, 상위 32비트결과 ) 4-83페이지의 SMLALxy 부호있는곱하기누산 (16비트 x 16비트, 64비트누산 ) 4-85페이지의 SMUAD{X} 및 SMUSD{X} 결과더하기또는빼기포함이중 16비트부호있는곱하기 4-87페이지의 SMMUL, SMMLA 및 SMMLS 곱하기, 곱하기누산및곱하기빼기 (32비트 x 32비트, 상위 32비트결과 ) 4-89페이지의 SMLAD 및 SMLSD 이중 16비트부호있는곱하기, 32비트결과의합또는차이의 32비트누산 4-91페이지의 SMLALD 및 SMLSLD 이중 16비트부호있는곱하기, 32비트결과의합또는차이의 64비트누산 4-93페이지의 UMAAL long에대한부호없는곱하기누산 4-94페이지의 MIA, MIAPH 및 MIAxy XScale 보조프로세서 0 명령어 ( 내부누산으로곱하기 ) ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-75

ARM 및 Thumb 명령어 4.5.1 MUL, MLA 및 MLS 결과의최하위 32 비트를제공하여부호있는또는부호없는 32 비트피연산자포함곱하기, 곱하기누산및곱하기빼기 구문 MUL{S}{cond} {Rd}, Rn, Rm MLA{S}{cond} Rd, Rn, Rm, Ra MLS{cond} Rd, Rn, Rm, Ra 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). S 선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn, Rm 곱할값이들어있는레지스터입니다. Ra 더하거나뺄값이들어있는레지스터입니다. 사용법 MUL 명령어는 Rn 의값과 Rm 의값을곱하고결과의최하위 32 비트를 Rd 에배치합니다. MLA 명령어는 Rn 의값과 Rm 의값을곱하고 Ra 의값을더한다음결과의최하위 32 비트를 Rd 에배치합니다. MLS 명령어는 Rn 의값과 Rm 의값을곱하고 Ra 의값에서결과를뺀다음최종결과의최하위 32 비트를 Rd 에배치합니다. Rd, Rn, Rm 또는 Ra 에 r15 를사용하면안됩니다. 4-76 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 조건플래그 S를지정하면 MUL 및 MLA 명령어는다음을수행합니다. 결과에따라 N 및 Z 플래그를업데이트합니다. ARMv4 이하에서는 C 및 V 플래그를손상시킵니다. ARMv5 이상에서는 C 또는 V 플래그에영향을주지않습니다. Thumb 명령어 MUL 명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. MULS Rd, Rn, Rd Rd 및 Rn 은모두 Lo 레지스터여야합니다. 조건코드플래그를설정할수있는다른 Thumb 명령어는없습니다. 아키텍처 MUL 및 MLA ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. MLS ARM 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. MULS 16 비트 Thumb 명령어는 ARM 아키텍처의모든 T 변형에서사용할수있습니다. 예제 MUL MLA MULS MULLT MLS r10, r2, r5 r10, r2, r1, r5 r0, r2, r2 r2, r3, r2 r4, r5, r6, r7 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-77

ARM 및 Thumb 명령어 4.5.2 UMULL, UMLAL, SMULL 및 SMLAL 선택적누산, 32 비트피연산자, 64 비트결과및누산기포함부호있는및부호없는 long 곱하기 구문 Op{S}{cond} RdLo, RdHi, Rn, Rm 인수설명 : Op UMULL, UMLAL, SMULL 또는 SMLAL 중하나입니다. S ARM 상태에서만사용할수선택적접미사입니다. S 를지정하면연산결과의조건코드플래그가업데이트됩니다 (2-21 페이지의조건부실행참조 ). cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). RdLo, RdHi 대상레지스터입니다. UMLAL 및 SMLAL 에는누산값도들어있습니다. RdLo 와 RdHi 는서로다른레지스터여야합니다. Rn, Rm 피연산자가들어있는 ARM 레지스터입니다. RdHi, RdLo, Rn 또는 Rm 에 r15 를사용하면안됩니다. 사용법 UMULL 명령어는 Rn 및 Rm 의값을부호없는정수로해석하며, 이러한정수를곱하고결과의최하위 32 비트를 RdLo 에배치하고결과의최상위 32 비트를 RdHi 에배치합니다. UMLAL 명령어는 Rn 및 Rm 의값을부호없는정수로해석하며, 이러한정수를곱하고 64 비트결과를 RdHi 및 RdLo 에들어있는 64 비트부호없는정수에더합니다. SMULL 명령어는 Rn 및 Rm 의값을 2 의보수부호있는정수로해석하며, 이러한정수를곱하고결과의최하위 32 비트를 RdLo 에배치하고결과의최상위 32 비트를 RdHi 에배치합니다. SMLAL 명령어는 Rn 및 Rm 의값을 2 의보수부호있는정수로해석하며, 이러한정수를곱하고 64 비트결과를 RdHi 및 RdLo 에들어있는 64 비트부호있는정수에더합니다. 4-78 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 조건플래그 S를지정하면이러한명령어는다음을수행합니다. 결과에따라 N 및 Z 플래그를업데이트합니다. C 또는 V 플래그에영향을주지않습니다. 아키텍처이러한 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. 예제 UMULL UMLALS r0, r4, r5, r6 r4, r5, r3, r8 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-79

ARM 및 Thumb 명령어 4.5.3 SMULxy 및 SMLAxy 16 비트피연산자, 32 비트결과및누산기포함부호있는곱하기및곱하기누산 구문 SMUL<x><y>{cond} {Rd}, Rn, Rm SMLA<x><y>{cond} Rd, Rn, Rm, Ra 인수설명 : <x> <y> B 또는 T 입니다. B 는 Rm 의하위하프 ( 비트 [15:0]) 사용을의미하고, T 는 Rm 의상위하프 ( 비트 [31:16]) 사용을의미합니다. B 또는 T 입니다. B 는 Rs 의하위하프 ( 비트 [15:0]) 사용을의미하고, T 는 Rs 의상위하프 ( 비트 [31:16]) 사용을의미합니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn, Rm 곱할값이들어있는레지스터입니다. Ra 더할값이들어있는레지스터입니다. 사용법 Rd, Rn, Rm 또는 Ra에 r15를사용하면안됩니다. SMULxy 는 Rn 및 Rm 의선택된하프에서 16 비트부호있는정수를곱하고 32 비트결과를 Rd 에배치합니다. SMLAxy 는 Rn 및 Rm 의선택된하프에서 16 비트부호있는정수를곱하고 32 비트결과를 Ra 의 32 비트값에더한다음결과를 Rd 에배치합니다. 조건플래그 이러한명령어는 N, Z, C 또는 V 플래그에영향을주지않습니다. 누산에오버플로가발생하면 SMLAxy 가 Q 플래그를설정합니다. Q 플래그의상태를보려면 MRS 명령어 (4-135 페이지의 MRS 참조 ) 를사용하십시오. 4-80 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 참고 SMLAxy 는 Q 플래그를지울수없습니다. Q 플래그를지우려면 MSR 명령어 (4-137 페이지의 MSR 참조 ) 를사용하십시오. 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SMULTBEQ SMLABBNE SMLABT r8, r7, r9 r0, r2, r1, r10 r0, r0, r3, r5 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-81

ARM 및 Thumb 명령어 4.5.4 SMULWy 및 SMLAWy 상위 32 비트결과를제공하여하나의 32 비트피연산자및하나의 16 비트피연산자포함부호있는곱하기광역및부호있는곱하기누산광역 구문 SMULW<y>{cond} {Rd}, Rn, Rm SMLAW<y>{cond} Rd, Rn, Rm, Ra 인수설명 : <y> B 또는 T 입니다. B 는 Rs 의하위하프 ( 비트 [15:0]) 사용을의미하고, T 는 Rs 의상위하프 ( 비트 [31:16]) 사용을의미합니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn, Rm 곱할값이들어있는레지스터입니다. Ra 더할값이들어있는레지스터입니다. 사용법 Rd, Rn, Rm 또는 Ra에 r15를사용하면안됩니다. SMULWy 는 Rm 의선택된하프에서부호있는정수에 Rn 의부호있는정수를곱하고 48 비트결과의상위 32 비트를 Rd 에배치합니다. SMLAWy 는 Rm 의선택된하프에서부호있는정수에 Rn 의부호있는정수를곱하고 32 비트결과를 Ra 의 32 비트값에더한다음결과를 Rd 에배치합니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 4-82 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.5 SMLALxy 16 비트피연산자및 64 비트누산이기포함부호있는곱하기누산 구문 SMLAL<x><y>{cond} RdLo, RdHi, Rn, Rm 인수설명 : <x> <y> B 또는 T 입니다. B 는 Rm 의하위하프 ( 비트 [15:0]) 사용을의미하고, T 는 Rm 의상위하프 ( 비트 [31:16]) 사용을의미합니다. B 또는 T 입니다. B 는 Rs 의하위하프 ( 비트 [15:0]) 사용을의미하고, T 는 Rs 의상위하프 ( 비트 [31:16]) 사용을의미합니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). RdHi, RdLo 대상레지스터입니다. 이대상레지스터에는누산값도들어있습니다. RdHi 와 RdLo 는서로다른레지스터여야합니다. Rn, Rm 곱할값이들어있는레지스터입니다. RdHi, RdLo, Rn 또는 Rm 에 r15 를사용하면안됩니다. 사용법 SMLALxy 는 Rm 의선택된하프에서부호있는정수에 Rn 의선택된하프에서부호있는정수를곱하고 32 비트결과를 RdHi 및 RdLo 의 64 비트값에더합니다. 조건플래그 이명령어는플래그를변경하지않습니다. 참고 SMLALxy는예외를발생시킬수없습니다. 이명령어에서오버플로가발생하면결과가경고없이래핑됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-83

ARM 및 Thumb 명령어 아키텍처 이 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이명령어의 16 비트 Thumb 버전은없습니다. 예제 SMLALTB SMLALBTVS r2, r3, r7, r1 r0, r1, r9, r2 4-84 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.6 SMUAD{X} 및 SMUSD{X} 결과더하기또는빼기포함이중 16 비트부호있는곱하기및피연산자하프의선택적교환 구문 op{x}{cond} {Rd}, Rn, Rm 인수설명 : op 다음중하나입니다. SMUAD 이중곱하기, 결과더하기 SMUSD 이중곱하기, 결과빼기 X 선택적매개변수입니다. X 가있으면곱하기가수행되기전에두번째피연산자의최상위및최하위하프워드가교환됩니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn, Rm 피연산자가들어있는레지스터입니다. Rd, Rn 또는 Rm에 r15를사용하면안됩니다. 사용법 SMUAD 는 Rn 의하위하프워드를 Rm 의하위하프워드와곱하고 Rn 의상위하프워드를 Rm 의상위하프워드와곱합니다. 그런다음결과를더하고그합을 Rd 에저장합니다. SMUSD 는 Rn 의하위하프워드와 Rm 의하위하프워드를곱하고 Rn 의상위하프워드를 Rm 의상위하프워드와곱합니다. 그런다음첫번째결과에서두번째결과를빼고그차이를 Rd 에저장합니다. 조건플래그 더하기가오버플로될경우 SMUAD 명령어는 Q 플래그를설정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-85

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SMUAD SMUSDXNE r2, r3, r2 r0, r1, r2 4-86 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.7 SMMUL, SMMLA 및 SMMLS 부호있는최상위워드곱하기, 누산포함부호있는최상위워드곱하기, 빼기포함부호있는최상위워드곱하기. 이러한명령어는 32 비트피연산자를사용하고결과의최상위 32 비트만생성합니다. 구문 SMMUL{R}{cond} {Rd}, Rn, Rm SMMLS{R}{cond} Rd, Rn, Rm, Ra SMMLS{R}{cond} Rd, Rn, Rm, Ra 인수설명 : R 선택적매개변수입니다. R 이있으면결과를반올림하고, 그렇지않으면결과를자릅니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn, Rm 피연산자가들어있는레지스터입니다. Ra 더하거나뺄값이들어있는레지스터입니다. Rd, Rn, Rm 또는 Ra에 r15를사용하면안됩니다. 연산 SMMUL 은 Rn 및 Rm 의값을곱하고 64 비트결과의최상위 32 비트를 Rd 에저장합니다. SMMLA 는 Rn 및 Rm 의값을곱하고결과의최상위 32 비트에 Ra 의값을더한다음결과를 Rd 에저장합니다. SMMLS 는 Rn 및 Rm 의값을곱하고 32 비트왼쪽으로시프트된 Ra 의값에서결과를뺀다음결과의최상위 32 비트를 Rd 에저장합니다. 선택적 R 매개변수를지정하면최상위 32 비트를추출하기전에 0x80000000 이더해집니다. 이것은결과를반올림하는효과가있습니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-87

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SMMULGE SMMULR r6, r4, r3 r2, r2, r2 4-88 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.8 SMLAD 및 SMLSD 결과더하기또는빼기및 32 비트누산포함이중 16 비트부호있는곱하기 구문 op{x}{cond} Rd, Rn, Rm, Ra 인수설명 : op 다음중하나입니다. SMLAD 이중곱하기, 결과의합누산 SMLSD 이중곱하기, 결과의차이누산 cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). X 선택적매개변수입니다. X 가있으면곱하기가수행되기전에두번째피연산자의최상위및최하위하프워드가교환됩니다. Rd 대상레지스터입니다. Rn, Rm 피연산자가들어있는레지스터입니다. Ra 누산피연산자가들어있는레지스터입니다. Rd, Rn, Rm 또는 Ra에 r15를사용하면안됩니다. 연산 SMLAD 는 Rn 의하위하프워드와 Rm 의하위하프워드를곱하고 Rn 의상위하프워드와 Rm 의상위하프워드를곱합니다. 그런다음두결과를모두 Ra 의값에더하고그합을 Rd 에저장합니다. SMLSD 는 Rn 의하위하프워드와 Rm 의하위하프워드를곱하고 Rn 의상위하프워드와 Rm 의상위하프워드를곱합니다. 그런다음첫번째결과에서두번째결과를빼고그차이를 Ra 의값에더한다음결과를 Rd 에저장합니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-89

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SMLSD SMLSDX SMLADLT r1, r2, r0, r7 r11, r10, r2, r3 r1, r2, r4, r1 4-90 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.9 SMLALD 및 SMLSLD 결과더하기또는빼기및 64 비트누산포함이중 16 비트부호있는곱하기 구문 op{x}{cond} RdLo, RdHi, Rn, Rm 인수설명 : op 다음중하나입니다. SMLALD 이중곱하기, 결과의합누산 SMLSLD 이중곱하기, 결과의차이누산 X 선택적매개변수입니다. X 가있으면곱하기가수행되기전에두번째피연산자의최상위및최하위하프워드가교환됩니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). RdLo, RdHi 64 비트결과의대상레지스터입니다. 이대상레지스터에는 64 비트누산피연산자도들어있습니다. RdHi 와 RdLo 는서로다른레지스터여야합니다. Rn, Rm 피연산자가들어있는레지스터입니다. RdLo, RdHi, Rn 또는 Rm 에 r15 를사용하면안됩니다. 연산 SMLALD 는 Rn 의하위하프워드와 Rm 의하위하프워드를곱하고 Rn 의상위하프워드와 Rm 의상위하프워드를곱합니다. 그런다음두결과를모두 RdLo, RdHi 의값에더하고그합을 RdLo, RdHi 에저장합니다. SMLSLD 는 Rn 의하위하프워드와 Rm 의하위하프워드를곱하고 Rn 의상위하프워드와 Rm 의상위하프워드를곱합니다. 그런다음첫번째결과에서두번째결과를빼고그차이를 RdLo, RdHi 의값에더한다음결과를 RdLo, RdHi 에저장합니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-91

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SMLALD SMLSLD r10, r11, r5, r1 r3, r0, r5, r1 4-92 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.5.10 UMAAL long 에대한부호없는곱하기누산 구문 UMAAL{cond} RdLo, RdHi, Rn, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). RdLo, RdHi 64 비트결과의대상레지스터입니다. 이대상레지스터에는두개의 32 비트누산피연산자도들어있습니다. RdLo 및 RdHi 는서로다른레지스터여야합니다. Rn, Rm 곱하기피연산자가들어있는레지스터입니다. RdLo, RdHi, Rn 또는 Rm 에 r15 를사용하면안됩니다. 연산 UMAAL 명령어는 Rn 및 Rm 의 32 비트값을곱하고 RdHi 및 RdLo 의 32 비트값두개를더한후 64 비트결과를 RdLo, RdHi 에저장합니다. 조건플래그 이명령어는플래그를변경하지않습니다. 아키텍처 이 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이명령어의 16 비트 Thumb 버전은없습니다. 예제 UMAAL UMAALGE r8, r9, r2, r3 r2, r0, r5, r3 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-93

ARM 및 Thumb 명령어 4.5.11 MIA, MIAPH 및 MIAxy XScale 보조프로세서 0 명령어내부누산포함곱하기 (32비트 x 32비트, 40비트누산 ) 내부누산포함곱하기, 패킹된하프워드 (16비트 x 16비트 x 2, 40비트누산 ) 내부누산포함곱하기 (16비트 x 16비트, 40비트누산 ) 구문 MIA{cond} Acc, Rn, Rm MIAPH{cond} Acc, Rn, Rm MIA<x><y>{cond} Acc, Rn, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Acc 내부누산기입니다. 표준이름은 accx 입니다. 여기서 x 는 0 ~ n 범위에있는정수입니다. n 의값은프로세서에따라달라집니다. 현재프로세서에서는 0 입니다. Rn, Rm 곱할값이들어있는 ARM 레지스터입니다. Rn 또는 Rm 에 r15 를사용하면안됩니다. <x><y> 다음중하나입니다. BB, BT, TB, TT. 사용법 MIA 명령어는 Rn 및 Rm 의부호있는정수를곱하고결과를 Acc 의 40 비트값에더합니다. MIAPH 명령어는 Rn 및 Rm 의하위하프에있는부호있는정수를곱하고 Rn 및 Rm 의상위하프에있는부호있는정수를곱한다음두개의 32 비트결과를 Acc 의 40 비트값에더합니다. MIAxy 명령어는 Rs 의선택된하프에서부호있는정수와 Rm 의선택된하프에서부호있는정수를곱한다음 32 비트결과를 Acc 의 40 비트값에더합니다. <x> == B 는 Rn 의하위하프 ( 비트 [15:0]) 사용을의미하고, <x> == T 는 Rn 의상위하프 ( 비트 [31:16]) 사용을의미합니다. <y> == B 는 Rm 의하위하프 ( 비트 [15:0]) 사용을의미하고, <y> == T 는 Rm 의상위하프 ( 비트 [31:16]) 사용을의미합니다. 4-94 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 조건플래그 이러한명령어는플래그를변경하지않습니다. 참고이러한명령어는예외를발생시킬수없습니다. 이러한명령어에서오버플로가발생하면경고없이결과가겹쳐집니다. 아키텍처 이러한 ARM 명령어는 XScale 프로세서에서만사용할수있습니다. 이러한명령어의 Thumb 버전은없습니다. 예제 MIA acc0,r5,r0 MIALE acc0,r1,r9 MIAPH acc0,r0,r7 MIAPHNE acc0,r11,r10 MIABB acc0,r8,r9 MIABT acc0,r8,r8 MIATB acc0,r5,r3 MIATT acc0,r0,r6 MIABTGT acc0,r2,r5 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-95

ARM 및 Thumb 명령어 4.6 포화명령어 이단원에는다음소단원이포함되어있습니다. 포화산술 4-97페이지의 QADD, QSUB, QDADD 및 QDSUB 4-99페이지의 SSAT 및 USAT 일부병렬명령어도포화됩니다 (4-101페이지의병렬명령어참조 ). 4.6.1 포화산술 이러한연산은포화됩니다 (SAT). 즉, 2 n 의일부값이명령어에따라달라집니다. 부호있는포화연산의경우전체결과가 -2 n 미만이면반환결과는 -2 n 입니다. 부호없는포화연산의경우전체결과가음수이면반환결과는 0 입니다. 전체결과가 2 n - 1 을초과하면반환결과는 2 n - 1 입니다. 이러한연산이수행되는경우를포화라고합니다. 포화가발생하면일부명령어가 Q 플래그를설정합니다. 참고 포화가수행되지않을경우포화명령어는 Q 플래그를지우지않습니다. Q 플래그를지우려면 MSR 명령어 (4-137 페이지의 MSR 참조 ) 를사용하십시오. Q 플래그는두개의다른명령어 (4-80 페이지의 SMULxy 및 SMLAxy 및 4-82 페이지의 SMULWy 및 SMLAWy 참조 ) 로설정할수도있지만이러한명령어는포화되지않습니다. 4-96 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.6.2 QADD, QSUB, QDADD 및 QDSUB 부호있는더하기, 빼기, 이중및더하기, 이중및빼기, 부호있는 -2 31 x 2 31-1 범위로결과포화 4-102 페이지의병렬더하기및빼기도참조하십시오. 구문 op{cond} {Rd}, Rm, Rn 인수설명 : op QADD, QSUB, QDADD 또는 QDSUB 중하나입니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rm, Rn 피연산자가들어있는레지스터입니다. Rd, Rm 또는 Rn에 r15를사용하면안됩니다. 사용법 QADD 명령어는 Rm 의값과 Rn 의값을더합니다. QSUB 명령어는 Rm 의값에서 Rn 의값을뺍니다. QDADD 명령어는 SAT(Rm + SAT(Rn * 2)) 를계산합니다. 이경우배수화연산이나더하기중하나또는둘다에서포화가발생할수있습니다. 포화가배수화에서만발생하고더하기에서는발생하지않으면 Q 플래그가설정되지만최종결과는포화되지않습니다. QDSUB 명령어는 SAT(Rm - SAT(Rn * 2)) 를계산합니다. 이경우배수화연산이나빼기중하나또는둘다에서포화가발생할수있습니다. 포화가배수화에서만발생하고빼기에서는발생하지않으면 Q 플래그가설정되지만최종결과는포화되지않습니다. 참고이러한명령어는모든값을 2 의보수부호있는정수로처리합니다. ARMv6 이상에서만사용할수있는유사한병렬명령어에대해서는 4-102 페이지의병렬더하기및빼기를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-97

ARM 및 Thumb 명령어 조건플래그 포화가발생하면이러한명령어는 Q 플래그를설정합니다. Q 플래그의상태를보려면 MRS 명령어 (4-135 페이지의 MRS 참조 ) 를사용하십시오. 아키텍처 이러한 ARM 명령어는 ARMv6 이상과 ARMv5 의 E 변형에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 QADD r0, r1, r9 QDSUBLT r9, r0, r1 4-98 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.6.3 SSAT 및 USAT 포화전선택적시프트를사용하여임의의비트위치로부호있는포화및부호없는포화 SSAT 는부호있는값을부호있는범위로포화시킵니다. USAT 는부호있는값을부호없는범위로포화시킵니다. 4-107 페이지의 SSAT16 및 USAT16 도참조하십시오. 구문 op{cond} Rd, #sat, Rm{, shift} 인수설명 : op SSAT 또는 USAT입니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd는 r15이면안됩니다. sat 포화시킬비트위치를지정합니다. SSAT 의경우 1 에서 32 사이에서지정하고 USAT 의경우 0 에서 31 사이에서지정합니다. Rm 피연산자가들어있는레지스터입니다. Rm 은 r15 이면안됩니다. shift 선택적시프트입니다. 다음중하나여야합니다. ASR #n 여기서 n 은 1 에서 32 사이 (ARM) 또는 1 에서 31 사이 (Thumb-2) 의숫자입니다. LSL #n 여기서 n 은 0 에서 31 사이의숫자입니다. 연산 SSAT 명령어는지정된시프트를적용한다음부호있는범위 -2 sat-1 x 2 sat-1-1 로포화시킵니다. USAT 명령어는지정된시프트를적용한다음부호없는범위 0 x 2 sat - 1 로포화시킵니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-99

ARM 및 Thumb 명령어 조건플래그 포화가발생하면이러한명령어는 Q 플래그를설정합니다. Q 플래그의상태를보려면 MRS 명령어 (4-135 페이지의 MRS 참조 ) 를사용하십시오. 아키텍처이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. 예제 SSAT r7, #16, r7, LSL #4 USATNE r0, #7, r5 4-100 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.7 병렬명령어 이단원에는다음소단원이포함되어있습니다. 4-102 페이지의병렬더하기및빼기 다양한바이트및하프워드더하기및빼기 4-105페이지의 USAD8 및 USADA8 부호없는절대차의합및부호없는절대차의합누산 4-107페이지의 SSAT16 및 USAT16 병렬하프워드포화명령어 이외에도몇가지병렬패킹해제명령어도있습니다 (4-112 페이지의 SXT, SXTA, UXT 및 UXTA 참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-101

ARM 및 Thumb 명령어 4.7.1 병렬더하기및빼기 다양한바이트및하프워드더하기및빼기 구문 <prefix>op{cond} {Rd}, Rn, Rm 인수설명 : <prefix> 다음중하나입니다. S Q SH U UQ UH 부호있는산술모듈로 2 8 또는 2 16. 이연산은 APSR GE 플래그를설정합니다. 부호있는포화산술 결과를양분하는부호있는산술 부호없는산술모듈로 2 8 또는 2 16. 이연산은 APSR GE 플래그를설정합니다. 부호없는포화산술 op 다음중하나입니다. 결과를양분하는부호없는산술 ADD8 ADD16 SUB8 SUB16 ASX SAX 바이트더하기 하프워드더하기 바이트빼기 하프워드빼기 Rm 의하프워드를교환한다음상위하프워드를더하고하위하프워드를뺍니다. Rm 의하프워드를교환한다음상위하프워드를빼고하위하프워드를더합니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd 에 r15 를사용하면안됩니다. Rm, Rn 피연산자가들어있는 ARM 레지스터입니다. Rm 또는 Rn 에 r15 를사용하면안됩니다. 4-102 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 연산 이러한명령어는피연산자의바이트또는하프워드에대한개별산술연산을수행합니다. 즉, 두번또는네번의더하기또는빼기를수행하거나한번의더하기와한번의빼기를수행합니다. 다음과같은다양한유형의산술을선택할수있습니다. 부호있는또는부호없는산술모듈로 2 8 또는 2 16. 이연산은 APSR GE 플래그를설정합니다 ( 조건플래그참조 ). 부호있는범위 -2 15 x 2 15-1 or -2 7 x 2 7-1 중하나에대한부호있는포화산술. 이러한연산이포화되는경우에도 Q 플래그는영향을받지않습니다. 부호없는범위 0 x 2 16-1 또는 0 x 2 8-1 중하나에대한부호없는포화산술. 이러한연산이포화되는경우에도 Q 플래그는영향을받지않습니다. 결과를양분하는부호있는또는부호없는산술. 이연산은오버플로를일으킬수없습니다. 조건플래그 이러한명령어는 N, Z, C, V 또는 Q 플래그에영향을주지않습니다. 이러한명령어의 Q, SH, UQ 및 UH 접두사변형은플래그를변경하지않습니다. 이러한명령어의 S and U 접두사변형은다음과같이 APSR 에 GE 플래그를설정합니다. 바이트연산의경우, GE 플래그는다음과같이 32 비트 SUB 및 ADD 명령어의 C(Carry) 플래그와동일한방식으로사용됩니다. GE[0] GE[1] GE[2] GE[3] 결과비트 [7:0] 의경우 결과비트 [15:8] 의경우 결과비트 [23:16] 의경우 결과비트 [31:24] 의경우 하프워드연산의경우, GE 플래그는다음과같이일반워드 SUB 및 ADD 명령어의 C(Carry) 플래그와동일한방식으로사용됩니다. GE[1:0] GE[3:2] 결과비트 [15:0] 의경우 결과비트 [31:16] 의경우 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-103

ARM 및 Thumb 명령어 이러한플래그를사용하면그다음 SEL 명령어를제어할수있습니다 (4-65 페이지의 SEL 참조 ). 참고 하프워드연산의경우, GE[1:0] 이함께설정되거나해제되고 GE[3:2] 가함께설정되거나해제됩니다. 아키텍처 이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SHADD8 USAXNE r4, r3, r9 r0, r0, r2 올바르지않은예제 QHADD r2, r9, r3 ; No such instruction, should be QHADD8 or QHADD16 SAX r10, r8, r5 ; Must have a prefix. 4-104 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.7.2 USAD8 및 USADA8 부호없는절대차의합및부호없는절대차의합누산 구문 USAD8{cond} {Rd}, Rn, Rm USADA8{cond} Rd, Rn, Rm, Ra 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 첫번째피연산자가들어있는레지스터입니다. Rm 두번째피연산자가들어있는레지스터입니다. Ra 누산피연산자가들어있는레지스터입니다. Rd, Rn, Rn 또는 Ra에 r15를사용하면안됩니다. 연산 USAD8 명령어는 Rn 및 Rm 의해당바이트에있는부호없는값사이에서네가지차이를찾아서해당절대값을더하고결과를 Rd 에저장합니다. USADA8 명령어는네가지차이의절대값을 Ra 의값에더하고결과를 Rd 에저장합니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처 이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-105

ARM 및 Thumb 명령어 예제 USAD8 USADA8 USADA8VS r2, r4, r6 r0, r3, r5, r2 r0, r4, r0, r1 올바르지않은예제 USADA8 r2, r4, r6 ; USADA8 requires four registers USADA16 r0, r4, r0, r1 ; no such instruction 4-106 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.7.3 SSAT16 및 USAT16 병렬하프워드포화명령어 SSAT16은부호있는값을부호있는범위로포화시킵니다. USAT16은부호있는값을부호없는범위로포화시킵니다. 구문 op{cond} Rd, #sat, Rn 인수설명 : op 다음중하나입니다. SSAT16 부호있는포화 USAT16 부호없는포화 cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. sat 포화시킬비트위치를지정합니다. SSAT16 의경우 1 에서 16 사이에서지정하고 USAT16 의경우 0 에서 15 사이에서지정합니다. Rn 피연산자가들어있는레지스터입니다. Rd 또는 Rn 에 r15 를사용하면안됩니다. 연산 임의의비트위치로하프워드부호있는포화및부호없는포화 SSAT16 명령어는각부호있는하프워드를부호있는범위 -2 sat-1 x 2 sat-1-1 로포화시킵니다. USAT16 명령어는각부호있는하프워드를부호없는범위 0 x 2 sat -1 로포화시킵니다. 조건플래그 하프워드에서포화가발생하면이러한명령어는 Q 플래그를설정합니다. Q 플래그의상태를보려면 MRS 명령어 (4-135 페이지의 MRS 참조 ) 를사용하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-107

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 SSAT16 r7, #12, r7 USAT16 r0, #7, r5 올바르지않은예제 SSAT16 r1, #16, r2, LSL #4 ; shifts not permitted with halfword saturations 4-108 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.8 패킹및패킹해제명령어 이단원에는다음소단원이포함되어있습니다. 4-110페이지의 BFC 및 BFI 비트필드지우기및비트필드삽입 4-111페이지의 SBFX 및 UBFX 부호있는또는부호없는비트필드추출 4-112페이지의 SXT, SXTA, UXT 및 UXTA 선택적더하기포함부호확장또는 0 확장명령어 4-115페이지의 PKHBT 및 PKHTB 하프워드패킹명령어 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-109

ARM 및 Thumb 명령어 4.8.1 BFC 및 BFI 비트필드지우기및비트필드삽입. 레지스터에서인접비트를지우거나한레지스터에있는인접비트를다른레지스터에삽입합니다. 구문 BFC{cond} Rd, #lsb, #width BFI{cond} Rd, Rn, #lsb, #width 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd는 r15이면안됩니다. Rn 소스레지스터입니다. Rn은 r15이면안됩니다. lsb 지우거나복사할최하위비트입니다. width 지우거나복사할비트수입니다. width 는 0 이면안되고, (width+lsb) 는 32 보다작아야합니다. BFC Rd 의 width 비트는 lsb 부터지워집니다. Rd 의다른비트는변경되지않습니다. BFI Rd 에서 lsb 부터시작하는 width 비트는 Rn 에서비트 [0] 부터시작하는 width 비트로대체됩니다. Rd 의다른비트는변경되지않습니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처이러한 ARM 명령어는 ARMv6T2 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. 4-110 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.8.2 SBFX 및 UBFX 부호있는및부호없는비트필드추출. 한레지스터에있는인접비트를두번째레지스터의최하위비트에복사하고 32 비트로부호확장또는 0 확장합니다. 구문 op{cond} Rd, Rn, #lsb, #width 인수설명 : op SBFX 또는 UBFX입니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 소스레지스터입니다. lsb 비트필드에있는최하위비트의비트수로, 0 에서 31 사이의숫자입니다. width 비트필드의너비로, 1 에서 (32-lsb) 사이의숫자입니다. Rd 또는 Rn 에 r15 를사용하면안됩니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처이러한 ARM 명령어는 ARMv6T2 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-111

ARM 및 Thumb 명령어 4.8.3 SXT, SXTA, UXT 및 UXTA 부호확장, 더하기포함부호확장, 0 확장및더하기포함 0 확장 구문 SXT<extend>{cond} {Rd}, Rm{, rotation} SXTA<extend>{cond} {Rd}, Rn, Rm{, rotation} UXT<extend>{cond} {Rd}, Rm{, rotation} UXTA<extend>{cond} {Rd}, Rn, Rm{, rotation} 인수설명 : <extend> 다음중하나입니다. B16 두개의 8 비트값을두개의 16 비트값으로확장합니다. B 8 비트값을 32 비트값으로확장합니다. H 16 비트값을 32 비트값으로확장합니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 더할숫자가들어있는레지스터입니다 (SXTA 및 UXTA 에만해당 ). Rm 확장할값이들어있는레지스터입니다. rotation 다음중하나입니다. ROR #8 Rm 의값이 8 비트만큼오른쪽으로회전합니다. ROR #16 Rm 의값이 16 비트만큼오른쪽으로회전합니다. ROR #24 Rm 의값이 24 비트만큼오른쪽으로회전합니다. rotation 이생략될경우회전이수행되지않습니다. Rd, Rn 또는 Rm 에 r15 를사용하면안됩니다. 4-112 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 연산 이러한명령어는다음을수행합니다. 1. Rm 의값을오른쪽으로 0, 8, 16 또는 24 비트만큼회전합니다 (ARM 및 Thumb-2 에만해당 ). 2. 얻은값에대해다음중하나를수행합니다. 비트 [7:0] 을추출하고 32비트로부호확장또는 0 확장합니다. 명령어가확장및더하기이면 Rn의값을더합니다. 비트 [15:0] 을추출하고 32비트로부호확장또는 0 확장합니다. 명령어가확장및더하기이면 Rn의값을더합니다. 비트 [23:16] 및비트 [7:0] 을추출하고 32비트로부호확장또는 0 확장합니다. 명령어가확장및더하기이면 Rn의비트 [31:16] 및비트 [15:0] 에각각더해결과의비트 [31:16] 및비트 [15:0] 을얻습니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. SXTB Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. SXTH Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. UXTB Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. UXTH Rd, Rm Rd 및 Rm 은모두 Lo 레지스터여야합니다. 아키텍처 이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. SXT 및 UXT Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. SXTA 및 UXTA Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 16 비트 Thumb 명령어는 ARMv6 이상에서사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-113

ARM 및 Thumb 명령어 예제 SXTH r3, r9, r4 UXTAB16EQ r0, r0, r4, ROR #16 올바르지않은예제 SXTH r9, r3, r2, ROR #12 ; rotation must be by 0, 8, 16, or 24. 4-114 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.8.4 PKHBT 및 PKHTB 하프워드패킹명령어 두레지스터의하프워드를결합합니다. 하프워드를추출하기전에피연산자중하나가시프트될수있습니다. 구문 PKHBT{cond} {Rd}, Rn, Rm{, LSL #leftshift} PKHTB{cond} {Rd}, Rn, Rm{, ASR #rightshift} 인수설명 : PKHBT Rn 의비트 [15:0] 을 Rm 에서시프트된값의비트 [31:16] 과결합합니다. PKHTB Rn 의비트 [31:16] 을 Rm 에서시프트된값의비트 [15:0] 과결합합니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rn 첫번째피연산자가들어있는레지스터입니다. Rm 첫번째피연산자가들어있는레지스터입니다. leftshift 0 ~ 31 범위에있어야합니다. rightshift 1 ~ 32 범위에있어야합니다. Rd, Rn 또는 Rm 에 r15 를사용하면안됩니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-115

ARM 및 Thumb 명령어 아키텍처 이러한 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 예제 PKHBT r0, r3, r5 ; combine the bottom halfword of r3 with the top halfword of r5 PKHBT r0, r3, r5, LSL #16 ; combine the bottom halfword of r3 with the bottom halfword of r5 PKHTB r0, r3, r5, ASR #16 ; combine the top halfword of r3 with the top halfword of r5 또한다양한시프트값을사용하여두번째피연산자의스케일을지정할수도있습니다. 올바르지않은예제 PKHBTEQ r4, r5, r1, ASR #8 ; ASR not permitted with PKHBT 4-116 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.9 분기명령어 이단원에는다음소단원이포함되어있습니다. 4-118페이지의 B, BL, BX, BLX 및 BXJ 분기, 링크포함분기, 분기및교환명령어세트, 링크포함분기및교환명령어세트, 분기및 Jazelle로변경명령어세트 4-122페이지의 CBZ 및 CBNZ 0 및분기비교 4-123페이지의 TBB 및 TBH 테이블분기바이트또는하프워드 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-117

ARM 및 Thumb 명령어 4.9.1 B, BL, BX, BLX 및 BXJ 분기, 링크포함분기, 분기및교환명령어세트, 링크포함분기및교환명령어세트, 분기및 Jazelle 상태로변경 구문 op{cond}{.w} label op{cond} Rm 인수설명 : op 다음중하나입니다. B 분기 BL 링크포함분기 BX 분기및교환명령어세트 BLX 링크포함분기및교환명령어세트 BXJ 분기및 Jazelle 실행으로변경 cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). cond 는이명령어의모든형식에서사용할수없습니다 (4-119 페이지의명령어사용가능여부및분기범위참조 )..W Thumb-2 에서 32 비트 B 명령어를사용하도록지시하는선택적명령어너비지정자입니다. 자세한내용은 4-120 페이지의 Thumb-2 의 B 를참조하십시오. label 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. Rm 분기할주소가들어있는레지스터입니다. 연산 이러한모든명령어는 label 또는 Rm 에들어있는주소로분기를생성합니다. 이외에도이러한명령어는다음작업을수행합니다. BL 및 BLX 명령어는그다음명령어의주소를 r14(lr, 링크레지스터 ) 에복사합니다. BX 및 BLX 명령어는프로세서상태를 ARM 에서 Thumb 으로변경하거나 Thumb 에서 ARM 으로변경할수있습니다. 4-118 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 BLX label 은항상상태를변경합니다. BX Rm 및 BLX Rm은다음과같이 Rm의비트 [0] 에서타겟상태를파생합니다. Rm의비트 [0] 이 0일경우프로세서가 ARM 상태로변경되거나 ARM 상태를유지합니다. Rm의비트 [0] 이 1일경우프로세서가 Thumb 상태로변경되거나 Thumb 상태를유지합니다. BXJ 명령어는프로세서를 Jazelle 상태로변경합니다. 명령어사용가능여부및분기범위 표 4-7 에서는 ARM 및 Thumb 상태에서사용할수있는명령어를보여줍니다. 이표에나와있지않은명령어는사용할수없습니다. 괄호안의참고정보는명령어를사용할수있는첫번째아키텍처버전을나타냅니다. 표 4-7 분기명령어사용가능여부및범위 명령어 ARM 32 비트 Thumb 32 비트 Thumb B label ±32MB ( 모두 ) ±2KB ( 모든 T) ±16MB a B{cond} label ±32MB ( 모두 ) -252 ~ +258 ( 모든 T) ±1MB a B Rm BX Rm 사용 BX Rm 사용 16 비트 BX Rm 사용 B{cond} Rm BX{cond} Rm 사용 - - BL label ±32MB ( 모두 ) ±4MB b ( 모든 T) ±16MB BL{cond} label ±32MB ( 모두 ) - - BL Rm BLX Rm 사용 BLX Rm 사용 16 비트 BLX Rm 사용 BL{cond} Rm BLX{cond} Rm 사용 - - BX Rm 사용할수있음 (4T, 5) 사용할수있음 ( 모든 T) 16 비트사용 BX{cond} Rm 사용할수있음 (4T, 5) - - BLX label ±32MB (5) ±4MB c (5T) ±16MB d BLX Rm 사용할수있음 (5) 사용할수있음 (5T) 16 비트사용 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-119

ARM 및 Thumb 명령어 BLX{cond} Rm 사용할수있음 (5) - - BXJ Rm 사용할수있음 (5J, 6) - 사용할수있음 d BXJ{cond} Rm 사용할수있음 (5J, 6) - - a..w를사용하여이 32비트명령어를사용하도록어셈블러에지시합니다. b. 명령어쌍입니다. c. 명령어쌍입니다. d. ARMv7-M에서사용할수없음 표 4-7 분기명령어사용가능여부및범위 ( 계속 ) 명령어 ARM 32 비트 Thumb 32 비트 Thumb 분기범위확장 시스템수준 B 및 BL 명령어는현재명령어의주소부터시작하도록범위가제한됩니다. 그러나 label 이범위를벗어나더라도이러한명령어를사용할수있습니다. 종종링커에서배치하는 label 의위치를모를수있습니다. 필요한경우링커에서는더긴분기를활성화하는코드를추가합니다 (RealView Compilation Tools 링커및유틸리티설명서의 3 장기본링커기능사용참조 ). 이러한코드를 veneer 라고합니다. Thumb-2 의 B.W 너비지정자를사용하여 Thumb-2 코드에서 32 비트명령어를생성하도록 B 에지시할수있습니다. B.W 는 16 비트명령어를사용하여타겟에도달할수있는경우에도항상 32 비트명령어를생성합니다. 정방향참조의경우, 32 비트 Thumb 명령어를사용하여도달할수있는타겟에서오류를발생시킬수있더라도.W 가없는 B 는 Thumb 코드에서항상 16 비트명령어를생성합니다. Thumb-2EE 의 BX, BLX 및 BXJ 이러한명령어는 Thumb-2EE 코드에서분기로사용할수있지만상태를변경하는데는사용할수는없습니다. Thumb-2EE 에서이러한명령어의 op{cond} label 형식을사용할수없습니다. 레지스터형식에서 Rm 의비트 [0] 은 1 이어야하고실행은 ThumbEE 상태의타겟주소에서계속됩니다. 4-120 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처 이러한명령어의아키텍처별사용가능여부에대한자세한내용은 4-119 페이지의명령어사용가능여부및분기범위를참조하십시오. 예제 B loopa BLE ng+8 BL subc BLLT rtx BEQ {pc}+4 ; #0x8004 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-121

ARM 및 Thumb 명령어 4.9.2 CBZ 및 CBNZ 0 인경우비교및분기, 0 이아닌경우비교및분기 구문 CBZ Rn, label CBNZ Rn, label 인수설명 : Rn 피연산자가들어있는레지스터입니다. label 분기대상입니다. 사용법 CBZ 또는 CBNZ 명령어를사용하면 0 및분기코드시퀀스를비교하여하나의명령어를저장할수있습니다. 조건코드플래그를변경하지않는다는점을제외하고 CBZ Rn, label 은다음과같습니다. CMP Rn, #0 BEQ label 조건코드플래그를변경하지않는다는점을제외하고 CBNZ Rn, label 은다음과같습니다. CMP Rn, #0 BNE label 제한 분기대상이명령어다음에 4 ~ 30 바이트내에있어야합니다. 이러한명령어는 IT 블록내에서사용하면안됩니다. 조건플래그 이러한명령어는플래그를변경하지않습니다. 아키텍처 이러한 16 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 ARM 또는 32 비트 Thumb 버전은없습니다. 4-122 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.9.3 TBB 및 TBH 테이블분기바이트및테이블분기하프워드 구문 TBB [Rn, Rm] TBH [Rn, Rm, LSL #1] 인수설명 : Rn Rm 기준레지스터입니다. 이레지스터에는분기길이테이블의주소가포함됩니다. Rn 에 r15 를지정하면명령어주소에 4 를더한값이사용됩니다. 인덱스레지스터입니다. 테이블에대한인덱스가포함되어있습니다. Rm 은 r15 이면안됩니다. 연산 이러한명령어는단일바이트오프셋 (TBB) 이나하프워드오프셋 (TBH) 테이블을사용하여 pc 상대정방향분기를생성합니다. Rn 은테이블에대한포인터를제공하고 Rm 은테이블에대한인덱스를제공합니다. 분기길이는테이블에서반환된바이트 (TBB) 또는하프워드 (TBH) 값의두배입니다. 참고정보 Thumb-2EE 에서는기준레지스터의값이 0 일경우실행이 HandlerBase - 4 에서 NullCheck 처리기로분기됩니다. 아키텍처 이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한명령어의 ARM 또는 16 비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-123

ARM 및 Thumb 명령어 4.10 보조프로세서명령어 이단원에서는 VFP(5 장 NEON 및 VFP 프로그래밍참조 ) 또는 Wireless MMX 기술명령어 (6 장 Wireless MMX 기술명령어참조 ) 에대해설명하지않습니다. XScale 관련명령어는이장의뒷부분에서설명합니다 (4-132 페이지의기타제한참조 ). 이장에는다음단원이포함되어있습니다. 4-125페이지의 CDP 및 CDP2 보조프로세서데이터연산 4-126페이지의 MCR, MCR2, MCRR 및 MCRR2 가능한한보조프로세서연산을통해 ARM 레지스터또는레지스터에서보조프로세서로이동 4-128페이지의 MRC, MRC2, MRRC 및 MRRC2 가능한한보조프로세서연산을통해보조프로세서에서 ARM 레지스터또는레지스터로이동 4-130페이지의 LDC, LDC2, STC 및 STC2 메모리와보조프로세서간데이터전송 참고지정된보조프로세서가없거나활성화되지않은경우보조프로세서명령어가정의되지않은명령어예외를발생시킵니다. 4-124 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.10.1 CDP 및 CDP2 보조프로세서데이터연산 구문 op{cond} coproc, #opcode1, CRd, CRn, CRm{, #opcode2} 인수설명 : op CDP 또는 CDP2 입니다. cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). ARM 코드에서 cond 는 CDP2 에대해허용되지않습니다. coproc 명령어의대상프로세서이름입니다. 표준이름은 pn 입니다. 여기서 n 은 0 에서 15 사이의정수입니다. opcode1 보조프로세서관련 opcode 입니다. CRd, CRn, CRm 보조프로세서레지스터입니다. opcode2 선택적보조프로세서관련 opcode 입니다. 사용법 이러한명령어의사용방법은보조프로세서에따라다릅니다. 자세한내용은보조프로세서설명서를참조하십시오. 아키텍처 CDP ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. CDP2 ARM 명령어는 ARMv5 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-125

ARM 및 Thumb 명령어 4.10.2 MCR, MCR2, MCRR 및 MCRR2 ARM 레지스터또는여러 ARM 레지스터에서보조프로세서로이동. 보조프로세서에따라다양한연산을추가로지정할수도있습니다. 구문 op{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op{cond} coproc, #opcode1, Rt, Rt2, CRm 인수설명 : op MCR, MCR2, MCRR 또는 MCRR2 중하나입니다. cond coproc 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). ARM 코드에서 cond 는 MCR2 또는 MCRR2 에대해허용되지않습니다. 명령어의대상프로세서이름입니다. 표준이름은 pn 입니다. 여기서 n 은 0 에서 15 사이의정수입니다. opcode1 보조프로세서관련 opcode 입니다. Rt, Rt2 CRn, CRm opcode2 ARM 소스레지스터입니다. Rt2 는 MCRR 및 MCRR2 에서만사용할수있습니다. MCRR 또는 MCRR2 에서 Rt 또는 Rt2 에 r15 를사용하면안됩니다. 보조프로세서레지스터입니다. CRn 은 MCR 및 MCR2 에서만사용할수있습니다. MCR 및 MCR2 에서사용할수있는선택적보조프로세서관련 opcode 입니다. 사용법 이러한명령어의사용방법은보조프로세서에따라다릅니다. 자세한내용은보조프로세서설명서를참조하십시오. 4-126 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 아키텍처 MCR ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. MCR2 ARM 명령어는 ARMv5 이상에서사용할수있습니다. MCRR ARM 명령어는 ARMv6 이상과 ARMv5의 E 변형에서사용할수있습니다. MCRR2 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-127

ARM 및 Thumb 명령어 4.10.3 MRC, MRC2, MRRC 및 MRRC2 보조프로세서에서 ARM 레지스터또는레지스터로이동 보조프로세서에따라다양한연산을추가로지정할수도있습니다. 구문 op{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op{cond} coproc, #opcode1, Rt, Rt2, CRm 인수설명 : op MRC, MRC2, MRRC 또는 MRRC2입니다. cond coproc 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). ARM 코드에서 cond 는 MRC2 또는 MRRC2 에대해허용되지않습니다. 명령어의대상프로세서이름입니다. 표준이름은 pn 입니다. 여기서 n 은 0 에서 15 사이의정수입니다. opcode1 보조프로세서관련 opcode 입니다. Rt, Rt2 CRn, CRm opcode2 ARM 소스레지스터입니다. r15 를사용하면안됩니다. Rt2 는 MRRC 및 MRRC2 에서만사용할수있습니다. MRC 및 MRC2 에서 Rt 는 APSR_nzcv 일수있습니다. 보조프로세서레지스터입니다. CRn 은 MRC 및 MRC2 에서만사용할수있습니다. MRC 및 MRC2 에서사용할수있는선택적보조프로세서관련 opcode 입니다. 사용법 이러한명령어의사용방법은보조프로세서에따라다릅니다. 자세한내용은보조프로세서설명서를참조하십시오. 4-128 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 아키텍처 MRC ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. MRC2 ARM 명령어는 ARMv5 이상에서사용할수있습니다. MRRC ARM 명령어는 ARMv6 이상과 ARMv5의 E 변형에서사용할수있습니다. MRRC2 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-129

ARM 및 Thumb 명령어 4.10.4 LDC, LDC2, STC 및 STC2 메모리와보조프로세서간데이터전송 구문 op{l}{cond} coproc, CRd, [Rn] op{l}{cond} coproc, CRd, [Rn, #{-}offset]{!} op{l}{cond} coproc, CRd, [Rn], #{-}offset op{l}{cond} coproc, CRd, label 인수설명 : op LDC, LDC2, STC 또는 STC2 중하나입니다. cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). ARM 코드에서 cond는 LDC2 또는 STC2에대해허용되지않습니다. L long 전송을지정하는선택적접미사입니다. coproc 명령어의대상프로세서이름입니다. 표준이름은 pn 입니다. 여기서 n 은 0 에서 15 사이의정수입니다. CRd 로드또는저장할보조프로세서레지스터입니다. Rn 메모리주소의기준이되는레지스터입니다. r15 를지정하면현재명령어의주소에 8 을더한값이사용됩니다. - 선택적빼기기호입니다. - 가있으면 Rn 에서오프셋을빼고, 그렇지않으면 Rn 에오프셋을더합니다. offset 0 ~ 1020 범위에있는 4 의배수로평가되는식입니다.! 선택적접미사입니다.! 기호가있으면오프셋이포함된주소가 Rn 에다시기록됩니다. label 워드로정렬된프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. label 은현재명령어의 1020 바이트내에있어야합니다. 4-130 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 사용법 이러한명령어의사용방법은보조프로세서에따라다릅니다. 자세한내용은보조프로세서설명서를참조하십시오. Thumb-2EE 에서는기준레지스터의값이 0 일경우실행이 HandlerBase - 4 에서 NullCheck 처리기로분기됩니다. 아키텍처 LDC와 STC는모든버전의 ARM 아키텍처에서사용할수있습니다. LDC2와 STC2는 ARMv5 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이러한명령어의 16비트 Thumb 버전은없습니다. 참고정보 ARMv6T2 이상에서는 STC 및 STC2 명령어에서 pc 상대주소를향후사용할수없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-131

ARM 및 Thumb 명령어 4.11 기타제한 이단원에는다음소단원이포함되어있습니다. 4-133페이지의 BKPT 브레이크포인트 4-134페이지의 SVC 관리자호출 ( 이전 SWI) 4-135페이지의 MRS CPSR 또는 SPSR의내용을범용레지스터로이동 4-137페이지의 MSR 즉치상수를사용하거나범용레지스터의내용에서 CPSR 또는 SPSR의지정된필드로드 4-139페이지의 CPS 프로세서상태변경 4-141페이지의 SMC 보안모니터호출 ( 이전 SMI) 4-142페이지의 SETEND CPSR에서엔디안비트 4-143페이지의 NOP, SEV, WFE, WFI 및 YIELD 연산없음, 이벤트설정, 이벤트대기, 인터럽트대기및양도힌트명령어 4-145페이지의 DBG, DMB, DSB 및 ISB 디버그, 데이터메모리장벽, 데이터동기화장벽및명령어동기화장벽힌트명령어 4-147페이지의 MAR 및 MRA XScale 보조프로세서 0 명령어두개의범용레지스터와 40비트내부누산기간에데이터전송 4-132 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.1 BKPT 브레이크포인트 구문 BKPT #immed 인수설명 : immed 다음범위에있는정수로평가되는식입니다. ARM 명령어의경우, 0 ~ 65535(16비트값 ) 16비트 Thumb 명령어의경우, 0 ~ 255(8비트값 ) 사용법 BKPT 명령어는프로세서를디버그상태로변경합니다. 디버그도구는특정주소의명령어에도달하면이명령어를사용하여시스템상태를조사할수있습니다. ARM 상태와 Thumb 상태모두에서 ARM 하드웨어는 immed 를무시합니다. 그러나디버거는이식을사용하여브레이크포인트에대한추가정보를저장할수있습니다. 아키텍처이 ARM 명령어는 ARMv5 이상에서사용할수있습니다. 이 16비트 Thumb 명령어는 ARMv5 이상의 T 변형에서사용할수있습니다. 이명령어의 32비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-133

ARM 및 Thumb 명령어 4.11.2 SVC 관리자호출 구문 SVC{cond} #immed 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). immed 다음범위에있는정수로평가되는식입니다. ARM 명령어의경우, 0 ~ 2 24-1(24비트값 ) 16비트 Thumb 명령어의경우, 0 ~ 255(8비트값 ) 사용법 SVC 명령어는예외를발생시킵니다. 즉, 프로세서모드가관리자로변경되고, CPSR 이관리자모드 SPSR 로저장되며, 예외가 SVC 벡터로분기됩니다 (RealView Compilation Tools 개발자설명서의 6 장프로세서예외처리참조 ). 프로세서에서는 immed 를무시하지만예외처리기에서는요청중인서비스를확인하기위해이식을검색할수있습니다. 참고 ARM 어셈블리언어를개발하는과정에서 SWI 명령어의이름이 SVC 로변경되었습니다. 이번 RVCT 릴리스에서는 SWI 명령어가 SVC 로디스어셈블되고해당명령어가이전에는 SWI 였다는주석이추가됩니다. 조건플래그 이명령어는플래그를변경하지않습니다. 아키텍처 이 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 이 16 비트 Thumb 명령어는 ARM 아키텍처의모든 T 변형과 ARMv6 이상의 T2 변형에서사용할수있습니다. 4-134 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.3 MRS PSR 의내용을범용레지스터로이동 구문 MRS{cond} Rd, psr 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). Rd 대상레지스터입니다. Rd 는 r15 이면안됩니다. psr 다음중하나입니다. APSR 모든프로세서와모든모드에서사용할수있습니다. CPSR SPSR APSR 에대한향후제공되지않을동의어이며디버그상태에서사용할수있습니다. ARMv7-M 을제외한모든프로세서의권한모드에서만사용할수있습니다. Mpsr ARMv7-M 프로세서에서만사용할수있습니다. Mpsr IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, DSP, PRIMASK, BASEPRI, BASEPRI_MAX 또는 CONTROL 중하나일수있습니다. 사용법 PSR 을업데이트하기위한읽기 - 수정 - 쓰기시퀀스에서 MSR 과함께 MRS 를사용하여프로세서모드를변경하거나 Q 플래그를지우는등의작업을수행합니다. 프로세스스왑코드에서는스왑중인원본프로세스의프로그래머모델상태를관련 PSR 내용과함께저장해야합니다. 마찬가지로스왑중인대상프로세스의상태도복원해야합니다. 이러한작업에서는 MRS/store 및 load/msr 명령어시퀀스를사용합니다. SPSR 프로세서가사용자또는시스템모드에있을때는 SPSR 에액세스하려고시도하면안됩니다. 이것은사용자의책임입니다. 어셈블러에서는실행시간에프로세서모드에대한정보가없기때문에이에대한경고를표시할수없습니다. 프로세서가사용자또는시스템모드에있을때 SPSR 에액세스하려고하면예상할수없는결과가발생합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-135

ARM 및 Thumb 명령어 CPSR CPSR 실행상태비트는프로세서가디버그상태인중단디버그모드에있을때만읽을수있습니다. 그렇지않으면 CPSR 실행상태비트가 0 으로표시됩니다. 조건플래그는모든프로세서의모든모드에서읽을수있습니다. CPSR 대신 APSR 을사용하십시오. 조건플래그 이명령어는플래그를변경하지않습니다. 아키텍처이 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이명령어의 16비트 Thumb 버전은없습니다. 4-136 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.4 MSR 즉치상수나범용레지스터의내용을 PSR( 프로그램상태레지스터 ) 의지정된필드에로드 구문 (ARMv7-M 제외 ) MSR{cond} APSR_flags, #constant MSR{cond} APSR_flags, Rm MSR{cond} psr_fields, #constant MSR{cond} psr_fields, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). flags constant 이동할 APSR 플래그를지정합니다. flags 는다음중하나이상일수있습니다. nzcvq ALU 플래그필드마스크의경우, PSR[31:27]( 사용자모드 ) g SIMD GE 플래그필드마스크의경우, PSR[19:16]( 사용자모드 ) 숫자상수로평가되는식입니다. 상수는 32 비트워드내에서짝수비트수만큼회전하는 8 비트패턴에해당해야합니다. Thumb 에서는사용할수없습니다. Rm 소스레지스터입니다. psr 다음중하나입니다. CPSR 디버그상태에서사용할수있으며 APSR 에대한향후제공되지않을동의어이기도합니다. SPSR 모든프로세서의권한모드에서만사용할수있습니다. fields 이동할 SPSR 또는 CPSR 필드를지정합니다. fields 는다음중하나이상일수있습니다. c 제어필드마스크바이트의경우, PSR[7:0]( 권한모드 ) x 확장필드마스크바이트의경우, PSR[15:8]( 권한모드 ) s 상태필드마스크바이트의경우, PSR[23:16]( 권한모드 ) f 플래그필드마스크바이트의경우, PSR[31:24]( 권한모드 ) ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-137

ARM 및 Thumb 명령어 구문 (ARMv7-M) MSR{cond} psr, Rm 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rm 소스레지스터입니다. psr APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, DSP, PRIMASK, BASEPRI, BASEPRI_MAX 또는 CONTROL 중하나일수있습니다. ARMv7-M 에만해당합니다. 사용법 자세한내용은 4-135 페이지의 MRS 를참조하십시오. 사용자모드 APSR 을사용하여조건플래그, Q 또는 GE 비트에액세스합니다. CPSR 의할당되지않은상태비트, 권한있는상태비트또는실행상태비트에쓰기가무시됩니다. 이것은사용자모드프로그램을권한모드로변경할수없도록합니다. 사용자또는시스템모드에있을때 SPSR 에액세스하면예상할수없는결과가발생합니다. 조건플래그 APSR_nzcvq 또는 CPSR_f 필드를지정하면이명령어는플래그를명시적으로업데이트합니다. 아키텍처이 ARM 명령어는모든버전의 ARM 아키텍처에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이명령어의 16비트 Thumb 버전은없습니다. 4-138 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.5 CPS CPS( 프로세서상태변경 ) 는 CPSR 에서하나이상의모드와 A, I 및 F 비트를변경하고다른 CPSR 비트는변경하지않습니다. CPS 는권한모드에서만사용할수있고사용자모드에서는아무런영향을주지않습니다. CPS 는조건명령어일수없으며 IT 블록에서사용할수없습니다. 구문 CPSeffect iflags{, #mode} CPS #mode 인수설명 : effect 다음중하나입니다. IE 인터럽트또는어보트사용 ID 인터럽트또는어보트사용안함 iflags 다음중하나이상의시퀀스입니다. a 부정확한어보트를사용하거나사용하지않습니다. i IRQ 인터럽트를사용하거나사용하지않습니다. f FIQ 인터럽트를사용하거나사용하지않습니다. mode 변경할모드의번호를지정합니다. 조건플래그 이명령어는조건플래그를변경하지않습니다. 16 비트명령어 이러한명령어의다음형식은 Thumb 코드에서사용할수있으며, Thumb-2 코드에서사용될경우 16 비트명령어입니다. CPSIE iflags 16 비트 Thumb 명령어에서모드변경을지정할수없습니다. CPSID iflags 16 비트 Thumb 명령어에서는모드변경을지정할수없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-139

ARM 및 Thumb 명령어 아키텍처이 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이러한 32비트 Thumb 명령어는 ARMv6T2와 ARMv7에서사용할수있습니다. 이 16비트 Thumb 명령어는 ARMv6 이상의 T 변형에서사용할수있습니다. 예제 CPSIE if ; enable interrupts and fast interrupts CPSID A ; disable imprecise aborts CPSID ai, #17 ; disable imprecise aborts and interrupts, and enter FIQ mode CPS #16 ; enter User mode 4-140 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.6 SMC 보안모니터호출 자세한내용은 ARM Architecture Reference Manual Security Extensions Supplement 를참조하십시오. 구문 SMC{cond} #immed_16 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). immed_16 16 비트즉치값입니다. ARM 프로세서에서는이값을무시하지만 SMC 예외처리기에서는요청중인서비스를확인하기위해이값을사용할수있습니다. 참고 ARM 어셈블리언어를개발하는과정에서 SMI 명령어의이름이 SMC 로변경되었습니다. 이번 RVCT 릴리스에서는 SMI 명령어가 SMC 로디스어셈블되고해당명령어가이전에는 SMI 였다는주석이추가됩니다. 아키텍처 이 ARM 명령어는보안확장이있는 ARMv6 이상의구현에서사용할수있습니다. 이 32 비트 Thumb 명령어는보안확장이있는 ARMv6T2 및 ARMv7 의구현에서사용할수있습니다. 이명령어의 16 비트 Thumb 버전은없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-141

ARM 및 Thumb 명령어 4.11.7 SETEND CPSR 에서다른비트에영향을주지않고엔디안비트설정 SETEND 는조건명령어일수없으며 IT 블록에서사용할수없습니다. 구문 SETEND specifier 인수설명 : specifier 다음중하나입니다. 사용법 BE LE 빅엔디안리틀엔디안 SETEND 를사용하여다양한엔디안에액세스합니다. 예를들어다른리틀엔디안응용프로그램에서여러빅엔디안 DMA 서식데이터필드에액세스합니다. 아키텍처 이 ARM 명령어는 ARMv6 이상에서사용할수있습니다. 이 16 비트 Thumb 명령어는 ARMv7-M 프로파일을제외하고 ARMv6 이상의 T 변형에서사용할수있습니다. 이명령어의 32 비트 Thumb 버전은없습니다. 예제 SETEND BE ; Set the CPSR E bit for big-endian accesses LDR r0, [r2, #header] LDR r1, [r2, #CRC32] SETEND le ; Set the CPSR E bit for little-endian accesses for the ; rest of the application 4-142 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.8 NOP, SEV, WFE, WFI 및 YIELD 연산없음, 이벤트설정, 이벤트대기, 인터럽트대기및양도 구문 NOP{cond} SEV{cond} WFE{cond} WFI{cond} YIELD{cond} 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). 사용법 힌트명령어로, 경우에따라구현하거나구현하지않을수있습니다. 이러한명령어중하나를구현하지않으면해당명령어는 NOP 처럼동작합니다. NOP NOP 는아무작업도수행하지않습니다. 타겟아키텍처에서 NOP 가특정명령어로구현되지않으면어셈블러는 MOV r0, r0(arm) 또는 MOV r8, r8(thumb) 과같이아무작업도수행하지않는대체명령어를생성합니다. NOP 는시간이걸리는 NOP 가아닐수도있습니다. 프로세서는이명령어가실행단계에도달하기전에파이프라인에서이명령어를제거할수있습니다. NOP 를패딩에사용할수있습니다. 예를들어 64 비트경계에그다음명령어를배치할수있습니다. SEV SEV 는다중프로세서시스템내의모든코어에신호를보낼이벤트를발생시킵니다. SEV 가구현될경우 WFE 도구현되어야합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-143

ARM 및 Thumb 명령어 WFE 이벤트레지스터가설정되지않은경우 WFE는다음이벤트중하나가발생할때까지실행을일시중단합니다. CPSR I 비트로마스킹되지않은경우, IRQ 인터럽트 CPSR F 비트로마스킹되지않은경우, FIQ 인터럽트 CPSR A 비트로마스킹되지않은경우, 부정확한데이터어보트 디버그를사용하는경우, 디버그시작요청 SEV 명령어를통해다른프로세서의신호를받는이벤트 이벤트레지스터가설정될경우 WFE 는이를해제하고즉시원래상태로되돌립니다. WFE 가구현될경우 SEV 도구현되어야합니다. WFI WFI는다음이벤트중하나가발생할때까지실행을일시중단합니다. CPSR I 비트에관계없이 IRQ 인터럽트 CPSR F 비트에관계없이 FIQ 인터럽트 CPSR A 비트로마스킹되지않은경우, 부정확한데이터어보트 디버그를사용하는지여부에관계없이디버그시작요청 YIELD YIELD 는현재스레드가스왑이가능한 spinlock 과같은작업을수행중임을하드웨어에알립니다. 하드웨어는이힌트를사용하여다중스레드시스템에서스레드를일시중단하고다시시작할수있습니다. 아키텍처 이러한 ARM 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 32 비트 Thumb 명령어는 ARMv6T2 와 ARMv7 에서사용할수있습니다. 이러한 16 비트 Thumb 명령어는 ARMv6T2 이상과 ARMv6 의 K 변형에서사용할수있습니다. NOP 는다른모든 ARM 및 Thumb 아키텍처에서의사명령어로사용할수있습니다. 4-144 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.9 DBG, DMB, DSB 및 ISB 디버그, 데이터메모리장벽, 데이터동기화장벽및명령어동기화장벽 구문 DBG{cond} {#option} DMB{cond} {option} DSB{cond} {option} ISB{cond} {option} 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). option 힌트작업에대한선택적제한입니다. 사용법 힌트명령어로, 경우에따라구현하거나구현하지않을수있습니다. 이러한명령어중하나를구현하지않으면해당명령어는 NOP 처럼동작합니다. DBG 디버그힌트는디버그및관련시스템에대한힌트를제공합니다. 이러한시스템에서이명령어가어떤용도로사용되는지보려면해당시스템설명서를참조하십시오. DMB 메모리장벽역할을하는데이터메모리장벽으로, 프로그램순서에서 DMB 명령어앞에있는모든명시적메모리액세스가 DMB 명령어뒤에있는명시적메모리액세스보다앞에표시되도록합니다. 이때프로세서에서실행중인다른명령어의순서에는영향을주지않습니다. 허용되는 option 의값은다음과같습니다. SY 전체시스템 DMB 작업. 기본값이며생략할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-145

ARM 및 Thumb 명령어 DSB 특수한유형의메모리장벽역할을하는데이터동기화장벽. 이명령어가완료될때까지프로그램순서에서이명령어뒤에있는명령어는실행되지않습니다. 이명령어는다음경우에완료됩니다. 이명령어앞에있는모든명시적메모리액세스가완료될경우다음사항이적용됩니다. 이명령어앞에있는모든캐시, 분기예측기및 TLB 유지관리작업이완료될경우다음사항이적용됩니다. 허용되는값은다음과같습니다. SY 전체시스템 DSB 작업. 기본값이며생략할수있습니다. UN ST UNST 통합지점까지만수행되는 DSB 작업 저장이완료될때까지만기다리는 DSB 작업 저장이완료될때까지만기다리고통합지점까지만수행되는 DSB 작업 ISB 명령어동기화장벽은 ISB 명령어가완료된후이명령어뒤에있는모든명령어를캐시나메모리에서가져오기위해프로세서에서파이프라인을플러시합니다. 이렇게하면 ISB 명령어앞에서실행된 CP15 레지스터에대한모든변경작업뿐아니라 ASID 변경같은컨텍스트변경작업, 완료된 TLB 유지관리작업또는분기예측기작업의효과가 ISB 명령어뒤에서가져온명령어에나타납니다. 또한 ISB 명령어는프로그램순서에서자신보다뒤에있는모든분기가항상자신보다뒤에있는컨텍스트를사용하여분기예상논리에기록되도록합니다. 이것은명령어스트림이올바로실행되도록하는데필요합니다. 허용되는 option 의값은다음과같습니다. SY 전체시스템 DMB 작업. 기본값이며생략할수있습니다. 아키텍처 이러한 ARM 및 32 비트 Thumb 명령어는 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb 버전은없습니다. 4-146 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.11.10 MAR 및 MRA XScale 보조프로세서 0 명령어 두개의범용레지스터와 40 비트내부누산기간에데이터를전송합니다. 구문 MAR{cond} Acc, RdLo, RdHi MRA{cond} RdLo, RdHi, Acc 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Acc RdLo, RdHi 내부누산기입니다. 표준이름은 accx 입니다. 여기서 x 는 0 ~ n 범위에있는정수입니다. n 의값은프로세서에따라달라집니다. 현재프로세서에서는 0 입니다. 범용레지스터입니다. RdLo 및 RdHi 는 pc 이면안되며, MRA 의경우서로다른레지스터여야합니다. 사용법 MAR 명령어는 RdLo 의내용을 Acc 의비트 [31:0] 에복사하고 RdHi 의최하위바이트를 Acc 의비트 [39:32] 에복사합니다. MRA 명령어의경우 Acc의비트 [31:0] 을 RdLo에복사합니다. Acc의비트 [39:32] 를 RdHi의비트 [7:0] 에복사합니다. Acc의비트 [39] 를 RdHi의비트 [31:8] 에복사하여값을부호확장합니다. 아키텍처 이러한 ARM 명령어는 XScale 프로세서에서만사용할수있습니다. 이러한명령어의 Thumb 버전은없습니다. 예제 MAR MRA MARNE MRAGT acc0, r0, r1 r4, r5, acc0 acc0, r9, r2 r4, r8, acc0 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-147

ARM 및 Thumb 명령어 4.12 ThumbEE 명령어 ENTERX 와 LEAVEX 를제외하고이러한 ThumbEE 명령어는 --thumbx 명령행옵션이나 THUMBX 지시문을사용하여어셈블러가 ThumbEE 상태로전환된경우에만허용됩니다. 이단원에는다음소단원이포함되어있습니다. 4-149페이지의 ENTERX 및 LEAVEX Thumb 상태와 ThumbEE 상태간전환 4-150페이지의 CHKA 배열검사 4-151페이지의 HB, HBL, HBLP 및 HBP 처리기분기, 지정된처리기로분기 4-148 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.12.1 ENTERX 및 LEAVEX Thumb 상태와 ThumbEE 상태간전환 구문 ENTERX LEAVEX 사용법 ENTERX 는 Thumb 상태를 ThumbEE 상태로변경하거나 ThumbEE 상태를유지합니다. LEAVEX 는 ThumbEE 상태를 Thumb 상태로변경하거나 Thumb 상태를유지합니다. IT 블록에서는 ENTERX 또는 LEAVEX 를사용하면안됩니다. 아키텍처 이러한명령어는 ARM 명령어세트에서사용할수없습니다. 이러한 32 비트 Thumb 및 Thumb-2EE 명령어는 Thumb-2EE 를지원하는 ARMv7 에서사용할수있습니다. 이러한명령어의 16 비트 Thumb-2 버전은없습니다. 자세한내용은 ARM Architecture Reference Manual Thumb-2 Execution Environment Supplement 를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-149

ARM 및 Thumb 명령어 4.12.2 CHKA CHKA( 배열검사 ) 는두레지스터에있는부호없는값을비교합니다. 첫번째레지스터의값이두번째레지스터의값보다작거나같으면 pc 를 lr 에복사하고 IndexCheck 처리기로분기를생성합니다. 구문 CHKA Rn, Rm 인수설명 : Rn Rm 배열크기가들어있습니다. r0 ~ r12, SP 또는 LR 중하나일수있습니다. 배열인덱스가들어있습니다. r0 ~ r12 또는 LR 중하나일수있습니다. 아키텍처 이명령어는 ARM 상태에서사용할수없습니다. 이 16 비트 ThumbEE 명령어는 Thumb-2EE 를지원하는 ARMv7 에서만사용할수있습니다. 4-150 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.12.3 HB, HBL, HBLP 및 HBP 처리기분기, 지정된처리기로분기 이명령어는선택적으로복귀주소를 lr 에저장하거나매개변수를처리기에전달할수있으며두작업을모두수행할수도있습니다. 구문 HB{L} #HandlerID HB{L}P #immed, #HandlerID 인수설명 : L P immed 선택적접미사입니다. L 이있을경우이명령어는복귀주소를 lr 에저장합니다. 선택적접미사입니다. P 가있을경우이명령어는 immed 의값을 r8 에있는처리기에전달합니다. 즉치값입니다. L 이있으면 immed 는 0 ~ 31 범위에있어야하고, 그렇지않으면 immed 는 0 ~ 7 범위에있어야합니다. HandlerID 호출할처리기의인덱스번호입니다. P 가있으면 HandlerID 는 0 ~ 31 범위에있어야하고, 그렇지않으면 HandlerID 는 0 ~ 255 범위에있어야합니다. 아키텍처 이러한명령어는 ARM 상태에서사용할수없습니다. 이러한 16 비트 ThumbEE 명령어는 ThumbEE 상태와 Thumb-2EE 를지원하는 ARMv7 에서만사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-151

ARM 및 Thumb 명령어 4.13 의사명령어 ARM 어셈블러는어셈블리타임에 ARM, Thumb 또는 Thumb-2 명령어의적절한조합으로변환되는많은의사명령어를지원합니다. 의사명령어에대해서는다음단원에서설명합니다. 4-153 페이지의 ADRL 의사명령어 프로그램기준또는레지스터기준주소를레지스터로로드 ( 중간범위, 위치독립적 ) 4-155 페이지의 MOV32 의사명령어 32 비트상수값또는주소를사용하여레지스터로드 ( 무제한범위, 위치독립적이지않음 ). ARMv6T2 이상에대해서만사용할수있습니다. 4-157 페이지의 LDR 의사명령어 32 비트상수값또는주소를사용하여레지스터로드 ( 무제한범위, 위치독립적이지않음 ). 모든 ARM 아키텍처에대해사용할수있습니다. 4-160 페이지의 UND 의사명령어 아키텍처에서정의되지않은명령어생성. 모든 ARM 아키텍처에대해사용할수있습니다. 4-152 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.13.1 ADRL 의사명령어 프로그램기준또는레지스터기준주소를레지스터로로드합니다. 이의사명령어는 ADR 명령어와유사합니다. ADRL 은두개의데이터처리명령어를생성하므로 ADR 보다넓은범위의주소를로드할수있습니다. 참고 ADRL 은 ARMv6T2 이전의프로세서에대해 Thumb 명령어를어셈블할때사용할수없습니다. 구문 ADRL{cond} Rd,label 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 로드할레지스터입니다. label 프로그램기준또는레지스터기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. 사용법 ADRL 은항상두개의 32 비트명령어로어셈블됩니다. 즉, 단일명령어만으로주소에도달할수있는경우에도두번째중복명령어가생성됩니다. 어셈블러가두개의명령어로주소를생성할수없으면오류가생성되고어셈블리가실패합니다. 넓은범위의주소를로드하는방법에대한자세한내용은 4-157 페이지의 LDR 의사명령어를참조하십시오. 또한 2-30 페이지의레지스터에상수로드도참조하십시오. ADRL 은주소가프로그램기준또는레지스터기준주소이기때문에위치독립적인코드를생성합니다. label 이프로그램기준주소이면 ADRL 의사명령어와동일한어셈블러영역에있는주소로평가되어야합니다 (7-69 페이지의 AREA 참조 ). ADRL 을사용하여 BX 또는 BLX 명령어의타겟을생성하는경우타겟에 Thumb 명령어가포함되어있으면주소의 Thumb 비트 ( 비트 0) 를설정하는것은사용자의책임입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-153

ARM 및 Thumb 명령어 아키텍처및범위 사용가능한범위는다음과같이사용중인명령어세트에따라달라집니다. ARM 바이트또는하프워드로정렬된주소의경우, ±64KB 워드로정렬된주소의경우, ±256KB 32 비트 Thumb 바이트, 하프워드또는워드로정렬된주소의경우, ±1MB 16 비트 Thumb ADRL 을사용할수없음 범위는현재명령어의주소에서 4 바이트 (Thumb 코드 ) 또는 2 워드 (ARM 코드 ) 뒤에있는포인트를기준으로지정됩니다. ARM 과 32 비트 Thumb 에서는이포인트를기준으로 16 바이트이상정렬될경우더욱먼주소범위가지정될수있습니다. 4-154 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.13.2 MOV32 의사명령어 다음중하나를사용하여레지스터를로드합니다. 32비트상수값 임의의주소 MOV32 는항상두개의 32 비트명령어, MOV, MOVT 쌍을생성합니다. 따라서임의의 32 비트상수를로드하거나전체주소공간에액세스할수있습니다. MOV32 를사용하여주소를로드할경우결과코드는위치독립적이지않습니다. 구문 MOV32{cond} Rd, expr 인수설명 : cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). Rd 로드할레지스터입니다. Rd는 sp 또는 pc이면안됩니다. expr 다음중하나일수있습니다. symbol constant symbol + constant 현재프로그램영역이나다른프로그램영역에있는레이블 임의의 32 비트상수 레이블에 32 비트상수를더한값 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-155

ARM 및 Thumb 명령어 사용법 MOV32 의사명령어의주목적은다음과같습니다. 단일명령어로즉치값을생성할수없을때리터럴상수를생성합니다. 프로그램기준또는외부주소를레지스터로로드합니다. 링커에서 MOV32 가포함된 ELF 섹션을배치하는위치에관계없이주소는유효한상태로유지됩니다. 참고 이러한방식으로로드된주소는링크타임에고정되므로코드는위치독립적이지않습니다. MOV32 는참조되는레이블이 Thumb 코드에있는경우주소의 Thumb 비트 ( 비트 0) 를설정합니다. 아키텍처 이의사명령어는 ARMv6T2 와 ARMv7 의 ARM 및 Thumb 모두에서사용할수있습니다. 4-156 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 4.13.3 LDR 의사명령어 다음중하나를사용하여레지스터를로드합니다. 32비트상수값 주소 참고 이단원에서는 LDR 의사명령어에대해서만설명합니다. LDR 명령어에대한자세한내용은 4-12 페이지의메모리액세스명령어를참조하십시오. 또한 LDR 의사명령어를사용하여상수를로드하는방법에대한자세한내용은 2-35 페이지의 LDR Rd, =const 를통한직접로드를참조하십시오. 구문 LDR{cond}{.w} Rt,=[expr label-expr] 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 )..W 선택적명령어너비지정자입니다. Rt 로드할레지스터입니다. expr 숫자상수로평가됩니다. expr의값이범위내에있을경우어셈블러는 MOV 또는 MVN 명령어를생성합니다. expr의값이 MOV 또는 MVN 명령어의범위내에있지않은경우어셈블러는리터럴풀에상수를배치하고리터럴풀에서상수를읽는프로그램기준 LDR 명령어를생성합니다. label-expr 프로그램기준또는외부식입니다. 어셈블러는 label-expr 의값을리터럴풀에배치하고리터럴풀에서값을로드하는프로그램기준 LDR 명령어를생성합니다. label-expr 이외부식이거나현재섹션에포함되어있지않으면어셈블러에서는개체파일에링커재배치지시문을배치합니다. 링커에서는링크타임에주소를생성합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-157

ARM 및 Thumb 명령어 label-expr 이지역레이블 (3-29 페이지의지역레이블참조 ) 이면어셈블러는개체파일에링커재배치지시문을배치하고해당지역레이블을나타내는심볼을생성합니다. 주소는링크타임에생성됩니다. 지역레이블이 Thumb 코드를참조하는경우주소의 Thumb 비트 ( 비트 0) 가설정됩니다. 참고 RVCT2.2 에서는주소의 Thumb 비트가설정되지않습니다. 이동작에의존하는코드가있으면명령행옵션 --untyped_local_labels 를사용하여 Thumb 코드에서레이블을참조할때 Thumb 비트를설정하지않도록어셈블러에지시합니다. 사용법 LDR 의사명령어의주목적은다음과같습니다. 즉치값이 MOV 및 MVN 명령어의범위를벗어나레지스터로이동할수없을때리터럴상수를생성합니다. 프로그램기준또는외부주소를레지스터로로드합니다. 링커에 LDR 이포함된 ELF 섹션을배치하는위치에관계없이주소는유효한상태로유지됩니다. 참고이러한방식으로로드된주소는링크타임에고정되므로코드는위치독립적이지않습니다. pc 부터리터럴풀에있는값까지의오프셋은 ±4KB(ARM, 32 비트 Thumb-2) 보다작거나 0 ~ +1KB 범위 (Thumb, 16 비트 Thumb-2) 에있어야합니다. 범위에리터럴풀이있는지확인하는것은사용자의책임입니다. 자세한내용은 7-19 페이지의 LTORG 를참조하십시오. 참조되는레이블이 Thumb 코드에있는경우 LDR 의사명령어는 label-expr 의 Thumb 비트 ( 비트 0) 를설정합니다. LDR 을사용하는방법과 MOV 및 MVN 에대한자세한내용은 2-30 페이지의레지스터에상수로드를참조하십시오. 4-158 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

ARM 및 Thumb 명령어 Thumb 코드의 LDR.W 너비지정자를사용하여 ARMv6T2 이상프로세서의 Thumb 코드에서 32 비트명령어를생성하도록 LDR 에지시할수있습니다. 16 비트 MOV 에서상수를로드할수있거나 16 비트 pc 상대로드범위내에리터럴풀이있을경우 LDR.W 는항상 32 비트명령어를생성합니다. 상수의값이어셈블러의첫번째패스에서알려지지않는경우, 32 비트 MOV 또는 MVN 명령어에서생성될수있는상수에대해 16 비트 pc 상대로드가수행되더라도.W 가없는 LDR 은 Thumb 코드에서 16 비트명령어를생성합니다. 그러나상수가첫번째패스에서알려지고 32 비트 MOV 또는 MVN 명령어를사용하여생성될수있으면 MOV 또는 MVN 명령어가사용됩니다. LDR 의사명령어는 16 비트플래그설정 MOV 명령어를생성하지않습니다. --diag_warning 1727 어셈블러명령행옵션을사용하면 16 비트명령어가사용될수있었던시기를확인할수있습니다. 리터럴풀에서로드하지않고상수나주소를생성하는데대한자세한내용은 4-155 페이지의 MOV32 의사명령어를참조하십시오. 예제 LDR r3,=0xff0 ; loads 0xff0 into r3 ; => MOV.W r3,#0xff0 LDR r1,=0xfff ; loads 0xfff into r1 ; => LDR r1,[pc,offset_to_litpool] ;... ; litpool DCD 0xfff LDR r2,=place ; loads the address of ; place into r2 ; => LDR r2,[pc,offset_to_litpool] ;... ; litpool DCD place ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 4-159

ARM 및 Thumb 명령어 4.13.4 UND 의사명령어 아키텍처에서정의되지않은명령어생성. 정의되지않은명령어를실행하려고시도하면정의되지않은명령어예외가발생합니다. 아키텍처에서정의되지않은명령어는정의되지않은상태로남아있습니다. 구문 UND{cond}{.w} {#expr} 인수설명 : cond 선택적조건코드입니다 (2-21 페이지의조건부실행참조 ). cond 는 ARM 코드나 16 비트 Thumb 코드에서이의사명령어에대해허용되지않습니다..W 선택적명령어너비지정자입니다. expr 다음범위의숫자상수로평가됩니다. ARM 코드의경우, 0 ~ 65535 32비트 Thumb 코드의경우, 0 ~ 4095 16비트 Thumb 코드의경우, 0 ~ 255 expr이생략되면값 0이사용됩니다. Thumb 코드의 UND.W 너비지정자를사용하여 ARMv6T2 이상프로세서의 Thumb 코드에서 32 비트명령어를생성하도록 UND 에지시할수있습니다. UND.W 는 expr 이 0 ~ 255 범위에있는경우에도항상 32 비트명령어를생성합니다. 디스어셈블리 이의사명령어가생성하는인코딩은 DCI 로디스어셈블됩니다. 4-160 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

5 장 NEON 및 VFP 프로그래밍 이장에서는어셈블리언어로 NEON 및 VFP 보조프로세서를프로그래밍하는데대한참조정보를제공합니다. 여기에는다음단원이포함되어있습니다. 5-7페이지의확장레지스터뱅크 5-9 페이지의조건코드 5-11 페이지의일반정보 5-18 페이지의 NEON 및 VFP 공유명령어 5-25 페이지의 NEON 논리및비교연산 5-33 페이지의 NEON 일반데이터처리명령어 5-44 페이지의 NEON 시프트명령어 5-50 페이지의 NEON 일반산술명령어 5-63 페이지의 NEON 곱하기명령어 5-68 페이지의 NEON 요소및구조체로드 / 저장명령어 5-76 페이지의 NEON 및 VFP 의사명령어 5-82 페이지의 NEON 및 VFP 시스템레지스터 5-87 페이지의 0 으로플러시모드 5-89 페이지의 VFP 명령어 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-1

NEON 및 VFP 프로그래밍 5-98 페이지의 VFP 벡터모드 표 5-1, 5-5 페이지의표 5-2 및 5-6 페이지의표 5-3 에는개별명령어에대한설명이있는위치가나와있습니다. 표 5-1 NEON 명령어위치 니모닉 간단한설명 페이지 VABA, VABD 절대차이, 절대차이및누산 5-51페이지 VABS 절대값 5-52페이지 VACGE, VACGT 절대비교크거나같음, 보다큼 5-30페이지 VACLE, VACLT 절대비교작거나같음, 보다작음 ( 의사명령어 ) 5-80페이지 VADD 더하기 5-53페이지 VADDHN 더하기, 상위반선택 5-54페이지 VAND 비트단위 AND 5-26페이지 VAND 비트단위 AND( 의사명령어 ) 5-79페이지 VBIC 비트단위비트지우기 ( 레지스터 ) 5-26페이지 VBIC 비트단위비트지우기 ( 즉치값 ) 5-27페이지 VBIF, VBIT, VBSL False인경우비트단위삽입, True인경우삽입및선택 5-28페이지 VCEQ, VCLE, VCLT 비교같음, 작거나같음, 비교보다작음 5-31페이지 VCLE, VCLT 비교작거나같음, 비교보다작음 ( 의사명령어 ) 5-81페이지 VCLS, VCLZ, VCNT 선행부호비트계산, 선행 0 수계산및세트비트계산 5-59페이지 VCVT 고정소수점또는정수를부동소수점으로변환, 부동소수점을정수또는고정소수점으로변환 5-34 페이지 VDUP 스칼라를벡터의모든레인으로복제 5-35페이지 VEXT 추출 5-36페이지 VCGE, VCGT 절대크거나같음, 보다큼 5-31페이지 VEOR 비트단위배타적 OR 5-26페이지 VHADD, VHSUB 양분더하기, 양분빼기 5-55페이지 5-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-1 NEON 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 VMAX, VMIN 최대값, 최소값 5-58페이지 VLD 벡터로드 5-68페이지 VMLA, VMLS 곱하기누산, 곱하기빼기 ( 벡터 ) 5-64페이지 VMLA, VMLS 곱하기누산, 곱하기빼기 ( 스칼라기준 ) 5-64페이지 VMOV 이동 ( 즉치값 ) 5-37페이지 VMOV 이동 ( 레지스터 ) 5-29페이지 VMOVL, VMOV{U}N Long 이동, Narrow 이동 ( 레지스터 ) 5-38페이지 VMUL 곱하기 ( 벡터 ) 5-64페이지 VMUL 곱하기 ( 스칼라기준 ) 5-65페이지 VMVN 음수이동 ( 즉치값 ) 5-37페이지 VNEG 부정 5-52페이지 VORN 비트단위 OR NOT 5-26페이지 VORN 비트단위 OR NOT( 의사명령어 ) 5-79페이지 VORR 비트단위 OR( 레지스터 ) 5-26페이지 VORR 비트단위 OR( 즉치값 ) 5-27페이지 VPADD, VPADAL 인접쌍더하기, 인접쌍더하기및누산 5-56페이지 VPMAX, VPMIN 인접쌍최대값, 인접쌍최소값 5-58페이지 VQABS 절대값, 포화 5-52페이지 VQADD 더하기, 포화 5-53페이지 VQDMLAL, VQDMLSL 포화배수화곱하기누산및곱하기빼기 5-66페이지 VQMOV{U}N 포화이동 ( 레지스터 ) 5-38페이지 VQDMUL 포화배수화곱하기 5-66페이지 VQDMULH 포화배수화곱하기상위반반환 5-67페이지 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-3

NEON 및 VFP 프로그래밍 표 5-1 NEON 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 VQNEG 부정, 포화 5-52페이지 VQRDMULH 포화배수화곱하기상위반반환 5-67페이지 VQRSHL 왼쪽으로시프트, 반올림, 포화 ( 부호있는변수기준 ) 5-46페이지 VQRSHR 오른쪽으로시프트, 반올림, 포화 ( 즉치값기준 ) 5-48페이지 VQSHL 왼쪽으로시프트, 포화 ( 즉치값기준 ) 5-45페이지 VQSHL 왼쪽으로시프트, 포화 ( 부호있는변수기준 ) 5-46페이지 VQSHR 오른쪽으로시프트, 포화 ( 즉치값기준 ) 5-48페이지 VQSUB 빼기, 포화 5-53페이지 VRADDH 더하기, 상위반선택, 반올림 5-54페이지 VRECPE, VRECPS 역수추정, 역수단계 5-60페이지 VREV 요소반전 5-39페이지 VRHADD 양분더하기, 반올림 5-55페이지 VRSHR, VRSRA 오른쪽으로시프트와반올림, 오른쪽으로시프트, 반올림및누산 ( 즉치값기준 ) 5-47페이지 VRSUBH 빼기, 상위반선택, 반올림 5-54페이지 VRSQRTE, VRSQRTS 역수제곱근추정및역수제곱근단계 5-61페이지 VSHL 왼쪽으로시프트 ( 즉치값기준 ) 5-45페이지 VSHR 오른쪽으로시프트 ( 즉치값기준 ) 5-47페이지 VSLI 왼쪽으로시프트및삽입 5-49페이지 VSRA 오른쪽으로시프트, 누산 ( 즉치값기준 ) 5-47페이지 VSRI 오른쪽으로시프트및삽입 5-49페이지 VST 벡터저장 5-68페이지 VSUB 빼기 5-53페이지 VSUBH 빼기, 상위반선택 5-54페이지 5-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-1 NEON 명령어위치 ( 계속 ) 니모닉 간단한설명 페이지 VSWP 벡터스왑 5-40페이지 VTBL, VTBX 벡터테이블조회 5-41페이지 VTST 비트테스트 5-32페이지 VTRN 벡터이항 5-42페이지 VUZP, VZIP 벡터인터리브및디인터리브 5-43페이지 표 5-2 공유 NEON 및 VFP 명령어위치 눼玖蹄 간단한설명페이지 피연산자 아키텍처 VLDM 다중로드 5-20페이지 - 모두 VLDR 로드 (5-77페이지의 VLDR 의사명령어참조 ) 5-19페이지 스칼라 모두 VMOV 하나의 ARM 레지스터에서배정밀도의반으로전송 5-22페이지 스칼라 모두 두개의 ARM 레지스터에서배정밀도로전송 5-21페이지 스칼라 VFPv2 배정밀도의반에서 ARM 레지스터로전송 5-22페이지 스칼라 모두 배정밀도에서두개의 ARM 레지스터로전송 5-21페이지 스칼라 VFPv2 단정밀도에서 ARM 레지스터로전송 5-23페이지 스칼라 모두 ARM 레지스터에서단정밀도로전송 5-23페이지 스칼라 모두 VMRS VMSR NEON 및 VFP 시스템레지스터에서 ARM 레지스터로전송 ARM 레지스터에서 NEON 및 VFP 시스템레지스터로전송 5-24 페이지 - 모두 5-24 페이지 - 모두 VSTM 다중저장 5-20 페이지 - 모두 VSTR 저장 5-19 페이지스칼라모두 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-5

NEON 및 VFP 프로그래밍 표 5-3 VFP 명령어위치 니모닉간단한설명페이지 피연산자 아키텍처 VABS 절대값 5-90페이지 벡터 모두 VADD 더하기 5-91페이지 벡터 모두 VCMP 비교 5-93페이지 스칼라 모두 VCVT 단정밀도와배정밀도간변환 5-94페이지 스칼라 모두 부동소수점과정수간변환 5-95페이지 스칼라 모두 부동소수점과고정소수점간변환 5-96페이지 스칼라 VFPv3 VDIV 나누기 5-91페이지 벡터 모두 VMLA 곱하기누산 5-92페이지 벡터 모두 VMLS 곱하기빼기 5-92페이지 벡터 모두 VMOV 부동소수점상수를단정밀도또는배정밀도레지스터에삽입 (5-5 페이지의표 5-2 참조 ) 5-97 페이지스칼라 VFPv3 VMUL 곱하기 5-92페이지 벡터 모두 VNEG 부정 5-90페이지 벡터 모두 VNMLA 부정곱하기누산 5-92페이지 벡터 모두 VNMLS 부정곱하기빼기 5-92페이지 벡터 모두 VNMUL 부정곱하기 5-92페이지 벡터 모두 VSQRT 제곱근 5-90페이지 벡터 모두 VSUB 빼기 5-91페이지 벡터 모두 5-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.1 확장레지스터뱅크 NEON 및 VFPv3 에서는동일한확장레지스터뱅크를사용합니다. 이레지스터뱅크는 ARM 레지스터뱅크와다르며 VFPv2 레지스터뱅크의상위세트입니다. 확장레지스터뱅크는다음단원에설명된대로명시적으로별칭이지정된세개의뷰를사용하여참조할수있습니다. 5-8 페이지의그림 5-1 에서는세개의확장레지스터뱅크뷰를보여주고, 워드, 더블워드및쿼드워드레지스터가겹치는방식을보여줍니다. 5.1.1 레지스터뱅크의 NEON 뷰 NEON 은확장레지스터뱅크를다음과같이표시합니다. 16 개의 128 비트쿼드워드레지스터, Q0-Q15 32 개의 64 비트더블워드레지스터, D0-D31. 이뷰는 VFPv3 에서도사용할수있습니다. 위의두뷰에있는레지스터의조합 NEON 은각레지스터가크기와유형이모두같은 1, 2, 4, 8 또는 16 요소의벡터를포함하고있는것으로표시합니다. 개별요소는스칼라로액세스할수도있습니다. 5.1.2 확장레지스터뱅크의 VFPv3 뷰 VFPv3 에서는확장레지스터뱅크를다음과같이표시할수있습니다. 32 개의 64 비트더블워드레지스터, D0-D31. 이뷰는 NEON 에서도사용할수있습니다. 32 개의 32 비트단일워드레지스터, S0-S31. 이뷰에서는레지스터뱅크의반에만액세스할수있습니다. 위의두뷰에있는레지스터의조합 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-7

NEON 및 VFP 프로그래밍 S0 S1 S2 S3 S4 S5 S6 S7 D0 D1 D2 D3 Q0 Q1......... S28 S29 S30 S31 D14 D15 Q7 D16 D17 Q8...... D30 D31 Q15 그림 5-1 확장레지스터뱅크 레지스터간매핑은다음과같습니다. S<2n> 이 D<n> 의최하위반에매핑됩니다. S<2n+1> 이 D<n> 의최상위반에매핑됩니다. D<2n> 이 Q<n> 의최하위반에매핑됩니다. D<2n+1> 이 Q<n> 의최상위반에매핑됩니다. 예를들어 D12 를참조하여 Q6 에서벡터요소의최하위반에액세스하고 D13 을참조하여벡터요소의최상위반에액세스할수있습니다. 5-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.2 조건코드 ARM 상태에서는조건코드를사용하여 VFP 명령어실행을제어할수있습니다. 이명령어는 APSR 의상태플래그에따라대부분의다른 ARM 명령어와마찬가지로조건부로실행됩니다. ARM 상태에서는 VFP 와 NEON 에공통적인명령어를제외하고조건코드를사용하여 NEON 명령어실행을제어할수없습니다. Thumb-2 프로세서의 Thumb 상태에서는 IT 명령어를사용하여다음에나오는최대네개의 NEON 또는 VFP 명령어에조건코드를설정할수있습니다. 자세한내용은 4-71 페이지의 IT 를참조하십시오. 상태플래그업데이트에사용할수있는유일한 VFP 명령어는 FCMP 입니다. 이명령어는 APSR 에서플래그를직접업데이트하지않지만 FPSCR 에서별도의플래그세트를업데이트합니다 (5-82 페이지의 FPSCR, 부동소수점상태및제어레지스터참조 ). 참고이러한플래그를사용하여조건부 VFP 명령어와같은조건부명령어를제어하려면먼저 VMSR 명령어를사용하여플래그를 APSR 에복사해야합니다 (5-24 페이지의 VMRS 및 VMSR 참조 ). 플래그의정확한의미는해당플래그가 FCMP 명령어뒤에나오는지, ARM 데이터처리명령어뒤에나오는지에따라달라집니다. 이것은다음과같은이유때문입니다. 부동소수점값에항상부호가지정되기때문에부호없는조건이필요하지않습니다. Not-a-Number(NaN) 값은숫자또는다른 NaN 값과순서상의관계가없기때문에순서가지정되지않은결과를나타내기위해추가조건이필요합니다. 5-10 페이지의표 5-4 에는조건코드니모닉의의미가나와있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-9

NEON 및 VFP 프로그래밍 표 5-4 조건코드 니모닉 ARM 데이터처리명령어다음에나올경우의의미 VFP FCMP 명령어다음에나올경우의의미 EQ 같음같음 NE 같지않음같지않음또는순서가지정되지않음 CS / HS carry 설정 / 부호없는높거나같음크거나같음또는순서가지정되지않음 CC / LO carry 지우기 / 부호없는낮음보다작음 MI 음수보다작음 PL 양수또는 0 크거나같음또는순서가지정되지않음 VS 오버플로 순서가지정되지않음 ( 하나이상의 NaN 피연산자 ) VC 오버플로없음순서가지정됨 HI 부호없는높음보다큼또는순서가지정되지않음 LS 부호없는낮거나같음작거나같음 GE 부호있으면서크거나같음크거나같음 LT 부호있으면서보다작음보다작음또는순서가지정되지않음 GT 부호있으면서보다큼보다큼 LE 부호있으면서작거나같음작거나같음또는순서가지정되지않음 AL 항상 ( 대개생략됨 ) 항상 ( 대개생략됨 ) 참고조건코드의의미는 APSR 에서플래그를마지막으로업데이트한명령어의유형에따라달라집니다. 5-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.3 일반정보 이단원에서는중복을피하기위해여러명령어에공통된정보를함께모아제공합니다. 이단원에는다음소단원이포함되어있습니다. 부동소수점예외 아키텍처버전 5-12페이지의 NEON 및 VFP 데이터유형 5-13 페이지의 NEON 의 Normal, Long, Wide, Narrow 및포화명령어 5-15 페이지의 NEON 스칼라 5-15 페이지의확장표시 5-16 페이지의 {0,1} 을통한다항식산술 5-16 페이지의 VFP 보조프로세서 5-17 페이지의 VFP 레지스터 5.3.1 부동소수점예외 부동소수점예외를발생시킬수있는명령어의설명부분에는예외가나열된소단원이있지만부동소수점예외를발생시킬수없는명령어의설명부분에는예외소단원이없습니다. 5.3.2 아키텍처버전 모든 NEON 명령어는 NEON 을지원하는모든시스템에서사용할수있습니다. NEON 과 VFP 간에공유되는명령어를제외하고 NEON 명령어는 NEON 을지원하는시스템에서만사용할수있습니다. 각 VFP 및공유명령어의설명부분에는명령어를지원하는아키텍처가나열된소단원이있습니다. ARMv7-M 에서는 NEON 또는 VFP 를지원하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-11

NEON 및 VFP 프로그래밍 5.3.3 NEON 및 VFP 데이터유형 NEON 및 VFP 명령어의데이터유형지정자는데이터유형을나타내는문자로구성되며, 대개너비를나타내는숫자가뒤에옵니다. 이러한유형지정자와명령어니모닉은마침표로구분됩니다. 표 5-5 에서는 NEON 명령어에사용할수있는데이터유형을보여주고, 표 5-6 에서는 VFP 명령어에사용할수있는데이터유형을보여줍니다. 표 5-5 NEON 데이터유형 8 비트 16 비트 32 비트 64 비트 부호없는정수 U8 U16 U32 U64 부호있는정수 S8 S16 S32 S64 유형이지정되지않은정수 I8 I16 I32 I64 부동소수점숫자 사용할수없음 사용할수없음 F( 또는 F32) 사용할수없음 {0,1} 을통한다항식 P8 P16 사용할수 없음 사용할수없음 표 5-6 VFP 데이터유형 16 비트 32 비트 64 비트 부호없는정수 U16 U32 사용할수 없음 부호있는정수 S16 S32 사용할수 없음 부동소수점숫자 사용할수없음 F( 또는 F32) D( 또는 F64) {0,1} 을통한다항식연산에대한자세한내용은 5-16 페이지의 {0,1} 을통한다항식산술을참조하십시오. 두번째 ( 또는유일한 ) 피연산자의데이터유형은명령어에서지정됩니다. 5-12 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 참고 대부분의명령어는사용할수있는데이터유형이제한되어있습니다. 자세한내용은명령어페이지를참조하십시오. 5.3.4 NEON 의 Normal, Long, Wide, Narrow 및포화명령어 대부분의 NEON 데이터처리명령어는 Normal, Long, Wide, Narrow 및포화변형에서사용할수있습니다. NEON 명령어는다음에대해작동할수있습니다. 다음과같이구성된더블워드벡터 여덟개의 8비트요소 네개의 16비트요소 두개의 64비트요소 하나의 64비트요소 다음과같이구성된쿼드워드벡터 16개의 8비트요소 여덟개의 16비트요소 네개의 32비트요소 두개의 64비트요소 Normal 명령어 Normal 명령어는이러한벡터유형에대해작동하며크기와유형이피연산자벡터와동일한결과벡터를생성할수있습니다. 명령어니모닉끝에 Q 를추가하여 Normal 명령어의피연산자와결과가모두쿼드워드가되도록지정할수있습니다. 이렇게하면피연산자나결과가쿼드워드가아닐경우어셈블러에서오류가발생합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-13

NEON 및 VFP 프로그래밍 Long 명령어 Long 명령어는더블워드벡터피연산자에대해작동하며쿼드워드벡터결과를생성합니다. 일반적으로결과요소는피연산자요소너비의두배이고유형이모두동일합니다. Long 명령어는명령어니모닉끝에추가된 L 을사용하여지정합니다. Wide 명령어 Wide 명령어는하나씩의더블워드벡터피연산자와쿼드워드벡터피연산자에대해작동하며쿼드워드벡터결과를생성합니다. 결과및첫번째피연산자요소는두번째피연산자요소너비의두배입니다. Wide 명령어는명령어니모닉끝에추가된 W 를사용하여지정합니다. Narrow 명령어 Narrow 명령어는쿼드워드벡터피연산자에대해작동하며더블워드벡터결과를생성합니다. 일반적으로결과요소는피연산자요소너비의반입니다. Narrow 명령어는명령어니모닉끝에추가된 N 을사용하여지정합니다. 포화명령어 포화명령어가수행하는작업에대한일반적인설명을보려면 4-96 페이지의포화명령어를참조하십시오. NEON 포화명령어가포화되는범위를보려면표 5-7 을참조하십시오. 포화명령어는 V 와명령어니모닉사이에 Q 접두사를사용하여지정합니다. 표 5-7 NEON 포화범위 데이터유형 x 의포화범위 S8-2 7 <= x < 2 7 S16-2 15 <= x < 2 15 S32-2 31 <= x < 2 31 S64-2 63 <= x < 2 63 U8 0 <= x < 2 8 5-14 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-7 NEON 포화범위 ( 계속 ) 데이터유형 x 의포화범위 U16 0 <= x < 2 16 U32 0 <= x < 2 32 U64 0 <= x < 2 64 5.3.5 NEON 스칼라 일부 NEON 명령어는벡터와함께스칼라에대해작동합니다. NEON 스칼라는 8 비트, 16 비트, 32 비트또는 64 비트일수있습니다. 곱하기명령어를제외하고스칼라에액세스하는명령어는레지스터뱅크의요소에액세스할수있습니다. 명령어구문이더블워드벡터에대한색인을사용하여스칼라를참조하므로 Dm[x] 는 Dm 의 x 번째요소입니다. 곱하기명령어는 16 비트또는 32 비트스칼라만허용하고레지스터뱅크에서처음 32 개의스칼라에만액세스할수있습니다. 즉, 다음제한이적용됩니다. 16 비트스칼라는 0 ~ 3 범위의 x 가있는 D0 ~ D7 레지스터로제한됩니다. 32 비트스칼라는 0 또는 1 의 x 가있는 D0 ~ D15 레지스터로제한됩니다. 5.3.6 확장표시 어셈블러는확장표시라고하는아키텍처기반 NEON 및 VFP 어셈블리구문에대한확장을구현합니다. 이확장을사용하면레지스터이름에데이터유형정보나스칼라인덱스를포함할수있습니다. 이경우모든명령어에데이터유형이나스칼라인덱스정보를포함하지않아도됩니다. 레지스터이름은다음중하나일수있습니다. Untyped 레지스터이름이레지스터만지정하고레지스터에포함된데이터유형이나레지스터내의특정스칼라에대한인덱스는지정하지않습니다. Untyped with scalar index 레지스터이름이레지스터와레지스터내의특정스칼라에대한인덱스만지정하고레지스터에포함된데이터유형은지정하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-15

NEON 및 VFP 프로그래밍 Typed 레지스터이름이레지스터와레지스터에포함된데이터유형만지정하고레지스터내의특정스칼라에대한인덱스는지정하지않습니다. Typed with scalar index 레지스터이름이레지스터, 레지스터에포함된데이터유형및레지스터내의특정스칼라에대한인덱스를지정합니다. SN, DN 및 QN 지시문을사용하여유형화된레지스터와스칼라레지스터를만들수있습니다. 자세한내용은 7-15 페이지의 QN, DN 및 SN 을참조하십시오. 5.3.7 {0,1} 을통한다항식산술 계수 0 및 1 은다음과같은부울산술규칙을사용하여조작합니다. 0 + 0 = 1 + 1 = 0 0 + 1 = 1 + 0 = 1 0 * 0 = 0 * 1 = 1 * 0 = 0 1 * 1 = 1. 즉, {0,1} 을통해두개의다항식을더하는연산은비트단위배타적 OR 과같고, {0,1} 을통해두개의다항식을곱하는연산은정수곱하기와같습니다. 단, 부분곱은더하기가아닌배타적 OR 과같습니다. 5.3.8 VFP 보조프로세서 VFP 보조프로세서는연관된지원코드와함께 ANSI/IEEE Std. 754-1985 IEEE Standard for Binary Floating-Point Arithmetic 에정의된단정밀도및배정밀도부동소수점산술을제공합니다. 이장에서는이문서를 IEEE 754 표준이라고합니다. 자세한내용은 RealView Compilation Tools Libraries and Floating Point Support Guide 에서 4 장부동소수점지원을참조하십시오. 최대여덟개의단정밀도또는네개의배정밀도숫자의짧은벡터를사용할수도있지만이옵션은향후제공되지않을예정입니다. 자세한내용은 5-98 페이지의 VFP 벡터모드를참조하십시오. 5-16 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.3.9 VFP 레지스터 VFP 보조프로세서에는 s0 에서 s31 까지 32 개의단정밀도레지스터가있습니다. 각레지스터에는단정밀도유동소수점값이나 32 비트정수가포함될수있습니다. 이러한 32 개의레지스터는 d0 에서 d15 까지 16 개의배정밀도레지스터로간주되기도합니다. dn 은 s(2n) 및 s(2n+1) 과동일한하드웨어를차지합니다. VFPv3 은 d16 에서 d31 까지 16 개의배정밀도레지스터를더추가하여 VFP 레지스터세트를확장합니다. 이러한레지스터는단정밀도 VFP 레지스터와겹치지않습니다. 참고프로세서에 NEON 과 VFP 가둘다있으면모든 NEON 레지스터가 VFP 레지스터와겹칩니다 (5-7 페이지의확장레지스터뱅크참조 ). 다음과같이사용할수있습니다. 동시에단정밀도값, 배정밀도값및 NEON 벡터에각기다른레지스터를사용합니다. 서로다른시간에단정밀도값, 배정밀도값및 NEON 벡터에동일한레지스터를사용합니다. 상응하는단정밀도와배정밀도레지스터를동시에사용하면안됩니다. 이경우손상이발생하지는않지만결과가무의미해집니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-17

NEON 및 VFP 프로그래밍 5.4 NEON 및 VFP 공유명령어 이단원에는다음소단원이포함되어있습니다. 5-19페이지의 VLDR 및 VSTR 확장레지스터로드및저장 5-20페이지의 VLDM, VSTM, VPOP 및 VPUSH 확장레지스터다중로드및저장 5-21페이지의 VMOV( 두개의 ARM 레지스터와확장레지스터간전송 ) 두개의 ARM 레지스터와 64비트확장레지스터간에내용을전송합니다. 5-22페이지의 VMOV(ARM 레지스터와 NEON 스칼라간전송 ) ARM 레지스터와 4비트확장레지스터간에내용을전송합니다. 5-23페이지의 VMOV( 한 ARM 레지스터와단정밀도 VFP 간전송 ) 32비트확장레지스터와 ARM 레지스터간에내용을전송합니다. 5-24페이지의 VMRS 및 VMSR ARM 레지스터와 NEON 및 VFP 시스템레지스터간에내용을전송합니다. 5-18 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.4.1 VLDR 및 VSTR 확장레지스터를로드및저장합니다. 구문 VLDR{cond}{.size} Fd, [Rn{, #offset}] VSTR{cond}{.size} Fd, [Rn{, #offset}] VLDR{cond}{.size} Fd, label VSTR{cond}{.size} Fd, label 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size Fd 선택적데이터크기지정자입니다. Fd 가단정밀도 VFP 레지스터이면 32 여야하고, 그렇지않으면 64 여야합니다. 로드또는저장할확장레지스터로, NEON 명령어의경우 Dd 여야합니다. VFP 명령어의경우 Dd 또는 Sd 중하나일수있습니다. Rn 전송할기본주소가들어있는 ARM 레지스터입니다. offset label 선택적숫자식으로, 어셈블리타임에숫자상수로평가되어야합니다. 이값은 -1020 ~ +1020 범위에있어야하며 4 의배수여야합니다. 기본주소에이값을더하면전송에사용되는주소가됩니다. 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. label 은현재명령어의 ±1KB 내에있어야합니다. 사용법 VLDR 명령어는메모리에서확장레지스터를로드하고, VSTR 명령어는확장레지스터의내용을메모리에저장합니다. Fd 가단정밀도레지스터이면하나의워드가전송되고 (VFP 에만해당 ), 그렇지않으면두개의워드가전송됩니다. 이외에도 VLDR 의사명령어가있습니다 (5-77 페이지의 VLDR 의사명령어참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-19

NEON 및 VFP 프로그래밍 5.4.2 VLDM, VSTM, VPOP 및 VPUSH 확장레지스터다중로드, 다중저장, 스택에서팝및스택에푸시 구문 VLDMmode{cond} Rn,{!} Registers VSTMmode{cond} Rn,{!} Registers VPOP{cond} Registers VPUSH{cond} Registers 인수설명 : mode 다음중하나여야합니다. IA 각전송후에주소를증가시킵니다. IA 는기본값이며생략할수있습니다. DB 각전송전에주소를감소시킵니다. EA FD 빈오름차순스택연산으로, 로드할때는 DB 와같고저장할때는 IA 와같습니다. 전체내림차순스택연산으로, 로드할때는 LA 와같고저장할때는 DB 와같습니다. cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). Rn 전송할기본주소가들어있는 ARM 레지스터입니다.! 선택사항입니다.! 기호는업데이트된기본주소를 Rn 에다시기록해야함을나타냅니다.! 기호를지정하지않으면 mode 는 IA 여야합니다. 레지스터 중괄호 ({ 및 }) 로묶인연속된확장레지스터의목록입니다. 이목록은쉼표로구분된형식이거나범위형식일수있습니다. 이목록에는최소한하나이상의레지스터가있어야합니다. 참고 S, D 또는 Q 레지스터를지정할수있지만이들을함께지정하면안됩니다. 레지스터수는 D 레지스터의경우 16 개로제한되고 Q 레지스터의경우여덟개로제한됩니다. Q 레지스터를지정하는경우이레지스터는디스어셈블리에 D 레지스터로표시됩니다. VPOP Registers 는 VLDM sp!,registers 와같습니다. VPUSH Registers 는 VSTMDB sp!,registers 와같습니다. 5-20 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 이러한두명령어형식중아무형식이나사용할수있습니다. 이러한형식은 VPOP 및 VPUSH 로디스어셈블됩니다. 5.4.3 VMOV( 두개의 ARM 레지스터와확장레지스터간전송 ) 두개의 ARM 레지스터와 64 비트확장레지스터간또는연속하는두개의 32 비트 VFP 레지스터간에내용을전송합니다. 구문 VMOV{cond} Dm, Rd, Rn VMOV{cond} Rd, Rn, Dm VMOV{cond} {Sm, Sm1}, Rd, Rn VMOV{cond} Rd, Rn, {Sm, Sm1} 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Dm 64비트확장레지스터입니다. Sm VFP 32비트레지스터입니다. Sm1 Sm 뒤에나오는다음 VFP 32비트레지스터입니다. Rd, Rn ARM 레지스터입니다. r15를사용하면안됩니다. 사용법 VMOV Dm, Rd, Rn 은 Rd 의내용을 Dm 의하위반으로전송하고 Rn 의내용을 Dm 의상위반으로전송합니다. VMOV Rd, Rn, Dm 은 Dm 의하위반내용을 Rd 로전송하고 Dm 의상위반내용을 Rn 으로전송합니다. VMOV Rd, Rn, {Sm, Sm1} 은 Sm 의내용을 Rd 로전송하고 Sm1 의내용을 Rn 으로전송합니다. VMOV {Sm, Sm1}, Rd, Rn 은 Rd 의내용을 Sm 으로전송하고 Rn 의내용을 Sm1 로전송합니다. 아키텍처 64 비트명령어는 NEON 및 VFPv2 이상에서사용할수있습니다. 2 x 32 비트명령어는 VFPv2 이상에서사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-21

NEON 및 VFP 프로그래밍 5.4.4 VMOV(ARM 레지스터와 NEON 스칼라간전송 ) ARM 레지스터와 NEON 스칼라간에내용을전송합니다. 구문 VMOV{cond}{.size} Dn[x], Rd VMOV{cond}{.datatype} Rd, Dn[x] 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size datatype 데이터크기입니다. 8, 16 또는 32 일수있습니다. 생략할경우 size 는 32 입니다. 데이터유형입니다. U8, S8, U16, S16 또는 32 일수있습니다. 생략할경우 datatype 은 32 입니다. Dn[x] NEON 스칼라입니다 (5-15 페이지의 NEON 스칼라참조 ). Rd ARM 레지스터입니다. Rd 는 r15 이면안됩니다. 사용법 VMOV Rd, Dn[x] 는 Dn[x] 의내용을 Rd 의최하위바이트, 하프워드또는워드로전송합니다. VMOV Dn[x], Rd 는 Rd 의최하위바이트, 하프워드또는워드내용을 Sn 으로전송합니다. 5-22 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.4.5 VMOV( 한 ARM 레지스터와단정밀도 VFP 간전송 ) 단정밀도부동소수점레지스터와 ARM 레지스터간에내용을전송합니다. 구문 VMOV{cond} Rd, Sn VMOV{cond} Sn, Rd 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sn VFP 단정밀도레지스터입니다. Rd ARM 레지스터입니다. Rd는 r15이면안됩니다. 사용법 VMOV Rd, Sn 은 Sn 의내용을 Rd 로전송합니다. VMOV Sn, Rd 는 Rd 의내용을 Sn 으로전송합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-23

NEON 및 VFP 프로그래밍 5.4.6 VMRS 및 VMSR ARM 레지스터와 NEON 및 VFP 시스템레지스터간에내용을전송합니다. 구문 VMRS{cond} Rd, extsysreg VMSR{cond} extsysreg, Rd 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). extsysreg NEON 및 VFP 시스템레지스터로, 대개 FPSCR, FPSID 또는 FPEXC 입니다 (5-82 페이지의 NEON 및 VFP 시스템레지스터참조 ). Rd ARM 레지스터입니다. Rd 는 r15 이면안됩니다. extsysreg 가 FPSCR 이면 APSR_nzcv 일수있습니다. 이경우부동소수점상태플래그가 ARM CPSR 의해당플래그로전송됩니다. 사용법 VMRS 명령어는 extsysreg 의내용을 Rd 로전송합니다. VMSR 명령어는 Rd 의내용을 extsysreg 로전송합니다. 참고이러한명령어는현재 NEON 또는 VFP 연산이모두완료될때까지 ARM 을중단합니다. 예제 VMRS r2,fpcid VMRS APSR_nzcv, FPSCR ; transfer FP status register to ARM APSR VMSR FPSCR, r4 5-24 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.5 NEON 논리및비교연산 이단원에는다음소단원이포함되어있습니다. 5-26페이지의 VAND, VBIC, VEOR, VORN 및 VORR( 레지스터 ) 비트단위 AND, 비트지우기, 배타적 OR, OR Not 및 OR( 레지스터 ) 5-27페이지의 VBIC 및 VORR( 즉치값 ) 비트단위비트지우기및 OR( 즉치값 ) 5-28페이지의 VBIF, VBIT 및 VBSL False인경우비트단위삽입, True인경우삽입및선택 5-29페이지의 VMOV, VMVN( 레지스터 ) 이동및이동하지않음 5-30페이지의 VACGE 및 VACGT 비교절대값 5-31페이지의 VCEQ, VCGE, VCGT, VCLE 및 VCLT 비교 5-32페이지의 VTST 비트테스트 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-25

NEON 및 VFP 프로그래밍 5.5.1 VAND, VBIC, VEOR, VORN 및 VORR( 레지스터 ) VAND( 비트단위 AND), VBIC( 비트지우기 ), VEOR( 비트단위배타적 OR), VORN( 비트단위 OR NOT) 및 VORR( 비트단위 OR) 명령어는두레지스터간에비트단위논리연산을수행하고결과를대상레지스터에배치합니다. 구문 Vop{cond}.{datatype} {Qd}, Qn, Qm Vop{cond}.{datatype} {Dd}, Dn, Dm 인수설명 : op 다음중하나여야합니다. AND 논리 AND ORR 논리 OR EOR 논리배타적 OR BIC 논리 AND 보수 ORN 논리 OR 보수 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 선택적데이터유형입니다. 어셈블러에서는 datatype을무시합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 참고두피연산자모두에같은레지스터를사용하는 VORR은 VMOV 명령어입니다. 이와같이 VORR을사용할수있지만결과코드를디스어셈블하면 VMOV 구문이생성됩니다. 자세한내용은 5-29페이지의 VMOV, VMVN( 레지스터 ) 을참조하십시오. 5-26 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.5.2 VBIC 및 VORR( 즉치값 ) VBIC( 비트지우기즉치값 ) 는대상벡터의각요소를가져와서즉치상수로비트단위 AND 보수를수행하고결과를대상벡터에반환합니다. VORR( 비트단위 OR 즉치값 ) 은대상벡터의각요소를가져와서즉치상수로비트단위 OR 을수행하고결과를대상벡터에반환합니다. 의사명령어 5-79 페이지의 VAND 및 VORN( 즉치값 ) 도참조하십시오. 구문 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 인수설명 : op BIC 또는 ORR 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype I16 또는 I32 중하나여야합니다. Qd ¹«Dd 소스및결과의 NEON 레지스터입니다. imm 즉치상수입니다. 즉치상수 datatype이 I16이면즉치상수는다음형식중하나에해당해야합니다. 0x00XY 0xXY00 datatype이 I32이면즉치상수는다음형식중하나에해당해야합니다. 0x000000XY 0x0000XY00 0x00XY0000 0xXY000000 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-27

NEON 및 VFP 프로그래밍 5.5.3 VBIF, VBIT 및 VBSL VBIT(True 인경우비트단위삽입 ) 는두번째피연산자의해당비트가 1 이면첫번째피연산자의각비트를대상에삽입하고, 그렇지않으면대상비트를변경하지않습니다. VBIF(False 인경우비트단위삽입 ) 는두번째피연산자의해당비트가 0 이면첫번째피연산자의각비트를대상에삽입하고, 그렇지않으면대상비트를변경하지않습니다. VBSL( 비트단위선택 ) 은대상의해당비트가 1 이면첫번째피연산자에서대상의각비트를선택하고, 대상의해당비트가 0 이면두번째피연산자에서선택합니다. 구문 Vop{cond}{.datatype} {Qd}, Qn, Qm Vop{cond}{.datatype} {Dd}, Dn, Dm 인수설명 : op BIT, BIF 또는 BSL 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 선택적데이터유형입니다. 어셈블러에서는 datatype을무시합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 5-28 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.5.4 VMOV, VMVN( 레지스터 ) 벡터이동 ( 레지스터 ) 은소스레지스터에서대상레지스터로값을복사합니다. 벡터이동하지않음 ( 레지스터 ) 은소스레지스터의각비트값을반전시키고결과를대상레지스터에배치합니다. 구문 VMOV{cond}{.datatype} Qd, Qm VMOV{cond}{.datatype} Dd, Qm VMVN{cond}{.datatype} Qd, Qm VMVN{cond}{.datatype} Dd, Qm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 선택적데이터유형입니다. 어셈블러에서는 datatype을무시합니다. Qd, Qm 쿼드워드연산에대한대상벡터및소스벡터를지정합니다. Dd, Dm 더블워드연산에대한대상벡터및소스벡터를지정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-29

NEON 및 VFP 프로그래밍 5.5.5 VACGE 및 VACGT 벡터절대비교는벡터에있는각요소의절대값을가져와서두번째벡터의해당요소절대값과비교합니다. 조건이 true 이면대상벡터의해당요소가모두 1 로설정되고, 그렇지않으면모두 0 으로설정됩니다. 의사명령어 5-80 페이지의 VACLE 및 VACLT 도참조하십시오. 구문 VACop{cond}.F32 {Qd}, Qn, Qm VACop{cond}.F32 {Dd}, Dn, Dm 인수설명 : op 다음중하나여야합니다. GE 절대크거나같음 GT 절대보다큼 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 결과데이터유형은 I32 입니다. 5-30 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.5.6 VCEQ, VCGE, VCGT, VCLE 및 VCLT 벡터비교는벡터에있는각요소의값을가져와서두번째벡터의해당요소절대값또는 0 과비교합니다. 조건이 true 이면대상벡터의해당요소가모두 1 로설정되고, 그렇지않으면모두 0 으로설정됩니다. 의사명령어 5-81 페이지의 VCLE 및 VCLT 도참조하십시오. 구문 VCop{cond}.datatype {Qd}, Qn, Qm VCop{cond}.datatype {Dd}, Dn, Dm VCop{cond}.datatype {Qd}, Qn, #0 VCop{cond}.datatype {Dd}, Dn, #0 인수설명 : op 다음중하나여야합니다. EQ GE GT 같음크거나같음 보다큼 LE 작거나같음 ( 두번째피연산자가 #0 인경우에만해당 ) LT 보다작음 ( 두번째피연산자가 #0 인경우에만해당 ) cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). datatype 다음중하나여야합니다. EQ의경우 I8, I16, I32 또는 F32 GE, GT, LE 또는 LT(#0 형식제외 ) 의경우 S8, S16, S32, U8, U16, U32 또는 F32 GE, GT, LE 또는 LT(#0 형식 ) 의경우 S8, S16, S32 또는 F32 결과데이터유형은다음과같습니다. 피연산자데이터유형 I32, S32, U32 또는 F32의경우 I32 피연산자데이터유형 I16, S16 또는 U16 의경우 I16 피연산자데이터유형 I8, S8 또는 U8 의경우 I8 Qd, Qn, Qm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-31

NEON 및 VFP 프로그래밍 Dd, Dn, Dm 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. #0 비교할 Qm 또는 Dm 을 0 으로바꿉니다. 5.5.7 VTST VTST( 벡터테스트비트 ) 는벡터의각요소를가져와서두번째벡터의해당요소로비트단위논리 AND 를수행합니다. 결과가 0 이아니면대상벡터의해당요소가모두 1 로설정되고, 그렇지않으면모두 0 으로설정됩니다. 구문 VTST{cond}.size {Qd}, Qn, Qm VTST{cond}.size {Dd}, Dn, Dm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size 8, 16 또는 32 중하나여야합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 5-32 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6 NEON 일반데이터처리명령어 이단원에는다음소단원이포함되어있습니다. 5-34페이지의 VCVT 고정소수점또는정수와부동소수점간의벡터변환 5-35페이지의 VDUP 스칼라를벡터의모든레인으로복제 5-36페이지의 VEXT 추출 5-37페이지의 VMOV, VMVN( 즉치값 ) 이동및음수이동 ( 즉치값 ) 5-38페이지의 VMOVL, V{Q}MOVN, VQMOVUN 이동 ( 레지스터 ) 5-39페이지의 VREV 벡터내요소반전 5-40페이지의 VSWP 벡터스왑 5-41페이지의 VTBL, VTBX 벡터테이블조회 5-42페이지의 VTRN 벡터이항 5-43페이지의 VUZP, VZIP 벡터인터리브및디인터리브 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-33

NEON 및 VFP 프로그래밍 5.6.1 VCVT VCVT( 벡터변환 ) 는다음과같이벡터의각요소를변환하고결과를두번째벡터에배치합니다. 부동소수점에서정수로변환 정수에서부동소수점으로변환 부동소수점에서고정소수점으로변환 고정소수점에서부동소수점으로변환 구문 VCVT{cond}.type Qd, Qm {, #fbits} VCVT{cond}.type Dd, Dm {, #fbits} 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). type 벡터요소의데이터유형을지정합니다. 다음중하나여야합니다. S32.F32 U32.F32 F32.S32 F32.U32 부동소수점을부호있는정수또는고정소수점으로변환부동소수점을부호없는정수또는고정소수점으로변환부호있는정수또는고정소수점을부동소수점으로변환부호없는정수또는고정소수점을부동소수점으로변환 Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터를지정합니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터를지정합니다. fbits 있을경우고정소수점숫자의부분비트수를지정합니다. 그렇지않으면부동소수점숫자와정수간에변환됩니다. fbits 는 0 ~ 32 범위에있어야합니다. fbits 를생략하면부분비트수는 0 입니다. 반올림 정수또는고정소수점을부동소수점으로변환할때는가장가까운수로반올림이사용됩니다. 부동소수점을정수또는고정소수점으로변환할때는 0 으로반올림이사용됩니다. 5-34 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6.2 VDUP 벡터복제는스칼라를대상벡터의모든요소로복제합니다. 소스는 NEON 스칼라또는 ARM 레지스터가될수있습니다. 구문 VDUP{cond}.size Qd, Dm[x] VDUP{cond}.size Dd, Dm[x] VDUP{cond}.size Qd, Rm VDUP{cond}.size Dd, Rm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size 8, 16 또는 32여야합니다. Qd 쿼드워드연산의대상레지스터를지정합니다. Dd 더블워드연산의대상레지스터를지정합니다. Dm[x] NEON 스칼라를지정합니다. Rm ARM 레지스터를지정합니다. Rm은 pc이면안됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-35

NEON 및 VFP 프로그래밍 5.6.3 VEXT 벡터추출은두번째피연산자벡터의아래쪽끝과첫번째피연산자벡터의위쪽끝에서 8 비트요소를추출하여연결하고결과를대상벡터에배치합니다. 예제를보려면그림 5-2 를참조하십시오. 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 Vm Vn Vd 그림 5-2 imm = 3 에대한더블워드 VEXT 연산 구문 VEXT{cond}.8 {Qd}, Qn, Qm, #imm VEXT{cond}.8 {Dd}, Dn, Dm, #imm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Qd, Qn, Qm Dd, Dn, Dm imm 쿼드워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 더블워드연산에대한대상레지스터, 첫번째피연산자레지스터및두번째피연산자레지스터를지정합니다. 두번째피연산자벡터의아래쪽끝에서추출할 8 비트요소수로, 더블워드연산의경우 0 ~ 7 범위에있고쿼드워드연산의경우 0 ~ 15 범위에있습니다. VEXT 의사명령어 여덟개가아닌 16, 32 또는 64 개의데이터유형을지정할수있습니다. 이경우 #imm 은바이트수가아니라하프워드, 워드또는더블워드를나타내고허용범위도이에따라줄어듭니다. 5-36 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6.4 VMOV, VMVN( 즉치값 ) 벡터이동및벡터음수이동 ( 즉치값 ) 은대상레지스터에즉치상수를생성합니다. 구문 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 인수설명 : op MOV 또는 MVN 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype I8, I16, I32, I64 또는 F32 중하나여야합니다. Qd 또는 Dd 결과의 NEON 레지스터입니다. imm datatype 에지정된유형의상수입니다. 이상수는대상레지스터를모두채울수있도록복제됩니다. 표 5-8 사용할수있는상수 datatype VMOV VMVN I8 0xXY - I16 0x00XY, 0xXY00 0xFFXY, 0xXYFF I32 0x000000XY, 0x0000XY00, 0x00XY0000, 0xXY000000 0xFFFFFFXY, 0xFFFFXYFF, 0xFFXYFFFF, 0xXYFFFFFF 0x0000XYFF, 0x00XYFFFF 0xFFFFXY00, 0xFFXY0000 I64 바이트마스크, 0xGGHHJJKKLLMMNNPP a - F32 부동소수점숫자 b - a. 각각의 0xGG, 0xHH, 0xJJ, 0xKK, 0xLL, 0xMM, 0xNN 및 0xPP는 0x00 또는 0xFF 중하나여야합니다. b. +/-n * 2 -r 로표시할수있는임의의숫자입니다. 여기서 n은 16에서 31 사이의정수이고 r은 0에서 7 사이 의정수입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-37

NEON 및 VFP 프로그래밍 5.6.5 VMOVL, V{Q}MOVN, VQMOVUN VMOVL( 벡터이동 Long) 은더블워드벡터의각요소를가져와서원래길이의두배로부호또는 0 확장하고결과를쿼드워드벡터에배치합니다. VMOVN( 벡터이동및 Narrow) 은쿼드워드벡터의각요소최하위반을더블워드벡터의해당요소로복사합니다. VQMOVN( 벡터포화이동및 Narrow) 은피연산자벡터의각요소를대상벡터의해당요소로복사합니다. 결과요소는피연산자요소너비의반이고값은결과너비로포화됩니다. VQMOVUN( 벡터포화이동및 Narrow, 부호없는결과포함부호있는연산자 ) 은피연산자벡터의각요소를대상벡터의해당요소로복사합니다. 결과요소는피연산자요소너비의반이고값은결과너비로포화됩니다. 구문 VMOVL{cond}.datatype Qd, Dm V{Q}MOVN{cond}.datatype Dd, Qm VQMOVUN{cond}.datatype Dd, Qm 인수설명 : Q 있을경우결과가포화됨을나타냅니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. S8, S16, S32 VMOVL의경우 U8, U16, U62 VMOVL의경우 I16, I32, I64 VMOVN의경우 S16, S32, S64 VQMOVN 또는 VQMOVUN의경우 U16, U32, U64 VQMOVN의경우 Qd, Dm VMOVL에대한대상벡터및피연산자벡터를지정합니다. Dd, Qm V{Q}MOV{U}N에대한대상벡터및피연산자벡터를지정합니다. 5-38 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6.6 VREV VREV16( 하프워드내벡터반전 ) 은벡터의각하프워드내에서 8 비트요소순서를반전시키고결과를해당대상벡터에배치합니다. VREV32( 워드내벡터반전 ) 는벡터의각워드내에서 8 비트또는 16 비트요소순서를반전시키고결과를해당대상벡터에배치합니다. VREV64( 더블워드내벡터반전 ) 는벡터의각더블워드내에서 8 비트, 16 비트또는 32 비트요소순서를반전시키고결과를해당대상벡터에배치합니다. 구문 VREVn{cond}.size Qd, Qm VREVn{cond}.size Dd, Dm 인수설명 : n 16, 32 또는 64 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size 8, 16 또는 32 중하나여야하고 n보다작아야합니다. Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터를지정합니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터를지정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-39

NEON 및 VFP 프로그래밍 5.6.7 VSWP VSWP( 벡터스왑 ) 는두벡터의내용을교환합니다. 벡터는더블워드또는쿼드워드일수있습니다. 데이터유형에는차이가없습니다. 구문 VSWP{cond}{.datatype} Qd, Qm VSWP{cond}{.datatype} Dd, Dm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 선택적데이터유형입니다. 어셈블러에서는 datatype을무시합니다. Qd, Qm 쿼드워드연산의벡터를지정합니다. Dd, Dm 더블워드연산의벡터를지정합니다. 5-40 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6.8 VTBL, VTBX VTBL( 벡터테이블조회 ) 은제어벡터에바이트색인을사용하여테이블에서바이트값을조회하고새벡터를생성합니다. 범위를벗어난색인은 0 을반환합니다. VTBX( 벡터테이블확장 ) 는범위를벗어난색인이대상요소를변경하지않는것을제외하고동일한방법으로작동합니다. 구문 Vop{cond}.8 Dd, list, Dm 인수설명 : op TBL 또는 TBX 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Dd 대상벡터를지정합니다. list 테이블이포함된벡터를지정합니다. 다음중하나여야합니다. {Dn} {Dn,D(n+1)} {Dn,D(n+1),D(n+2)} {Dn,D(n+1),D(n+2),D(n+3)} list의모든레지스터는 D0 ~ D31 범위에있어야합니다. Dm 색인벡터를지정합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-41

NEON 및 VFP 프로그래밍 5.6.9 VTRN VTRN( 벡터이항 ) 은피연산자벡터의요소를 2 x 2 매트릭스의요소로처리하고매트릭스를이항합니다. 그림 5-3 및그림 5-4 에서는 VTRN 연산의예제를보여줍니다. Dm 7 6 5 4 3 2 1 0 Dd 그림 5-3 더블워드 VTRN.8 연산 Dm 1 0 Dd 그림 5-4 더블워드 VTRN.32 연산 구문 VTRN{cond}.size Qd, Qm VTRN{cond}.size Dd, Dm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size 8, 16 또는 32 중하나여야합니다. Qd, Qm 쿼드워드연산의벡터를지정합니다. Dd, Dm 더블워드연산의벡터를지정합니다. 5-42 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.6.10 VUZP, VZIP VZIP( 벡터압축 ) 는두벡터의요소를인터리브합니다. VUZP( 벡터압축해제 ) 는두벡터의요소를디인터리브합니다. 디인터리브에대한예제를보려면 5-68 페이지의 3 요소구조체배열디인터리브를참조하십시오. 인터리브는역방향프로세스입니다. 구문 Vop{cond}.size Qd, Qm Vop{cond}.size Dd, Dm 인수설명 : op UZP 또는 ZIP 중하나여야합니다. cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). size 8, 16 또는 32 중하나여야합니다. Qd, Qm 쿼드워드연산의벡터를지정합니다. Dd, Dm 더블워드연산의벡터를지정합니다. 참고다음은모두같은명령어입니다. VZIP.32 Dd, Dm VUZP.32 Dd, Dm VTRN.32 Dd, Dm 명령어는 VTRN.32 Dd, Dm 으로디스어셈블됩니다. 5-42 페이지의 VTRN 도참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-43

NEON 및 VFP 프로그래밍 5.7 NEON 시프트명령어 이단원에는다음소단원이포함되어있습니다. 5-45페이지의 VSHL, VQSHL, VQSHLU 및 VSHLL( 즉치값기준 ) 즉치값만큼왼쪽으로시프트 5-46페이지의 V{Q}{R}SHL( 부호있는변수기준 ) 부호있는변수만큼왼쪽으로시프트 5-47페이지의 V{R}SHR{N}, V{R}SRA( 즉치값기준 ) 즉치값만큼오른쪽으로시프트 5-48페이지의 VQ{R}SHR{U}N( 즉치값기준 ) 즉치값만큼오른쪽으로시프트및포화 5-49페이지의 VSLI 및 VSRI 왼쪽으로시프트및삽입및오른쪽으로시프트및삽입 5-44 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.7.1 VSHL, VQSHL, VQSHLU 및 VSHLL( 즉치값기준 ) 벡터왼쪽으로시프트, 벡터포화왼쪽으로시프트및벡터왼쪽으로시프트 Long 이러한명령어는정수벡터의각요소를가져와서즉치값만큼왼쪽으로시프트하고결과를대상벡터에배치합니다. VSHL 의경우각요소왼쪽에서시프트된비트는버려집니다. VQSHL 및 VQSHLU 의경우포화가발생하면스티키 QC 플래그 (FPSCR 비트 [27]) 가설정됩니다. VSHLL 의경우값은부호또는 0 확장됩니다. 구문 V{Q}SHL{U}{cond}.datatype {Qd}, Qm, #imm V{Q}SHL{U}{cond}.datatype {Dd}, Dm, #imm VSHLL{cond}.datatype Qd, Dm, #imm 인수설명 : Q 있을경우결과가오버플로되면포화됨을나타냅니다. U Q 도있는경우에만허용됩니다. 피연산자에부호가있어도결과에부호가없음을나타냅니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. I8, I16, I32, I64 VSHL의경우 S8, S16, S32 VSHLL, VQSHL 또는 VQSHLU의경우 U8, U16, U32 VSHLL 또는 VQSHL의경우 S64 VQSHL 또는 VQSHLU의경우 U64 VQSHL의경우 Qd, Qm 쿼드워드연산에대한대상및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상및피연산자벡터입니다. Qd, Dm long 연산에대한대상및피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-45

NEON 및 VFP 프로그래밍 imm 다음범위에서시프트크기를지정하는즉치상수입니다. VSHLL의경우 1~ 크기 (datatype) VSHL, VQSHL 또는 VQSHLU의경우 1 ~ ( 크기 (datatype) - 1) 0이허용되지만결과코드는 VMOV 또는 VMOVL로디스어셈블됩니다. 5.7.2 V{Q}{R}SHL( 부호있는변수기준 ) VSHL( 부호있는변수기준벡터왼쪽으로시프트 ) 은벡터의각요소를가져와서두번째벡터에있는해당요소의최하위바이트값만큼시프트하고결과를대상벡터에배치합니다. 시프트값이양수이면연산이왼쪽으로시프트되고, 그렇지않으면오른쪽으로시프트됩니다. 결과는선택적으로포화또는반올림되거나포화도되고반올림도될수있습니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 V{Q}{R}SHL{cond}.datatype {Qd}, Qn, Qm V{Q}{R}SHL{cond}.datatype {Dd}, Dn, Dm 인수설명 : Q 있을경우결과가오버플로되면포화됨을나타냅니다. R 있을경우각결과가반올림됨을나타내고, 그렇지않으면각결과가잘립니다. cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). datatype S8, S16, S32, S64, U8, U16, U32 또는 U64 중하나여야합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 5-46 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.7.3 V{R}SHR{N}, V{R}SRA( 즉치값기준 ) V{R}SHR{N}( 즉치값기준벡터오른쪽으로시프트 ) 은벡터의각요소를가져와서즉치값만큼오른쪽으로시프트하고결과를대상벡터에배치합니다. 결과는선택적으로반올림또는축소되거나반올림도되고축소도될수있습니다. V{R}SRA( 즉치값기준벡터오른쪽으로시프트및누산 ) 은벡터의각요소를가져와서즉치값만큼오른쪽으로시프트하고결과를대상벡터에더합니다. 결과는선택적으로포화되거나반올림됩니다. 구문 V{R}SHR{cond}.datatype {Qd}, Qm, #imm V{R}SHR{cond}.datatype {Dd}, Dm, #imm V{R}SRA{cond}.datatype {Qd}, Qm, #imm V{R}SRA{cond}.datatype {Dd}, Dm, #imm V{R}SHRN{cond}.datatype Dd, Qm, #imm 인수설명 : R 있을경우결과가반올림됨을나타내고, 그렇지않으면결과가잘립니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. S8, S16, S32, S64 V{R}SHR 또는 V{R}SRA의경우 U8, U16, U32, U64 V{R}SHR 또는 V{R}SRA의경우 I16, I32, I64 V{R}SHRN의경우 Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터입니다. Dd, Qm 축소연산에대한대상벡터및피연산자벡터입니다. imm 0~( 크기 (datatype) - 1) 범위에서시프트크기를지정하는즉치상수입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-47

NEON 및 VFP 프로그래밍 5.7.4 VQ{R}SHR{U}N( 즉치값기준 ) VQ{R}SHR{U}N( 즉치값기준벡터포화오른쪽으로시프트, 축소, 선택적반올림포함 ) 은정수쿼드워드벡터의각요소를가져와서즉치값만큼오른쪽으로시프트하고결과를더블워드벡터에배치합니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 VQ{R}SHR{U}N{cond}.datatype Dd, Qm, #imm 인수설명 : R U 있을경우결과가반올림됨을나타내고, 그렇지않으면결과가잘립니다. 있을경우피연산자에부호가있어도결과에부호가없음을나타내고, 그렇지않으면결과는피연산자와동일한유형입니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. S16, S32, S64 VQ{R}SHRN 또는 VQ{R}SHRUN의경우 U16, U32, U64 VQ{R}SHRN의경우에만 Dd, Qm 대상벡터및피연산자벡터입니다. imm 0~( 크기 (datatype) - 1) 범위에서시프트크기를지정하는즉치상수입니다. 5-48 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.7.5 VSLI 및 VSRI VSLI( 벡터왼쪽으로시프트및삽입 ) 는벡터의각요소를가져와서즉치값만큼왼쪽으로시프트하고결과를대상벡터에삽입합니다. 각요소왼쪽에서시프트된비트는버려집니다. VSRI( 벡터오른쪽으로시프트및삽입 ) 는벡터의각요소를가져와서즉치값만큼오른쪽으로시프트하고결과를대상벡터에삽입합니다. 각요소오른쪽에서시프트된비트는버려집니다. 구문 Vop{cond}.size {Qd}, Qm, #imm Vop{cond}.size {Dd}, Dm, #imm 인수설명 : op SLI 또는 SRI 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). size 8, 16, 32 또는 64 중하나여야합니다. Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터입니다. imm 다음범위에서시프트크기를지정하는즉치상수입니다. VSLI의경우 0~(size - 1) VSRI의경우 1~size ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-49

NEON 및 VFP 프로그래밍 5.8 NEON 일반산술명령어 이단원에는다음소단원이포함되어있습니다. 5-51페이지의 VABA{L} 및 VABD{L} 벡터절대차이, 누산및절대차이 5-52페이지의 V{Q}ABS 및 V{Q}NEG 벡터절대값및부정 5-53페이지의 V{Q}ADD, VADDL, VADDW, V{Q}SUB, VSUBL 및 VSUBW 벡터더하기및빼기 5-54페이지의 V{R}ADDHN 및 V{R}SUBHN 벡터더하기상위반선택및빼기상위반선택 5-55페이지의 V{R}HADD 및 VHSUB 벡터양분더하기및빼기 5-56페이지의 VPADD{L}, VPADAL 벡터인접쌍더하기, 더하기및누산 5-58페이지의 VMAX, VMIN, VPMAX 및 VPMIN 벡터최대값, 최소값, 인접쌍최대값및인접쌍최소값 5-59페이지의 VCLS, VCLZ 및 VCNT 벡터선행부호비트계산, 선행 0 수계산및세트비트계산 5-60페이지의 VRECPE 및 VRSQRTE 벡터역수추정및역수제곱근추정 5-61페이지의 VRECPS 및 VRSQRTS 벡터역수추정및역수제곱근추정 5-50 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.8.1 VABA{L} 및 VABD{L} VABA( 벡터절대차이및누산 ) 는한벡터요소를다른벡터의해당요소에서빼고결과의절대값을대상벡터요소에더합니다. VABD( 벡터절대차이 ) 는한벡터요소를다른벡터의해당요소에서빼고결과의절대값을대상벡터요소에배치합니다. 두명령어의 Long 버전을사용할수있습니다. 구문 Vop{cond}.datatype {Qd}, Qn, Qm Vop{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm 인수설명 : op ABA 또는 ABD 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. VABA, VABAL 또는 VABDL의경우 S8, S16, S32, U8, U16 또는 U32 VABD의경우 S8, S16, S32, U8, U16, U32 또는 F32 Qd, Qn, Qm Dd, Dn, Dm Qd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. long 연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-51

NEON 및 VFP 프로그래밍 5.8.2 V{Q}ABS 및 V{Q}NEG VABS( 벡터절대값 ) 는벡터에있는각요소의절대값을구하고결과를두번째벡터에배치합니다. 부동소수점버전에서만부호비트를지웁니다. VNEG( 벡터부정 ) 는벡터의각요소를부정하고결과를두번째벡터에배치합니다. 부동소수점버전에서만부호비트를반전시킵니다. 두명령어의포화버전을사용할수있습니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 V{Q}op{cond}.datatype Qd, Qm V{Q}op{cond}.datatype Dd, Dm 인수설명 : Q 있을경우결과가오버플로되면포화됨을나타냅니다. op ABS 또는 NEG 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. S8, S16, S32 VABS, VNEG, VQABS 또는 VQNEG의경우 F32 VABS 및 VNEG의경우에만 Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터입니다. 5-52 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.8.3 V{Q}ADD, VADDL, VADDW, V{Q}SUB, VSUBL 및 VSUBW VADD( 벡터더하기 ) 는두벡터의해당요소를더하고결과를대상벡터에배치합니다. VSUB( 벡터빼기 ) 는한벡터요소를다른벡터의해당요소에서빼고결과를대상벡터에배치합니다. 포화, Long 및 Wide 버전을사용할수있습니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 V{Q}op{cond}.datatype {Qd}, Qn, Qm V{Q}op{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm VopW{cond}.datatype {Qd}, Qn, Dm 인수설명 : Q 있을경우결과가오버플로되면포화됨을나타냅니다. op ADD 또는 SUB 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. I8, I16, I32, I64, F32 VADD 또는 VSUB의경우 S8, S16, S32 VQADD, VQSUB, VADDL, VADDW, VSUBL 또는 VSUBW의경우 U8, U16, U32 VQADD, VQSUB, VADDL, VADDW, VSUBL 또는 VSUBW의경우 S64, U64 VQADD 또는 VQSUB의경우 Qd, Qn, Qm Dd, Dn, Dm Qd, Dn, Dm Qd, Qn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. long 연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. Wide 연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-53

NEON 및 VFP 프로그래밍 5.8.4 V{R}ADDHN 및 V{R}SUBHN V{R}ADDH( 벡터더하기및 Narrow, 상위반선택 ) 는두벡터의해당요소를더하고결과의최상위반을선택한후최종결과를대상벡터에배치합니다. 결과는반올림되거나잘릴수있습니다. V{R}SUBH( 벡터빼기및 Narrow, 상위반선택 ) 는한벡터요소를다른벡터의해당요소에서빼고결과의최상위반을선택한후최종결과를대상벡터에배치합니다. 결과는반올림되거나잘릴수있습니다. 구문 V{R}opHN{cond}.datatype Dd, Qn, Qm 인수설명 : R 있을경우각결과가반올림됨을나타내고, 그렇지않으면각결과가잘립니다. op ADD 또는 SUB 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype I16, I32 또는 I64 중하나여야합니다. Dd, Qn, Qm 대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 5-54 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.8.5 V{R}HADD 및 VHSUB VHADD( 벡터양분더하기 ) 는두벡터의해당요소를더하고각결과를 1 비트오른쪽으로시프트한후최종결과를대상벡터에배치합니다. 결과는반올림되거나잘릴수있습니다. VHSUB( 벡터양분빼기 ) 는한벡터요소를다른벡터의해당요소에서빼고각결과를 1 비트오른쪽으로시프트한후최종결과를대상벡터에배치합니다. 결과는항상잘립니다. 구문 V{R}HADD{cond}.datatype {Qd}, Qn, Qm V{R}HADD{cond}.datatype {Dd}, Dn, Dm VHSUB{cond}.datatype {Qd}, Qn, Qm VHSUB{cond}.datatype {Dd}, Dn, Dm 인수설명 : R 있을경우각결과가반올림됨을나타내고, 그렇지않으면각결과가잘립니다. cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). datatype S8, S16, S32, U8, U16 또는 U32 중하나여야합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-55

NEON 및 VFP 프로그래밍 5.8.6 VPADD{L}, VPADAL VPADD( 벡터인접쌍더하기 ) 는두벡터요소의인접쌍을더하고결과를대상벡터에배치합니다. Dm Dn + + + + Dd 그림 5-5 VPADD 연산예제 ( 이경우데이터유형은 I16 임 ) VPADDL( 벡터인접쌍더하기 Long) 은벡터요소의인접쌍을더하고결과를원래너비의두배로부호또는 0 확장한후최종결과를대상벡터에배치합니다. Dm + + Dd 그림 5-6 더블워드 VPADDL 연산예제 ( 이경우데이터유형은 S16 임 ) VPADAL( 벡터인접쌍더하기및누산 Long) 은벡터요소의인접쌍을더하고결과의절대값을대상벡터요소에더합니다. Dm + + Dd 그림 5-7 VPADAL 연산예제 ( 이경우데이터유형은 S16 임 ) 5-56 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 구문 VPADD{cond}.datatype {Dd}, Dn, Dm VPopL{cond}.datatype Qd, Qm VPopL{cond}.datatype Dd, Dm 인수설명 : op ADD 또는 ADA 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. I8, I16, I32, F32 VPADD의경우 S8, S16, S32 VPADDL 또는 VPADAL의경우 U8, U16, U32 VPADDL 또는 VPADAL의경우 Dd, Dn, Dm Qd, Qm Dd, Dm VPADD 명령어에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 쿼드워드 VPADDL 또는 VPADAL 에대한대상벡터및피연산자벡터입니다. 더블워드 VPADDL 또는 VPADAL 에대한대상벡터및피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-57

NEON 및 VFP 프로그래밍 5.8.7 VMAX, VMIN, VPMAX 및 VPMIN VMAX( 벡터최대값 ) 는두벡터의해당요소를비교하고각쌍의큰쪽을대상벡터의해당요소에복사합니다. VMIN( 벡터최소값 ) 은두벡터의해당요소를비교하고각쌍의작은쪽을대상벡터의해당요소에복사합니다. VPMAX( 벡터인접쌍최대값 ) 는두벡터요소의인접쌍을비교하고각쌍의큰쪽을대상벡터의해당요소에복사합니다. 피연산자와결과는더블워드벡터여야합니다. VPMIN( 벡터인접쌍최소값 ) 은두벡터요소의인접쌍을비교하고각쌍의작은쪽을대상벡터의해당요소에복사합니다. 피연산자와결과는더블워드벡터여야합니다. 인접쌍연산에대한다이어그램을보려면 5-56 페이지의그림 5-5 를참조하십시오. 구문 Vop{cond}.datatype Qd, Qn, Qm Vop{cond}.datatype Dd, Dn, Dm VPop{cond}.datatype Dd, Dn, Dm 인수설명 : op MAX 또는 MIN 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype S8, S16, S32, U8, U16, U32 또는 F32 중하나여야합니다. Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 부동소수점최대값및최소값 max(+0.0, -0.0) = +0.0. min(+0.0, -0.0) = -0.0 입력이 NaN이면해당결과요소는기본 NaN입니다. 5-58 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.8.8 VCLS, VCLZ 및 VCNT VCLS( 벡터선행부호비트계산 ) 는벡터의각요소에서최상위비트뒤에나오는최상위비트와동일한연속비트수를계산하고결과를두번째벡터에배치합니다. VCLZ( 벡터선행 0 수계산 ) 는벡터의각요소에서상위비트부터연속 0 수를계산하고결과를두번째벡터에배치합니다. VCNT( 벡터세트비트계산 ) 는벡터의각요소중하나인비트수를계산하고결과를두번째벡터에배치합니다. 구문 Vop{cond}.datatype Qd, Qm Vop{cond}.datatype Dd, Dm 인수설명 : op CLS, CLZ 또는 CNT 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. CLS의경우 S8, S16 또는 S32 CLZ의경우 I8, I16 또는 I32 CNT의경우 I8 Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-59

NEON 및 VFP 프로그래밍 5.8.9 VRECPE 및 VRSQRTE VRECPE( 벡터역수추정 ) 는벡터에서각요소의대략적역수를찾고결과를두번째벡터에배치합니다. VRSQRTE( 벡터역수제곱근추정 ) 는벡터에서각요소의대략적역수제곱근을찾고결과를두번째벡터에배치합니다. 구문 Vop{cond}.datatype Qd, Qm Vop{cond}.datatype Dd, Dm 인수설명 : op RECPE 또는 RSQRTE 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype U32 또는 F32 중하나여야합니다. Qd, Qm 쿼드워드연산에대한대상벡터및피연산자벡터입니다. Dd, Dm 더블워드연산에대한대상벡터및피연산자벡터입니다. 범위를벗어난입력결과 표 5-9에서는입력값이범위를벗어난결과를보여줍니다. 표 5-9 범위를벗어난입력결과 피연산자요소 (VRECPE) 피연산자요소 (VRSQRTE) 결과요소 정수 <= 0x7FFFFFFF <= 0x3FFFFFFF 0xFFFFFFFF 부동소수점 NaN NaN, 음의정규값, 음의무한대 기본 NaN 음의 0, 음의비정규값 음의 0, 음의비정규값 음의무한대 a 양의 0, 양의비정규값 양의 0, 양의비정규값 양의무한대 a 양의무한대 양의무한대 양의 0 음의무한대 음의 0 a. FPSCR(FPSCR[1]) 에서 0 으로나눔예외비트가설정됩니다. 5-60 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.8.10 VRECPS 및 VRSQRTS VRECPS( 벡터역수단계 ) 는한벡터요소에다른벡터의해당요소를곱하고 2 에서각결과를뺀후최종결과를대상벡터의요소에배치합니다. VRSQRTS( 벡터역수제곱근단계 ) 는한벡터요소에다른벡터의해당요소를곱하고 3 에서각결과를빼고 2 로나눈후최종결과를대상벡터의요소에배치합니다. 구문 Vop{cond}.F32 {Qd}, Qn, Qm Vop{cond}.F32 {Dd}, Dn, Dm 인수설명 : op RECPS 또는 RSQRTS 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Qd, Qn, Qm Dd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 범위를벗어난입력결과 표 5-10에서는입력값이범위를벗어난결과를보여줍니다. 표 5-10 범위를벗어난입력결과 첫번째피연산자요소 두번째피연산자요소 결과요소 (VRECPS) 결과요소 (VRSQRTS) NaN - 기본 NaN 기본 NaN - NaN 기본 NaN 기본 NaN +/- 0.0 또는비정규값 +/- 무한대 2.0 1.5 +/- 무한대 +/- 0.0 또는비정규값 2.0 1.5 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-61

NEON 및 VFP 프로그래밍 사용법 Newton-Raphson 이터레이션 : x n+1 = x n (2-dx n ) x 0 이 d에적용된 VRECPE의결과이면 (1/d) 로수렴됩니다. Newton-Raphson 이터레이션 : x n+1 = x n (3-dx 2 n )/2 x 0 이 d에적용된 VRSQRTE의결과이면 (1/ d) 로수렴됩니다. 5-62 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.9 NEON 곱하기명령어 이단원에는다음소단원이포함되어있습니다. 5-64페이지의 VMUL{L}, VMLA{L} 및 VMLS{L} 벡터곱하기, 곱하기누산및곱하기빼기 5-65페이지의 VMUL{L}, VMLA{L} 및 VMLS{L}( 스칼라기준 ) 벡터곱하기, 곱하기누산및곱하기빼기 ( 스칼라기준 ) 5-66페이지의 VQDMULL, VQDMLAL 및 VQDMLSL( 벡터기준또는스칼라기준 ) 벡터포화배수화곱하기, 곱하기누산및곱하기빼기 ( 벡터또는스칼라기준 ) 5-67페이지의 VQ{R}DMULH( 벡터기준또는스칼라기준 ) 상위반을반환하는벡터포화배수화곱하기 ( 벡터또는스칼라기준 ) ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-63

NEON 및 VFP 프로그래밍 5.9.1 VMUL{L}, VMLA{L} 및 VMLS{L} VMUL( 벡터곱하기 ) 은두벡터의해당요소를곱하고결과를대상벡터에배치합니다. VMLA( 벡터곱하기누산 ) 는두벡터의해당요소를곱하고결과를대상벡터의요소에더합니다. VMLS( 벡터곱하기빼기 ) 는두벡터의해당요소를곱하고대상벡터의해당요소에서결과를뺀후최종결과를대상벡터에배치합니다. 구문 Vop{cond}.datatype {Qd}, Qn, Qm Vop{cond}.datatype {Dd}, Dn, Dm VopL{cond}.datatype Qd, Dn, Dm 인수설명 : op 다음중하나여야합니다. MUL MLA MLS 곱하기곱하기누산 곱하기빼기 cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). datatype 다음중하나여야합니다. I8, I16, I32, F32 MUL, MLA 또는 MLS 의경우 S8, S16, S32 MULL, MLAL 또는 MLSL 의경우 U8, U16, U32 MULL, MLAL 또는 MLSL 의경우 P8 MUL 또는 MULL의경우데이터유형 P8에대한자세한내용은 5-16페이지의 {0,1} 을통한다항식산술을참조하십시오. Qd, Qn, Qm Dd, Dn, Dm Qd, Dn, Dm 쿼드워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 더블워드연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. long 연산에대한대상벡터, 첫번째피연산자벡터및두번째피연산자벡터입니다. 5-64 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.9.2 VMUL{L}, VMLA{L} 및 VMLS{L}( 스칼라기준 ) VMUL( 스칼라기준벡터곱하기 ) 은벡터의각요소에스칼라를곱하고결과를대상벡터에배치합니다. VMLA( 벡터곱하기누산 ) 는두벡터의해당요소를곱하고결과를대상벡터의요소에더합니다. VMLS( 벡터곱하기빼기 ) 는두벡터의해당요소를곱하고대상벡터의해당요소에서결과를뺀후최종결과를대상벡터에배치합니다. 구문 Vop{cond}.datatype {Qd}, Qn, Dm[x] Vop{cond}.datatype {Dd}, Dn, Dm[x] VopL{cond}.datatype Qd, Dn, Dm[x] 인수설명 : op 다음중하나여야합니다. MUL 곱하기 MLA 곱하기누산 MLS 곱하기빼기 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 다음중하나여야합니다. I16, I32, F32 MUL, MLA 또는 MLS의경우 S16, S32 MULL, MLAL 또는 MLSL의경우 U16, U32 MULL, MLAL 또는 MLSL의경우 Qd, Qn 쿼드워드연산에대한대상벡터및첫번째피연산자벡터입니다. Dd, Dn 더블워드연산에대한대상벡터및첫번째피연산자벡터입니다. Qd, Dn long 연산에대한대상벡터및첫번째피연산자벡터입니다. Dm[x] 두번째피연산자가들어있는스칼라입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-65

NEON 및 VFP 프로그래밍 5.9.3 VQDMULL, VQDMLAL 및 VQDMLSL( 벡터기준또는스칼라기준 ) 벡터포화배수화곱하기명령어는피연산자를곱하고결과를배수화합니다. VQDMULL 은결과를대상레지스터에배치합니다. VQDMLAL 은결과를대상레지스터의값에더합니다. VQDMLSL 은대상레지스터의값에서결과를뺍니다. 결과가오버플로되는경우포화됩니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 VQDopL{cond}.datatype Qd, Dn, Dm VQDopL{cond}.datatype Qd, Dn, Dm[x] 인수설명 : op 다음중하나여야합니다. MUL 곱하기 MLA 곱하기누산 MLS 곱하기빼기 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype S16 또는 S32 중하나여야합니다. Qd, Dn 대상벡터및첫번째피연산자벡터입니다. Dm 벡터기준연산에대한두번째피연산자가들어있는벡터입니다. Dm[x] 스칼라기준연산에대한두번째피연산자가들어있는스칼라입니다. 5-66 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.9.4 VQ{R}DMULH( 벡터기준또는스칼라기준 ) 벡터포화배수화곱하기명령어는피연산자를곱하고결과를배수화합니다. 이명령어는결과의상위반만반환합니다. 결과가오버플로되는경우포화됩니다. 포화가발생하면스티키 QC 플래그 (FPSCR bit[27]) 가설정됩니다. 구문 VQ{R}DMULH{cond}.datatype {Qd}, Qn, Qm VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm VQ{R}DMULH{cond}.datatype {Qd}, Qn, Dm[x] VQ{R}DMULH{cond}.datatype {Dd}, Dn, Dm[x] 인수설명 : R 있을경우각결과가반올림됨을나타내고, 그렇지않으면각결과가잘립니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype S16 또는 S32 중하나여야합니다. Qd, Qn 쿼드워드연산에대한대상벡터및첫번째피연산자벡터입니다. Dd, Dn 더블워드연산에대한대상벡터및첫번째피연산자벡터입니다. Qm 또는 Dm 벡터기준연산에대한두번째피연산자가들어있는벡터입니다. Dm[x] 스칼라기준연산에대한두번째피연산자가들어있는스칼라입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-67

NEON 및 VFP 프로그래밍 5.10 NEON 요소및구조체로드 / 저장명령어 이단원에는다음소단원이포함되어있습니다. 인터리브 5-69 페이지의요소및구조체로드 / 저장명령어의정렬에대한제한 5-70페이지의 VLDn 및 VSTn( 단일 n-요소구조체를하나의레인에로드 ) 대부분의데이터액세스에사용됩니다. 일반벡터가로드될수있습니다 (n = 1). 5-72 페이지의 VLDn( 단일 n- 요소구조체를모든레인에로드 ) 5-74 페이지의 VLDn 및 VSTn( 여러 n- 요소구조체 ) 5.10.1 인터리브 이그룹에있는대부분의명령어는구조체를메모리에저장할때인터리브를제공하고메모리에서구조체를로드할때디인터리브를제공합니다. 그림 5-8 에서는디인터리브의예를보여줍니다. 인터리브는역방향프로세스입니다. A[0].x A[0].y A[0].z A[1].x A[1].y A[1].z A[2].x A[2].y A[2].z A[3].x A[3].y A[3].z Z 3 Z 2 Z 1 Z 0 D2 Y 3 X 3 X 2 X 1 X 0 D0 Y 2 Y 1 Y 0 D1 그림 5-8 3 요소구조체배열디인터리브 5-68 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.10.2 요소및구조체로드 / 저장명령어의정렬에대한제한 이러한명령어의대부분에서는메모리정렬제한을지정할수있습니다. 명령어에서정렬을지정하지않으면정렬제한은 A 비트 (CP15 레지스터 1 비트 [1]) 에의해제어됩니다. A 비트가 0 이면정렬제한이없습니다 ( 강력한순서가지정된경우나액세스가요소로정렬되어야하거나결과를예상할수없는장치메모리의경우제외 ). A 비트가 1 이면액세스가요소로정렬되어야합니다. 주소가제대로정렬되지않으면정렬오류가발생합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-69

NEON 및 VFP 프로그래밍 5.10.3 VLDn 및 VSTn( 단일 n- 요소구조체를하나의레인에로드 ) 단일 n- 요소구조체를하나의레인에벡터로드하면단일 n- 요소구조체가메모리에서하나이상의 NEON 레지스터로로드됩니다. 로드되지않은레지스터요소는변경되지않습니다. 구문 Vopn{cond}.datatype list, [Rn{@align}]{!} Vopn{cond}.datatype list, [Rn{@align}], Rm 인수설명 : op LD 또는 ST 중하나여야합니다. n 1, 2, 3 또는 4 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 5-71페이지의표 5-11을참조하십시오. list Rn align NEON 레지스터목록을지정합니다. 옵션을보려면 5-71 페이지의표 5-11 을참조하십시오. 기본주소가들어있는 ARM 레지스터입니다. Rn 은 R15 일수없습니다. 선택적정렬을지정합니다. 옵션을보려면 5-71 페이지의표 5-11 을참조하십시오.!! 기호가있으면 Rn 이 (Rn + 명령어로전송된바이트수 ) 로업데이트됩니다. 업데이트는로드 / 저장이모두수행된후에수행됩니다. Rm 기본주소의오프셋이들어있는 ARM 레지스터입니다. Rm 이있으면메모리액세스에주소가사용된후 Rn 이 (Rn + Rm) 으로업데이트됩니다. Rm 은 R13 또는 R15 일수없습니다. 5-70 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-11 허용된매개변수조합 n datatype list a align b 정렬 1 8 {Dd[x]} - 표준에만해당 16 {Dd[x]} @16 2바이트 32 {Dd[x]} @32 4바이트 2 8 {Dd[x], D(d+1)[x]} @16 2바이트 16 {Dd[x], D(d+1)[x]} @32 4바이트 {Dd[x], D(d+2)[x]} @32 4바이트 32 {Dd[x], D(d+1)[x]} @64 8바이트 {Dd[x], D(d+2)[x]} @64 8바이트 3 8, 16 또는 32 {Dd[x], D(d+1)[x], D(d+2)[x]} - 표준에만해당 {Dd[x], D(d+2)[x], D(d+4)[x]} - 표준에만해당 4 8 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @32 4바이트 {Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @32 4바이트 16 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 8바이트 {Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 8바이트 32 {Dd[x], D(d+1)[x], D(d+2)[x], D(d+3)[x]} @64 또는 @128 8 바이트또는 16 바이트 {Dd[x], D(d+2)[x], D(d+4)[x], D(d+6)[x]} @64 또는 @128 8 바이트또는 16 바이트 a. list의모든레지스터는 D0 ~ D31 범위에있어야합니다. b. Align은생략할수있습니다. 이경우표준정렬규칙이적용됩니다. 자세한내용은 5-69페이지의 요소및구조체로드 / 저장명령어의정렬에대한제한을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-71

NEON 및 VFP 프로그래밍 5.10.4 VLDn( 단일 n- 요소구조체를모든레인에로드 ) 단일 n- 요소구조체를모든레인에벡터로드하면단일 n- 요소구조체의여러복사본이메모리에서하나이상의 NEON 레지스터로로드됩니다. 구문 VLDn{cond}.datatype list, [Rn{@align}]{!} VLDn{cond}.datatype list, [Rn{@align}], Rm 인수설명 : n 1, 2, 3 또는 4 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 5-73페이지의표 5-12를참조하십시오. list Rn align NEON 레지스터목록을지정합니다. 옵션을보려면 5-73 페이지의표 5-12 를참조하십시오. 기본주소가들어있는 ARM 레지스터입니다. Rn 은 R15 일수없습니다. 선택적정렬을지정합니다. 옵션을보려면 5-73 페이지의표 5-12 를참조하십시오.!! 기호가있으면 Rn 이 (Rn + 명령어로전송된바이트수 ) 로업데이트됩니다. 업데이트는로드 / 저장이모두수행된후에수행됩니다. Rm 기본주소의오프셋이들어있는 ARM 레지스터입니다. Rm 이있으면메모리액세스에주소가사용된후 Rn 이 (Rn + Rm) 으로업데이트됩니다. Rm 은 R13 또는 R15 일수없습니다. 5-72 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-12 허용된매개변수조합 n datatype list a align b 정렬 1 8 {Dd[]} - 표준에만해당 {Dd[],D(d+1)[]} - 표준에만해당 16 {Dd[]} @16 2바이트 {Dd[],D(d+1)[]} @16 2바이트 32 {Dd[]} @32 4바이트 {Dd[],D(d+1)[]} @32 4바이트 2 8 {Dd[], D(d+1)[]} @8 바이트 {Dd[], D(d+2)[]} @8 바이트 16 {Dd[], D(d+1)[]} @16 2바이트 {Dd[], D(d+2)[]} @16 2바이트 32 {Dd[], D(d+1)[]} @32 4바이트 {Dd[], D(d+2)[]} @32 4바이트 3 8, 16 o 또는 32 {Dd[], D(d+1)[], D(d+2)[]} - 표준에만해당 {Dd[], D(d+2)[], D(d+4)[]} - 표준에만해당 4 8 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @32 4바이트 {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @32 4바이트 16 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 8바이트 {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 8바이트 32 {Dd[], D(d+1)[], D(d+2)[], D(d+3)[]} @64 또는 @128 8 바이트또는 16 바이트 {Dd[], D(d+2)[], D(d+4)[], D(d+6)[]} @64 또는 @128 8 바이트또는 16 바이트 a. list의모든레지스터는 D0 ~ D31 범위에있어야합니다. b. Align은생략할수있습니다. 이경우표준정렬규칙이적용됩니다. 자세한내용은 5-69페이지의 요소및구조체로드 / 저장명령어의정렬에대한제한을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-73

NEON 및 VFP 프로그래밍 5.10.5 VLDn 및 VSTn( 여러 n- 요소구조체 ) 여러 n- 요소구조체를벡터로드하면디인터리브를통해여러 n- 요소구조체가메모리에서하나이상의 NEON 레지스터로로드됩니다 (n 이 1 이아닐경우 ). 이때각레지스터의모든요소가로드됩니다. 여러 n- 요소구조체를벡터저장하면인터리브를통해하나이상의 NEON 레지스터에있는여러 n- 요소구조체가메모리에저장됩니다 (n 이 1 이아닐경우 ). 이때각레지스터의모든요소가저장됩니다. 구문 Vopn{cond}.datatype list, [Rn{@align}]{!} Vopn{cond}.datatype list, [Rn{@align}], Rm 인수설명 : op LD 또는 ST 중하나여야합니다. n 1, 2, 3 또는 4 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype 옵션을보려면 5-75페이지의표 5-13을참조하십시오. list Rn align NEON 레지스터목록을지정합니다. 옵션을보려면 5-75 페이지의표 5-13 을참조하십시오. 기본주소가들어있는 ARM 레지스터입니다. Rn 은 R15 일수없습니다. 선택적정렬을지정합니다. 옵션을보려면 5-75 페이지의표 5-13 을참조하십시오.!! 기호가있으면 Rn 이 (Rn + 명령어로전송된바이트수 ) 로업데이트됩니다. 업데이트는로드 / 저장이모두수행된후에수행됩니다. Rm 기본주소의오프셋이들어있는 ARM 레지스터입니다. Rm 이있으면메모리액세스에주소가사용된후 Rn 이 (Rn + Rm) 으로업데이트됩니다. Rm 은 R13 또는 R15 일수없습니다. 5-74 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-13 허용된매개변수조합 n datatype list a align b 정렬 1 8, 16, 32 또는 64 {Dd} @64 8 바이트 {Dd, D(d+1)} @64 또는 @128 8 바이트또는 16 바이트 {Dd, D(d+1), D(d+2)} @64 8 바이트 {Dd, D(d+1), D(d+2), D(d+3)} @64, @128 또는 @256 8, 16 32 2 8, 16 또는 32 {Dd, D(d+1)} @64, @128 8 또는 16 {Dd, D(d+2)} @64, @128 8 바이트또는 16 바이트 {Dd, D(d+1), D(d+2), D(d+3)} @64, @128 또는 @256 8 바이트, 16 바이트또는 32 바이트 3 8, 16 또는 32 {Dd, D(d+1), D(d+2)} @64 8 바이트 {Dd, D(d+2), D(d+4)} @64 8 바이트 4 8, 16 또는 32 {Dd, D(d+1), D(d+2), D(d+3)} @64, @128 또는 @256 8 바이트, 16 바이트또는 32 바이트 {Dd, D(d+2), D(d+4), D(d+6)} @64, @128 또는 @256 8 바이트, 16 바이트또는 32 바이트 a. list의모든레지스터는 D0 ~ D31 범위에있어야합니다. b. Align은생략할수있습니다. 이경우표준정렬규칙이적용됩니다. 자세한내용은 5-69페이지의요 소및구조체로드 / 저장명령어의정렬에대한제한을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-75

NEON 및 VFP 프로그래밍 5.11 NEON 및 VFP 의사명령어 이단원에는다음소단원이포함되어있습니다. 5-77페이지의 VLDR 의사명령어 (NEON 및 VFP) 5-78페이지의 VMOV2(NEON만 ) 5-79페이지의 VAND 및 VORN( 즉치값 )(NEON만) 5-80페이지의 VACLE 및 VACLT(NEON만 ) 5-81페이지의 VCLE 및 VCLT(NEON만 ) 5-76 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.11.1 VLDR 의사명령어 VLDR 의사명령어는상수값을 64 비트 NEON 벡터의모든요소나 VFP 단정밀도또는배정밀도레지스터로로드합니다. 참고이단원에서는 VLDR 의사명령어에대해서만설명합니다. VLDR 명령어에대한자세한내용은 5-19 페이지의 VLDR 및 VSTR 을참조하십시오. 구문 VLDR{cond}.datatype Dd,=constant VLDR{cond}.datatype Sd,=constant 인수설명 : datatype 다음중하나여야합니다. In NEON만해당 Sn NEON만해당 Un NEON만해당 F32 NEON 또는 VFP F64 VFP만해당 n 8, 16, 32 또는 64 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Dd 또는 Sd 로드할확장레지스터입니다. constant datatype에적합한유형의상수입니다. 사용법 레지스터에상수를직접생성할수있는명령어 ( 예 : VMOV) 를사용할수있으면어셈블러에서이명령어를사용합니다. 그렇지않으면어셈블러에서상수가포함된더블워드리터럴풀엔트리를생성하고 VLDR 명령어를사용하여상수를로드합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-77

NEON 및 VFP 프로그래밍 5.11.2 VMOV2 VMOV2 의사명령어는리터럴풀에서값을로드하지않고상수를생성하여 NEON 벡터의모든요소에배치합니다. 이명령어는항상정확히두개의명령어로어셈블됩니다. VMOV2 는모든 16 비트상수와제한된범위의 32 비트및 64 비트상수를생성할수있습니다. 구문 VMOV2{cond}.datatype Qd, #constant VMOV2{cond}.datatype Dd, #constant 인수설명 : datatype 다음중하나여야합니다. I8, I16, I32 또는 I64 S8, S16, S32 또는 S64 U8, U16, U32 또는 U64 F32 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Qd 또는 Dd 로드할확장레지스터입니다. constant datatype에적합한유형의상수입니다. 사용법 일반적으로 VMOV2 는 VMOV 또는 VMVN 명령어로어셈블되며, 그뒤에는 VBIC 또는 VORR 명령어가옵니다. 자세한내용은 5-37 페이지의 VMOV, VMVN( 즉치값 ) 및 5-27 페이지의 VBIC 및 VORR( 즉치값 ) 을참조하십시오. 5-78 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.11.3 VAND 및 VORN( 즉치값 ) VAND( 비트단위 AND 즉치값 ) 는대상벡터의각요소를가져와서즉치값상수로비트단위 AND 를수행하고결과를대상벡터에반환합니다. VORN( 비트단위 OR NOT 즉치값 ) 은대상벡터의각요소를가져와서즉치값상수로비트단위 OR 보수를수행하고결과를대상벡터에반환합니다. 참고 디스어셈블리에서이러한의사명령어는보수즉치상수를통해해당 VBIC 및 VORR 명령어로디스어셈블됩니다. 구문 Vop{cond}.datatype Qd, #imm Vop{cond}.datatype Dd, #imm 인수설명 : op VAND 또는 VORN 중하나여야합니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype I16 또는 I32 중하나여야합니다. Qd 또는 Dd 결과의 NEON 레지스터입니다. imm 즉치상수입니다. 즉치상수 datatype이 I16이면즉치상수는다음형식중하나에해당해야합니다. 0xFFXY 0xXYFF datatype이 I32이면즉치상수는다음형식중하나에해당해야합니다. 0xFFFFFFXY 0xFFFFXYFF 0xFFXYFFFF 0xXYFFFFFF ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-79

NEON 및 VFP 프로그래밍 5.11.4 VACLE 및 VACLT 벡터절대비교는벡터에있는각요소의절대값을가져와서두번째벡터의해당요소절대값과비교합니다. 조건이 true 이면대상벡터의해당요소가모두 1 로설정되고, 그렇지않으면모두 0 으로설정됩니다. 참고 디스어셈블리에서이러한의사명령어는피연산자가반전되어해당 VACGE 및 VACGT 명령어로디스어셈블됩니다. 구문 VACop{cond}.datatype {Qd}, Qn, Qm VACop{cond}.datatype {Dd}, Dn, Dm 인수설명 : op 다음중하나여야합니다. LE 절대작거나같음 LT 절대보다작음 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype F32여야합니다. Qd 또는 Dd 결과의 NEON 레지스터입니다. 결과데이터유형은 I32입니다. Qn 또는 Dn 첫번째피연산자가들어있는 NEON 레지스터입니다. Qm 또는 Dm 두번째피연산자가들어있는 NEON 레지스터입니다. 5-80 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.11.5 VCLE 및 VCLT 벡터비교는벡터에있는각요소의값을가져와서두번째벡터의해당요소절대값또는 0 과비교합니다. 조건이 true 이면대상벡터의해당요소가모두 1 로설정되고, 그렇지않으면모두 0 으로설정됩니다. 참고 디스어셈블리에서이러한의사명령어는피연산자가반전되어해당 VCGE 및 VCGT 명령어로디스어셈블됩니다. 구문 VCop{cond}.datatype {Qd}, Qn, Qm VCop{cond}.datatype {Dd}, Dn, Dm 인수설명 : op 다음중하나여야합니다. LE 작거나같음 LT 보다작음 cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). datatype must be one of S8, S16, S32, U8, U16, U32 또는 F32 Qd 또는 Dd 결과의 NEON 레지스터입니다. 결과데이터유형은다음과같습니다. 피연산자데이터유형 I32, S32, U32 또는 F32의경우 I32 피연산자데이터유형 I16, S16 또는 U16의경우 I16 피연산자데이터유형 I8, S8 또는 U8의경우 I8 Qn 또는 Dn 첫번째피연산자가들어있는 NEON 레지스터입니다. Qm 또는 Dm 두번째피연산자가들어있는 NEON 레지스터입니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-81

NEON 및 VFP 프로그래밍 5.12 NEON 및 VFP 시스템레지스터 NEON 및 VFP의모든구현에서세개의 NEON 및 VFP 시스템레지스터에액세스할수있습니다. FPSCR, 부동소수점상태및제어레지스터 5-85 페이지의 FPEXC, 부동소수점예외레지스터 5-85 페이지의 FPSID, 부동소수점시스템 ID 레지스터 5-86 페이지의 NEON 및 VFP 시스템레지스터의개별비트수정 NEON 또는 VFP 의특정구현에는추가레지스터가있을수있습니다. 자세한내용은사용중인 VFP 보조프로세스의기술참조설명서를참조하십시오. 5.12.1 FPSCR, 부동소수점상태및제어레지스터 FPSCR 에는모든사용자수준 NEON 및 VFP 상태및제어비트가포함되어있습니다. NEON 은비트 [31:27] 만사용합니다. 이비트는다음과같이사용됩니다. 비트 [31:28] N, Z, C 및 V 플래그로, NEON 및 VFP 의상태를나타냅니다. 이러한플래그는 CPSR 의상태플래그에복사될때까지조건부실행을제어하는데사용할수없습니다 (5-9 페이지의조건코드참조 ). 비트 [27] QC, 누적포화플래그로, NEON 또는 VFP 포화명령어에서포화가발생할경우설정됩니다. 비트 [24] 0으로플러시모드제어비트입니다. 0 0으로플러시모드가해제됩니다. 1 0으로플러시모드가설정됩니다. 0으로플러시모드에서는범위를줄이면하드웨어와소프트웨어성능에따라성능이향상될수있습니다 (5-87페이지의 0으로플러시모드참조 ). 참고 NEON 은이비트에관계없이항상 0 으로플러시모드를사용합니다. IEEE 754 와의호환성이필요한경우 0 으로플러시모드를사용하면안됩니다. 5-82 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 비트 [23:22] 다음과같이반올림모드를제어합니다. 0b00. 가장가까운수로반올림 (RN) 모드 0b01. 양의무한대로반올림 (RP) 모드 0b10. 음의무한대로반올림 (RM) 모드 0b11. 0으로반올림 (RZ) 모드 비트 [21:20] STRIDE는벡터에연속해서있는값간의거리입니다 (5-99페이지의벡터참조 ). 스트라이드는다음과같이제어됩니다. 0b00 STRIDE = 1 0b11 STRIDE = 2. 비트 [18:16] LEN은각벡터에서사용되는레지스터수입니다 (5-99페이지의벡터참조 ). 1 + 비트 [18:16] 값은다음과같습니다. 0b000 LEN = 1... 0b111 LEN = 8. 비트 [12:8] 예외트랩활성화비트입니다. IXE 정확하지않은예외활성화 UFE 언더플로예외활성화 OFE 오버플로예외활성화 DZE 0으로나누기예외활성화 IOE 잘못된연산예외활성화 이설명서에서는부동소수점예외트랩의사용에대해설명하지않 습니다. 자세한내용은사용중인 VFP 보조프로세서의기술참조 설명서를참조하십시오. 비트 [4:0] 누적예외비트는다음과같습니다. IXC UFC OFC DZC IOC 정확하지않은예외 언더플로예외 오버플로예외 0 으로나누기예외 잘못된연산예외 해당예외가발생하면누적예외비트가설정됩니다. 누적예외비트는사용자가 FPSCR 에직접기록하여지울때까지설정된상태로있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-83

NEON 및 VFP 프로그래밍 다른모든비트기본 NEON 및 VFP 사양에서는사용되지않지만특정구현에서는사용될수있습니다. 자세한내용은사용중인 VFP 보조프로세서의기술참조설명서를참조하십시오. 특정구현에서사용될경우를제외하고이러한비트를수정하면안됩니다. 다른비트에영향을주지않고원하는비트만변경하려면읽기 - 수정 - 쓰기프로시저를사용하십시오 (5-86 페이지의 NEON 및 VFP 시스템레지스터의개별비트수정참조 ). 참고새코드에서는벡터모드를더이상사용할수없습니다. LEN 및 STRIDE 를 1 로설정하십시오. 5-84 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.12.2 FPEXC, 부동소수점예외레지스터 FPEXC 에는권한모드로만액세스할수있습니다. 여기에는다음비트가포함됩니다. 비트 [31] EX 비트입니다. 모든 NEON 및 VFP 구현에서읽을수있으며일부구현에서는이비트에쓸수도있습니다. 값이 0이면 NEON 또는 VFP 시스템의중요상태만범용레지스터와 FPSCR 및 FPEXC로구성됩니다. 값이 1이면상태를저장하기위해구현관련정보가필요합니다. 자세한내용은사용중인 VFP 보조프로세서의기술참조설명서를참조하십시오. 비트 [30] EN 비트입니다. 모든 NEON 또는 VFP 구현에서읽고쓸수있습니다. 값이 1이면 NEON( 있을경우 ) 및 VFP( 있을경우 ) 가활성화되고정상적으로작동합니다. 값이 0이면 NEON 및 VFP가비활성화됩니다. 비활성화되면 FPSID 또는 FPEXC 레지스터를읽거나쓸수있지만다른 NEON 또는 VFP 명령어는정의되지않은명령어로간주됩니다. 비트 [29:0] VFP의특정구현에서사용될수있습니다. 이장에설명된모든 VFP 함수는이러한비트에액세스하지않고사용할수있습니다. 특정구현에서사용되는경우를제외하고이러한비트는변경하면안됩니다. 자세한내용은사용중인 VFP 보조프로세서의기술참조설명서를참조하십시오. 다른비트에영향을주지않고원하는비트만변경하려면읽기 - 수정 - 쓰기프로시저를사용하십시오 (5-86 페이지의 NEON 및 VFP 시스템레지스터의개별비트수정참조 ). 5.12.3 FPSID, 부동소수점시스템 ID 레지스터 FPSID 는읽기전용레지스터입니다. 이레지스터를읽으면프로그램이실행중인 NEON 또는 VFP 아키텍처의구현을찾을수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-85

NEON 및 VFP 프로그래밍 5.12.4 NEON 및 VFP 시스템레지스터의개별비트수정 다른비트에영향을주지않고원하는 NEON 및 VFP 시스템레지스터비트만변경하려면다음예제와같이읽기 - 수정 - 쓰기프로시저를사용합니다. VMRS r10,fpscr ; copy FPSCR into r10 BIC r10,r10,#0x00370000 ; clears STRIDE and LEN ORR r10,r10,#0x00030000 ; sets STRIDE = 1, LEN = 4 VMSR FPSCR,r10 ; copy r10 back into FPSCR 자세한내용은 5-24 페이지의 VMRS 및 VMSR 을참조하십시오. 5-86 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.13 0 으로플러시모드 VFP 의일부구현에서는지원코드를사용하여비정규숫자를처리합니다. 시스템의성능은정규계산을수행할때보다비정규숫자와관련된계산을수행할때훨씬저하됩니다. 0 으로플러시모드는비정규숫자를 0 으로바꿉니다. 이모드는 IEEE 754 산술을준수하지않지만경우에따라성능을상당히향상시킬수있습니다. NEON 및 VFPv3 의 0 으로플러시는부호비트를유지합니다. VFPv2 의 0 으로플러시는 +0 으로플러시합니다. NEON 은항상 0 으로플러시모드를사용합니다. 5.13.1 0 으로플러시모드를사용할경우 다음에모두해당하는경우 0 으로플러시모드를선택해야합니다. 시스템에서 IEEE 754 를준수하지않아도됩니다. 사용중인알고리즘이경우에따라비정규숫자를생성합니다. 시스템에서지원코드를사용하여비정규숫자를처리합니다. 사용중인알고리즘의정확성이비정규숫자의보유여부에의해결정되지않습니다. 사용중인알고리즘이비정규숫자를 0 으로바꾸는작업의결과로자주발생하는예외를생성하지않습니다. 코드부분에따라요구사항이다를경우언제든지 0 으로플러시모드와및표준모드사이에서변경할수있습니다. 레지스터에이미포함되어있는숫자는모드변경의영향을받지않습니다. 5.13.2 0 으로플러시모드의사용에따른영향 특정예외상황에서 0 으로플러시모드는부동소수점연산에다음과같은영향을줍니다 (5-88 페이지의 0 으로플러시모드의영향을받지않는연산참조 ). 비정규숫자가부동소수점연산에대한입력으로사용될경우 0 으로처리됩니다. 소스레지스터는변경되지않습니다. 단정밀도소수점연산의결과가반올림하기전에 -2-126 ~ +2-126 범위에있으면결과가 0 으로대체됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-87

NEON 및 VFP 프로그래밍 배정밀도소수점연산의결과가반올림하기전에 -2-1022 ~ +2-1022 범위에있으면결과가 0 으로대체됩니다. 비정규숫자가피연산자로사용되거나결과가 0 으로플러시될때마다정확하지않은예외가발생합니다. 언더플로예외는 0 으로플러시모드에서발생하지않습니다. 5.13.3 0 으로플러시모드의영향을받지않는연산 다음 NEON 및 VFP 연산은 0 으로플러시모드에서도결과를 0 으로플러시하지않고비정규숫자에서수행할수있습니다. 복사, 절대값및부정 (5-29 페이지의 VMOV, VMVN( 레지스터 ), 5-90 페이지의 VABS, VNEG 및 VSQRT 및 5-52 페이지의 V{Q}ABS 및 V{Q}NEG 참조 ) 복제 (5-35 페이지의 VDUP 참조 ) 스왑 (5-40 페이지의 VSWP 참조 ) 로드및저장 (5-19 페이지의 VLDR 및 VSTR 참조 ) 다중로드또는다중저장 (5-20 페이지의 VLDM, VSTM, VPOP 및 VPUSH 참조 ) 확장레지스터와 ARM 범용레지스터간전송 (5-21 페이지의 VMOV( 두개의 ARM 레지스터와확장레지스터간전송 ), 5-22 페이지의 VMOV(ARM 레지스터와 NEON 스칼라간전송 ) 및 5-23 페이지의 VMOV( 한 ARM 레지스터와단정밀도 VFP 간전송 ) 참조 ) 5-88 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.14 VFP 명령어 이단원에는다음소단원이포함되어있습니다. 5-90페이지의 VABS, VNEG 및 VSQRT 부동소수점절대값, 부정및제곱근 5-91페이지의 VADD, VSUB 및 VDIV 부동소수점더하기, 빼기및나누기 5-92페이지의 VMUL, VMLA, VMLS, VNMUL, VNMLA 및 VNMLS 선택적부정포함부동소수점곱하기및곱하기누산 5-93페이지의 VCMP 부동소수점비교 5-94페이지의 VCVT( 단정밀도와배정밀도간변환 ) 단정밀도와배정밀도간변환 5-95페이지의 VCVT( 부동소수점과정수간변환 ) 부동소수점과정수간변환 5-96페이지의 VCVT( 부동소수점과고정소수점간변환 ) 부동소수점과고정소수점간변환 5-97페이지의 VMOV 부동소수점상수를단정밀도또는배정밀도레지스터에삽입 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-89

NEON 및 VFP 프로그래밍 5.14.1 VABS, VNEG 및 VSQRT 부동소수점절대값, 부정및제곱근 이러한명령어는스칼라, 벡터또는혼합연산일수있습니다 (5-100 페이지의 VFP 벡터및스칼라연산참조 ). 구문 Vop{cond}.F32 Sd, Sm Vop{cond}.F64 Dd, Dm 인수설명 : op ABS, NEG 또는 SQRT 중하나입니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sd, Sm 결과및피연산자의단정밀도레지스터입니다. Dd, Dm 결과및피연산자의배정밀도레지스터입니다. 사용법 VABS 명령어는 Sm 또는 Dm 의내용을가져와서부호비트를지우고결과를 Sd 또는 Dd 에배치합니다. 이명령어는절대값을제공합니다. VNEG 명령어는 Sm 또는 Dm 의내용을가져와서부호비트를변경하고결과를 Sd 또는 Dd 에배치합니다. 이명령어는값의부정을제공합니다. VSQRT 명령어는 Sm 또는 Dm 내용의제곱근을가져와서결과를 Sd 또는 Dd 에배치합니다. VABS 및 VNEG 명령어의경우피연산자가 NaN 이면부호비트는위의각경우에따라결정되지만예외가생성되지않습니다. 부동소수점예외 VABS 및 VNEG 명령어는예외를생성할수없습니다. VSQRT 명령어는잘못된연산또는정확하지않은예외를생성할수있습니다. 5-90 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.14.2 VADD, VSUB 및 VDIV 부동소수점더하기, 빼기및나누기 이러한명령어는스칼라, 벡터또는혼합연산일수있습니다 (5-100 페이지의 VFP 벡터및스칼라연산참조 ). 구문 Vop{cond}.F32 {Sd}, Sn, Sm Vop{cond}.F64 {Dd}, Dn, Dm 인수설명 : op ADD, SUB 또는 DIV 중하나입니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sd, Sn, Sm 결과및피연산자의단정밀도레지스터입니다. Dd, Dn, Dm 결과및피연산자의배정밀도레지스터입니다. 사용법 VADD 명령어는피연산자레지스터의값을더하고결과를대상레지스터에배치합니다. VSUB 명령어는첫번째피연산자레지스터의값에서두번째피연산자레지스터의값을빼고결과를대상레지스터에배치합니다. VDIV 명령어는첫번째피연산자레지스터의값을두번째피연산자레지스터의값으로나누고결과를대상레지스터에배치합니다. 부동소수점예외 VADD 및 VSUB 명령어는잘못된연산, 오버플로또는정확하지않은예외를생성할수있습니다. FDIV 연산은 0 으로나누기, 잘못된연산, 오버플로, 언더플로또는정확하지않은예외를생성할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-91

NEON 및 VFP 프로그래밍 5.14.3 VMUL, VMLA, VMLS, VNMUL, VNMLA 및 VNMLS 선택적부정포함부동소수점곱하기및곱하기누산 이러한명령어는스칼라, 벡터또는혼합연산일수있습니다 (5-100 페이지의 VFP 벡터및스칼라연산참조 ). Syntax TBD optional destinations? V{N}op{cond}.F32 Sd, Sn, Sm V{N}op{cond}.F64 Dd, Dn, Dm 인수설명 : N 최종결과를부정합니다. op MUL, MLA 또는 MLS 중하나입니다. cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sd, Sn, Sm 결과및피연산자의단정밀도레지스터입니다. Dd, Dn, Dm 결과및피연산자의배정밀도레지스터입니다. 사용법 MUL 연산은피연산자레지스터의값을곱하고결과를대상레지스터에배치합니다. MLA 연산은피연산자레지스터의값을곱하고대상레지스터의값을더한다음최종결과를대상레지스터에배치합니다. MLS 연산은피연산자레지스터의값을곱하고대상레지스터의값에서결과를뺀다음최종결과를대상레지스터에배치합니다. 각각의경우 N 옵션이사용되면최종결과는무효화됩니다. 부동소수점예외 이러한명령어는잘못된연산, 오버플로, 언더플로또는정확하지않은예외또는비정규입력예외를생성할수있습니다. 5-92 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.14.4 VCMP 부동소수점비교 VCMP 는항상스칼라입니다. 구문 VCMP{cond}.F32 Sd, Sm VCMP{cond}.F32 Sd, #0 VCMP{cond}.F64 Dd, Dm VCMP{cond}.F64 Dd, #0 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sd, Sm 피연산자가들어있는단정밀도레지스터입니다. Dd, Dm 피연산자가들어있는배정밀도레지스터입니다. 사용법 VCMP 명령어는첫번째피연산자의값에서두번째피연산자레지스터의값 ( 두번째피연산자가 #0 일경우 0) 을빼고 VFP 조건플래그를결과에설정합니다 (5-9 페이지의조건코드참조 ). 부동소수점예외 VCMP 명령어는잘못된연산예외를생성할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-93

NEON 및 VFP 프로그래밍 5.14.5 VCVT( 단정밀도와배정밀도간변환 ) 단정밀도숫자와배정밀도숫자간에변환합니다. VCVT 는항상스칼라입니다. 구문 VCVT{cond}.F64.F32 Dd, Sm VCVT{cond}.F32.F64 Sd, Dm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Dd 결과의배정밀도레지스터입니다. Sm 피연산자가들어있는단정밀도레지스터입니다. Sd 결과의단정밀도레지스터입니다. SD 피연산자가들어있는배정밀도레지스터입니다. 사용법 이러한명령어는 Sm 의단정밀도값을배정밀도로변환하고결과를 Dd 에배치하거나 Dm 의배정밀도값을단정밀도로변환하고결과를 Sd 에배치합니다. 부동소수점예외 이러한명령어는잘못된연산예외를생성할수있습니다. 5-94 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.14.6 VCVT( 부동소수점과정수간변환 ) 부동소수점숫자와정수간에변환합니다. VCVT 는항상스칼라입니다. 구문 VCVT{R}{cond}.type.F64 Sd, Dm VCVT{R}{cond}.type.F32 Sd, Sm VCVT{cond}.F64.type Dd, Sm VCVT{cond}.F32.type Sd, Sm 인수설명 : R FPSCR 에지정된반올림모드를사용하도록합니다. 그렇지않으면 0 으로반올림됩니다. cond 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). type U32( 부호없는 32 비트정수 ) 또는 S32( 부호있는 32 비트정수 ) 중하나일수있습니다. Sd 결과의단정밀도레지스터입니다. Dd 결과의배정밀도레지스터입니다. Sm 피연산자가들어있는단정밀도레지스터입니다. Dm 피연산자가들어있는배정밀도레지스터입니다. 사용법 이명령어의처음두형식은부동소수점을정수로변환합니다. 세번째와네번째형식은정수를부동소수점으로변환합니다. 부동소수점예외 이러한명령어는비정규입력, 잘못된연산또는정확하지않은예외를생성할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-95

NEON 및 VFP 프로그래밍 5.14.7 VCVT( 부동소수점과고정소수점간변환 ) 부동소수점숫자와고정소수점숫자간에변환합니다. VCVT 는항상스칼라입니다. 구문 VCVT{cond}.type.F64 Dd, Dd, #fbits VCVT{cond}.type.F32 Sd, Sd, #fbits VCVT{cond}.F64.type Dd, Dd, #fbits VCVT{cond}.F32.type Sd, Sd, #fbits 인수설명 : cond. 선택적조건코드입니다 (5-9 페이지의조건코드참조 ). type. 다음중하나일수있습니다. S16. 16 비트부호있는고정소수점숫자 U16. 16 비트부호없는고정소수점숫자 S32. 32 비트부호있는고정소수점숫자 U32. 32 비트부호없는고정소수점숫자 Sd. 피연산자및결과의단정밀도레지스터입니다. Dd. 피연산자및결과의배정밀도레지스터입니다. fbits. 고정소수점숫자, 0 ~ 16 범위 (type 이 S16 또는 U16 일경우 ) 또는 1 ~ 32 범위 (type 이 S32 또는 U32 일경우 ) 의부분비트수입니다. 사용법이명령어의처음두형식은부동소수점을고정소수점으로변환합니다. 세번째와네번째형식은고정소수점을부동소수점으로변환합니다. 모든경우에고정소수점숫자는레지스터의최하위 16 비트또는 32 비트에포함됩니다. 부동소수점예외 이러한명령어는비정규입력, 잘못된연산또는정확하지않은예외를생성할수있습니다. 5-96 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.14.8 VMOV 부동소수점상수를단정밀도또는배정밀도레지스터에삽입하거나한레지스터를다른레지스터에복사합니다. 이명령어는항상스칼라입니다. 구문 VMOV{cond}.F32 Sd, #imm VMOV{cond}.F64 Dd, #imm VMOV{cond}.F32 Sd, Sm VMOV{cond}.F64 Dd, Dm 인수설명 : cond 선택적조건코드입니다 (5-9페이지의조건코드참조 ). Sd 단정밀도대상레지스터입니다. Dd 배정밀도대상레지스터입니다. imm 부동소수점상수입니다. Sm 단정밀도소스레지스터입니다. Dm 배정밀도소스레지스터입니다. 상수값 +/-n * 2 -r 로표시할수있는임의의숫자입니다. 여기서 n 은 16 에서 31 사이의정수이고 r 은 0 에서 7 사이의정수입니다. 아키텍처 이명령어는 VFPv3 에서사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-97

NEON 및 VFP 프로그래밍 5.15 VFP 벡터모드 대부분의산술명령어는이러한벡터에서사용할수있고이를통해 SIMD(Single Instruction Multiple Data) 병렬화를사용할수있습니다. 또한부동소수점로드및저장명령어에는여러개의레지스터형식이있고이를통해메모리와의사이에서벡터를전송할수있습니다. VFP 보조프로세서에대한자세한내용은 ARM 아키텍처참조문서를참조하십시오. 참고새코드에서는 VFP 벡터모드를더이상사용할수없습니다. 5.15.1 레지스터뱅크 VFP 레지스터가다음과같이정렬됩니다. 여덟개의단정밀도레지스터중네개의뱅크, s0 ~ s7, s8 ~ s15, s16 ~ s23 및 s24 ~ s31 네개의배정밀도레지스터중여덟개의뱅크, d0 ~ d3, d4 ~ d7, d8 ~ d11, d12 ~ d15, d16 ~ d19, d20 ~ d23, d24 ~ d27 및 d28 ~ d31(vfpv2의경우네개 ) 단정밀도및배정밀도레지스터의혼합 자세한내용은그림 5-9 및그림 5-10 을참조하십시오. s0 s1 s2 s3 s4 s5 s6 s7 s8... s15 s16... s23 s24... s31 d0 d1 d2 d3 d4... d7 d8... d11 d12... d15 Bank 0 Bank 1 Bank 2 Bank 3 그림 5-9 VFPv2 레지스터뱅크 s0 s1 s2 s3 s4 s5 s6 s7 s8 s31...... d0 d1 d2 d3 d4 d15 d16 d27 d28... d31 Bank 0 Bank 1 Bank 3 Bank 4 Bank 6 Bank 7 그림 5-10 VFPv3 레지스터뱅크 5-98 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 5.15.2 벡터 벡터는동일한뱅크에서최대여덟개의단정밀도레지스터나네개의배정밀도레지스터를사용할수있습니다. 벡터가사용하는레지스터수는 FPSCR 의 LEN 비트로제어됩니다 (5-82 페이지의 FPSCR, 부동소수점상태및제어레지스터참조 ). 벡터는모든레지스터에서시작할수있습니다. 벡터가사용하는첫번째레지스터는개별명령어의레지스터필드에지정됩니다. 벡터래핑 벡터가뱅크끝을넘어서확장되면다음과같이동일한뱅크의시작으로래핑됩니다. s5에서시작하는길이가 6인벡터는 {s5, s6, s7, s0, s1, s2} 입니다. s15에서시작하는길이가 3인벡터는 {s15, s8, s9} 입니다. s22에서시작하는길이가 4인벡터는 {s22, s23, s16, s17} 입니다. d7에서시작하는길이 2인벡터는 {d7, d4} 입니다. d10에서시작하는길이가 3인벡터는 {d10, d11, d8} 입니다. 벡터에는둘이상의뱅크에속한레지스터가포함될수없습니다. 벡터스트라이드 벡터는위의예와같이연속된레지스터를차지하거나대체레지스터를차지할수있습니다. 이동작은 FPSCR의 STRIDE 비트로제어됩니다 (5-82페이지의 FPSCR, 부동소수점상태및제어레지스터참조 ). 예를들면다음과같습니다. s1에서시작하며길이와스트라이드가각각 3과 2인벡터는 {s1, s3, s5} 입니다. s6에서시작하며길이와스트라이드가각각 4와 2인벡터는 {s6, s0, s2, s4} 입니다. d1에서시작하며길이와스트라이드가둘다 2인벡터는 {d1, d3} 입니다. 벡터길이제한 한벡터에서동일한레지스터를두번사용할수없습니다. 즉, 벡터래핑을설정하면다음과같은벡터가생성되지않습니다. 길이가 4보다길고스트라이드가 2인단정밀도벡터 길이가 4보다길고스트라이드가 1인배정밀도벡터 길이가 2보다길고스트라이드가 2인배정밀도벡터 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-99

NEON 및 VFP 프로그래밍 5.15.3 VFP 벡터및스칼라연산 VFP 산술명령어를사용하여다음에대해연산을수행할수있습니다. 스칼라 벡터 스칼라와벡터둘다 FPSCR 의 LEN 비트를사용하여벡터길이를제어할수있습니다 (5-82 페이지의 FPSCR, 부동소수점상태및제어레지스터참조 ). LEN 이 1 이면모든연산이스칼라입니다. 벡터에는 FPSCR 의 STRIDE 비트에따라한개또는두개의스트라이드가있을수있습니다. STRIDE 가 1 이면벡터요소는뱅크에서연속된레지스터를차지합니다. STRIDE 가 2 이면벡터요소는뱅크에서대체레지스터를차지합니다. 5-100 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 스칼라, 벡터및혼합연산의제어 LEN 이 1 보다크면산술연산의동작은대상및연산레지스터가있는레지스터뱅크에따라결정됩니다 (5-98 페이지의레지스터뱅크참조 ). 다음과같은형식의명령어가제공됩니다. Op Fd,Fn,Fm Op Fd,Fm 이러한명령어는다음과같이동작합니다. Fd가 s0 ~ s7, d0 ~ d3 또는 d16 ~ d19 레지스터의첫번째나다섯번째뱅크에있으면스칼라연산입니다. Fm이레지스터의첫번째나다섯번째뱅크에있지만 Fd가해당뱅크에없으면혼합연산입니다. Fd 또는 Fm이모두레지스터의첫번째나다섯번째뱅크에없으면벡터연산입니다. 스칼라연산 Op 는 Fm 의값및 Fn 의값 ( 있을경우 ) 에대해작동합니다. 결과는 Fd 에배치됩니다. 벡터연산 Op 는 Fm 에서시작하는벡터의값및 Fn 에서시작하는벡터의값 ( 있을경우 ) 에대해작동합니다. 결과는 Fd 에서시작하는벡터에배치됩니다. 혼합스칼라및벡터연산 단일피연산자명령어의경우 Op 는 Fm 의단일값에대해작동합니다. 결과의 LEN 복사본은 Fd 에서시작하는벡터에배치됩니다. 복수피연산자명령어의경우 Op 는 Fm 의단일값및 Fn 에서시작하는벡터의값에대해작동합니다. 결과는 Fd 에서시작하는벡터에배치됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-101

NEON 및 VFP 프로그래밍 5.15.4 VFP 지시문및벡터표시 이단원에서는 armasm 에대해서만설명합니다. 이러한지시문또는벡터표시는 C 및 C++ 컴파일러의인라인어셈블러에서사용할수없습니다. 새코드에서 VFP 벡터모드를향후사용할수없으며벡터표시는통합어셈블러언어에서지원되지않습니다. 벡터표시를사용하려면이전 VFP 니모닉을사용해야합니다. 자세한내용은 5-102 페이지의 UAL 이전의 VFP 니모닉을참조하십시오. 이전 VFP 니모닉과 UAL VFP 니모닉을함께사용할수있습니다. 코드에서 VFP 벡터길이및스트라이드에대한어설션을만들고어셈블러를통해확인할수있습니다. 다음을참조하십시오. 5-106페이지의 VFPASSERT SCALAR 5-107페이지의 VFPASSERT VECTOR VFPASSERT 지시문을사용할경우이전니모닉으로작성된모든 VFP 데이터처리명령어에서벡터정보를지정해야합니다. 벡터표시는 5-105 페이지의벡터표시에서설명합니다. VFPASSERT 지시문을사용하지않을경우이표시를사용하면안됩니다. UAL 이전의 VFP 니모닉 UAL 니모닉에서.F32 를사용하여단정밀도데이터를지정하는경우 UAL 이전니모닉에서는명령어니모닉에추가된 S 를사용합니다. 예를들어 VABS.32 는 FABSS 였습니다. UAL 니모닉에서.F64 를사용하여배정밀도데이터를지정하는경우 UAL 이전니모닉에서는명령어니모닉에추가된 D 를사용합니다. 예를들어 VCMPE.64 는 FCMPED 였습니다. 표 5-14 에서는 VFP 벡터모드의영향을받은이러한명령어의 UAL 이전니모닉을보여줍니다. 다른모든 VFP 명령어는 LEN 및 STRIDE 의설정에관계없이항상스칼라입니다. 표 5-14 UAL 이전의 VFP 니모닉 UAL 니모닉 VABS VADD VMOV( 즉치값 ) 이에해당하는 UAL 이전니모닉 FABS FADD FCONST a 5-102 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 표 5-14 UAL 이전의 VFP 니모닉 ( 계속 ) UAL 니모닉 VMOV( 레지스터 ) VDIV VMLA VNMLS VMUL VNEG VMLS VNMLA VNMUL VSQRT VSUB 이에해당하는 UAL 이전니모닉 FCPY FDIV FMAC FMSC FMUL FNEG FNMAC FNMSC FNMUL FSQRT FSUB a. VMOV( 즉치값 ) 의즉치값은로드할부동소수점숫자이고, FCONST 의즉치값은로드할부동소수점숫자를생성하는명령어에인코딩된숫자입니다. 자세한내용은 5-103 페이지의 FCONST 의즉치값을참조하십시오. FCONST 의즉치값 표 5-15 에서는 FCONST 를사용하여로드할수있는부동소수점상수를보여줍니다. 뒤에오는 0 은명확성을위해생략되었습니다. FCONST 명령어에입력해야하는즉치값은이진수 abcdefgh 를십진수로표현한것입니다. 다음은이러한이진수에대한설명입니다. a 양수일경우는 0 이고음수일경우는 1 입니다. bcd 열제목에표시됩니다. efgh 행제목에표시됩니다. 또는앞에 0x 가오는 16 진수표현을사용할수도있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-103

NEON 및 VFP 프로그래밍 표 5-15 부동소수점상수값 bcd 000 001 010 011 100 101 110 111 efgh 0000 2.0 4.0 8.0 16.0 0.125 0.25 0.5 1.0 0001 2.125 4.25 8.5 17.0 0.1328125 0.265625 0.53125 1.0625 0010 2.25 4.5 9.0 18.0 0.140625 0.28125 0.5625 1.125 0011 2.375 4.75 9.5 19.0 0.1484375 0.296875 0.59375 1.1875 0100 2.5 5.0 10.0 20.0 0.15625 0.3125 0.625 1.25 0101 2.625 5.25 10.5 21.0 0.1640625 0.328125 0.65625 1.3125 0110 2.75 5.5 11.0 22.0 0.171875 0.34375 0.6875 1.375 0111 2.875 5.75 11.5 23.0 0.1796875 0.359375 0.71875 1.4375 1000 3.0 6.0 12.0 24.0 0.1875 0.375 0.75 1.5 1001 3.125 6.25 12.5 25.0 0.1953125 0.390625 0.78125 1.5625 1010 3.25 6.5 13.0 26.0 0.203125 0.40625 0.8125 1.625 1011 3.375 6.75 13.5 27.0 0.2109375 0.421875 0.84375 1.6875 1100 3.5 7.0 14.0 28.0 0.21875 0.4375 0.875 1.75 1101 3.625 7.25 14.5 29.0 0.2265625 0.453125 0.90625 1.8125 1110 3.75 7.5 15.0 30.0 0.234375 0.46875 0.9375 1.875 1111 3.875 7.75 15.5 31.0 0.2421875 0.484375 0.96875 1.9375 5-104 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 벡터표시 UAL 이전의 VFP 데이터처리명령어에서각괄호를사용하여 VFP 레지스터의벡터를지정합니다. sn 은단정밀도스칼라레지스터 n 입니다. sn <> 은레지스터 n 에서시작하며현재벡터길이와스트라이드를기준으로길이와스트라이드가지정된단정밀도벡터입니다. sn <L> 은레지스터 n 에서시작하며길이와스트라이드가각각 L 과 1 인단정밀도벡터입니다. sn <L:S> 은레지스터 n 에서시작하며길이와스트라이드가각각 L 과 S 인단정밀도벡터입니다. dn 은배정밀도스칼라레지스터 n 입니다. dn <> 은레지스터 n 에서시작하며현재벡터길이와스트라이드를기준으로길이와스트라이드가지정된배정밀도벡터입니다. dn <L> 은레지스터 n 에서시작하며길이와스트라이드가각각 L 과 1 인인배정밀도벡터입니다. dn <L:S> 는레지스터 n 에서시작하며길이와스트라이드가각각 L 과 S 인배정밀도벡터입니다. DN 및 SN 지시문을사용하여정의한이름에이벡터표시를사용할수있습니다 (7-15 페이지의 QN, DN 및 SN 참조 ). DN 및 SN 지시문자체에이벡터표시를사용하면안됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-105

NEON 및 VFP 프로그래밍 VFPASSERT SCALAR VFPASSERT SCALAR 지시문은어셈블러에다음 VFP 명령어가스칼라모드에있음을알립니다. 구문 VFPASSERT SCALAR 사용법 VFPASSERT SCALAR 지시문을사용하여 VFP 모드가 VECTOR 인코드블록의끝을표시할수있습니다. VFPASSERT SCALAR 지시문을변경이발생한명령어바로뒤에배치합니다. 일반적으로 FMXR 명령어가사용되지만 BL 명령어가사용될수있습니다. 함수에서 VFP 가종료시벡터모드에있도록요구할경우 VFPASSERT SCALAR 지시문을마지막명령어바로뒤에배치합니다. 이러한함수는 AAPCS 를준수하지않습니다. 자세한내용은 install_directory\documentation\specifications\... 에있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을참조하십시오. 추가참고 : 5-105페이지의벡터표시 5-107 페이지의 VFPASSERT VECTOR 참고 이지시문은코드를생성하지않으며단지프로그래머에의한어설션일뿐입니다. 어셈블러에서는이러한어설션이서로일치하지않거나 VFP 데이터처리명령어의벡터표시와일치하지않을경우오류메시지를생성합니다. 어셈블러에서는벡터길이가 1 인경우에도 VFPASSERT SCALAR 지시문다음에나오는 VFP 데이터처리명령어의벡터표시에대해오류를발생시킵니다. 예제 VFPASSERT SCALAR ; scalar mode faddd d4, d4, d0 ; okay fadds s4<3>, s0, s8<3> ; ERROR, vector in scalar mode fabss s24<1>, s28<1> ; ERROR, vector in scalar mode ; (even though length==1) 5-106 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

NEON 및 VFP 프로그래밍 VFPASSERT VECTOR The VFPASSERT VECTOR 지시문은어셈블러에다음 VFP 명령어가벡터모드에있음을알립니다. 또한벡터의길이및스트라이드를지정할수있습니다. 구문 VFPASSERT VECTOR[<[n[:s]]>] 인수설명 : n 1 ~ 8 의벡터길이입니다. s 1 ~ 2 의벡터스트라이드입니다. 사용법 VFPASSERT VECTOR 지시문을사용하여 VFP 모드가 VECTOR 인명령어블록의시작을표시하고벡터의길이또는스트라이드에대한변경내용을표시할수있습니다. VFPASSERT VECTOR 지시문을변경이발생한명령어바로뒤에배치합니다. 일반적으로 FMXR 명령어가사용되지만 BL 명령어가사용될수있습니다. 함수에서 VFP 가시작시벡터모드에있도록요구할경우 VFPASSERT VECTOR 지시문을마지막명령어바로뒤에배치합니다. 이러한함수는 AAPCS 를준수하지않습니다. 자세한내용은 install_directory\documentation\specifications\... 에있는 Procedure Call Standard for the ARM Architecture 사양 (aapcs.pdf) 을참조하십시오. 참조 : 5-105페이지의벡터표시 5-106 페이지의 VFPASSERT SCALAR 참고 이지시문은코드를생성하지않으며단지프로그래머에의한어설션일뿐입니다. 어셈블러에서는이러한어설션이서로일치하지않거나 VFP 데이터처리명령어의벡터표시와일치하지않을경우오류메시지를생성합니다. 예제 VMRS r10,fpscr ; UAL mnemonic - could be FMRX instead. BIC r10,r10,#0x00370000 ORR r10,r10,#0x00020000 ; set length = 3, stride = 1 VMSR FPSCR,r10 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 5-107

NEON 및 VFP 프로그래밍 VFPASSERT VECTOR faddd d4, d4, d0 fadds s16<3>, s0, s8<3> fabss s24<1>, s28<1> ; assert vector mode, unspecified length & stride ; ERROR, scalar in vector mode ; okay ; wrong length, but not faulted (unspecified) VMRS r10,fpscr BIC r10,r10,#0x00370000 ORR r10,r10,#0x00030000 ; set length = 4, stride = 1 VMSR FPSCR,r10 VFPASSERT VECTOR<4> ; assert vector mode, length 4, stride 1 fadds s24<4>, s0, s8<4> ; okay fabss s24<2>, s24<2> ; ERROR, wrong length VMRS r10,fpscr BIC r10,r10,#0x00370000 ORR r10,r10,#0x00130000 ; set length = 4, stride = 2 VMSR FPSCR,r10 VFPASSERT VECTOR<4:2> ; assert vector mode, length 4, stride 2 fadds s8<4>, s0, s16<4> ; ERROR, wrong stride fabss s16<4:2>, s28<4:2> ; okay fadds s8<>, s2, s16<> ; okay (s8 and s16 both have ; length 4 and stride 2. ; s2 is scalar.) 5-108 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

6 장 Wireless MMX 기술명령어 이장에서는 ARM 어셈블러인 armasm에서제공하는 Wireless MMX 기술명령어지원에대해설명합니다. 여기에는다음단원이포함되어있습니다. 6-2페이지의소개 6-3 페이지의 Wireless MMX 기술에대한 ARM 지원 6-8 페이지의 Wireless MMX 명령어 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 6-1

Wireless MMX 기술명령어 6.1 소개 Wireless MMX 기술은일부멀티미디어응용프로그램의성능을향상시키는 XScale 프로세서에서사용할수있는 SIMD(Single Instruction Multiple Data) 명령어세트입니다. Wireless MMX 기술은 64 비트레지스터를통해패킹된형식의여러데이터요소에대해작동합니다. Wireless MMX 기술은 ARM 보조프로세서 0 및 1 을사용하여해당명령어세트와데이터유형을지원합니다. Wireless MMX 기술명령어를사용하는소스코드를어셈블하여 PXA270 프로세서에서실행할수있습니다. Wireless MMX 2 기술은 Wireless MMX 기술의업데이트된버전입니다. ARM 어셈블러를사용할때는다음사항에유의해야합니다. Wireless MMX 기술명령어는지원되는프로세서 (armasm --cpu PXA270) 를지정한경우에만어셈블할수있습니다. PXA270 프로세서는 ARM 또는 Thumb 으로작성된코드만지원합니다. 대부분의 Wireless MMX 기술명령어는 ARM 플래그상태에따라조건부로추출할수있습니다. Wireless MMX 기술조건코드는 ARM 조건코드와동일합니다. 이장에서는 RVCT 의 ARM 어셈블러에서제공하는 Wireless MMX 기술지원에대해설명하고 Wireless MMX 기술에대해서는자세히설명하지않습니다. 프로그래머모델과 Wireless MMX 기술명령어세트에대한자세한내용은 Wireless MMX Technology Developer Guide 를참조하십시오. 6-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

Wireless MMX 기술명령어 6.2 Wireless MMX 기술에대한 ARM 지원 이단원에서는어셈블러에서제공하는 Wireless MMX 및 MMX 2 기술지원에대해설명합니다. 이단원에는다음소단원이포함되어있습니다. 레지스터 6-4페이지의 WRN 및 WCN 지시문 6-5 페이지의프레임지시문 6-6 페이지의 Wireless MMX 로드및저장명령어 6-7 페이지의 Wireless MMX 기술및 XScale 명령어 6.2.1 레지스터 Wireless MMX 기술은다음두레지스터유형을지원합니다. 상태및제어레지스터제어레지스터는보조프로세서 1로매핑되고범용레지스터 wcgr0 ~ wcgr3 및 SIMD 플래그를포함합니다. 이러한레지스터에대한자세한내용은표 6-1을참조하십시오. Wireless MMX 기술명령어 TMCR 및 TMRC를사용하면이러한레지스터에서읽기및쓰기를수행할수있습니다. 표 6-1 상태및제어레지스터 유형 Wireless MMX 기술레지스터 CP1 레지스터 보조프로세서 ID wcid c0 제어 wcon c1 포화 SIMD 플래그 wcssf c2 산술 SIMD 플래그 wcasf c3 예약되어있음 - c4 - c7 범용 wcgr0 - wcgr3 c8 - c11 예약되어있음 - c12 - c15 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 6-3

Wireless MMX 기술명령어 SIMD 데이터레지스터데이터레지스터 (wr0 - wr15) 는보조프로세서 0으로매핑되고 16 x 64 비트로패킹된데이터를포함합니다. Wireless MMX 기술의사명령어 TMRRC 및 TMCRR을사용하면이러한레지스터와 ARM 레지스터간에데이터를이동할수있습니다. 레지스터에대한자세한내용은 Wireless MMX Technology Developer Guide 를참조하십시오. Wireless MMX 기술명령어를어셈블할때어셈블러에서는다음과같은레지스터사양을사용합니다. wr0, wcid, wcon 등과같이 Wireless MMX 기술사양과정확히일치하도록대소문자혼용 wr0, wcid, wcon 등과같이대문자만사용 WR0, WCID, WCON 등과같이대문자만사용 어셈블러에서는사용자고유의이름을지정할수있도록 WRN 및 WCN 지시문 (WRN 및 WCN 지시문참조 ) 을지원합니다. 6.2.2 WRN 및 WCN 지시문 다음과같은지시문을사용하여 Wireless MMX 기술을지원할수있습니다. WCN 지정된제어레지스터의이름을다음과같이정의합니다. speed WCN wcgr0 ; defines speed as a symbol for control reg 0 WRN 지정된 SIMD 데이터레지스터의이름을다음과같이정의합니다. rate WRN wr6 ; defines rate as a symbol for data reg 6 한레지스터에여러이름을사용하면안됩니다. 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름이나 6-3 페이지의레지스터에설명된레지스터이름을사용하면안됩니다. 6-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

Wireless MMX 기술명령어 6.2.3 프레임지시문 Wireless MMX 기술레지스터는 FRAME 지시문과함께일반적인방법으로개체파일에디버그정보를추가하는데사용할수있습니다 (7-41 페이지의프레임지시문참조 ). 다음제한사항에유의하십시오. Wireless MMX 기술레지스터 wr0 - wr9 또는 wcgr0 ~ wcgr3 을스택에푸시하려고하면경고가표시됩니다 (7-46 페이지의 FRAME PUSH 참조 ). Wireless MMX 기술레지스터를주소오프셋으로사용할수없습니다 (7-43 페이지의 FRAME ADDRESS 및 7-50 페이지의 FRAME RETURN ADDRESS 참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 6-5

Wireless MMX 기술명령어 6.2.4 Wireless MMX 로드및저장명령어 Wireless MMX 보조프로세서레지스터에서바이트, 하프워드, 워드또는더블워드를로드및저장합니다. 구문 op<type>{cond} wrd, [Rn {, #{-}offset}]{!} op<type>{cond} wrd, [Rn], #{-}offset opw{cond} wrd, label opd{cond} wrd, label opd wrd, [Rn], {-}Rm {, LSL #imm4}]{!} opd wrd, [Rn], {-}Rm {, LSL #imm4} opw wcd, [Rn {, #{-}offset}]{!} opw wcd, [Rn], #{-}offset ; MMX2 only ; MMX2 only 인수설명 : op 다음중하나일수있습니다. WLDR Wireless MMX 레지스터로드 WSTR Wireless MMX 레지스터저장 <type> 다음중하나일수있습니다. B 바이트 H 하프워드 W 워드 D 더블워드 cond 선택적조건코드입니다 (2-21페이지의조건부실행참조 ). wrd 로드또는저장할 Wireless MMX 레지스터입니다. Rn 메모리주소의기반이되는레지스터입니다. offset 즉치오프셋입니다. 오프셋이생략될경우명령어는 0 오프셋명령어입니다.! 선택적접미사입니다.! 기호가있을경우명령어는사전인덱싱된명령어입니다. label 프로그램기준식입니다. 자세한내용은 3-35 페이지의레지스터기준및프로그램기준식을참조하십시오. label 은현재명령어의 +/- 1020 바이트내에있어야합니다. 6-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

Wireless MMX 기술명령어 Rm 오프셋으로사용할값이포함된레지스터입니다. Rm 은 r15 이면안됩니다. imm4 0 ~ 15 범위에서 Rm 을왼쪽으로시프트할비트수를포함합니다. SIMD 레지스터에상수로드 어셈블러에서는또한다음과같은 WLDRW 리터럴로드의사명령어도지원합니다. WLDRW wr0, =0x114 다음사항에유의하십시오. 어셈블러에서바이트및하프워드리터럴을로드할수없습니다. 이경우다운그레이드할수있는오류가생성됩니다. 다운그레이드되면명령어가 WLDRW 로변환되고 32 비트리터럴이생성됩니다. 이것은 32 비트워드를사용한다는점을제외하면바이트리터럴로드와같습니다. 로드할리터럴이 0 이고대상이 SIMD 데이터레지스터이면어셈블러에서명령어를 WZERO 로변환합니다. 8 바이트로정렬되지않은더블워드는예상할수없습니다. 6.2.5 Wireless MMX 기술및 XScale 명령어 Wireless MMX 기술명령어와 XScale 명령어가서로겹치므로충돌을피하기위해어셈블러에다음제한이적용됩니다. 동일한어셈블리에서 XScale 명령어와 Wireless MMX 기술명령어를함께사용할수없습니다. Wireless MMX 기술 TMIA 명령어에 XScale MIA 명령어와겹치는 MIA 니모닉이있습니다. 다음사항에유의하십시오. MIA acc0, Rm, Rs 는 XScale 에서만사용할수있고 Wireless MMX 기술에서사용하면오류가발생합니다. MIA wr0, Rm, Rs 및 TMIA wr0, Rm, Rs 는 Wireless MMX 기술에서사용할수있습니다. TMIA acc0, Rm, Rs 를 XScale 에서사용하면오류가발생합니다. XScale 에는 TMIA 명령어가없습니다. XScale 명령어에대한자세한내용은 4-132 페이지의기타제한을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 6-7

Wireless MMX 기술명령어 6.3 Wireless MMX 명령어 표 6-2 에서는 Wireless MMX 기술명령어세트의목록을보여줍니다. 이표를사용하면 Wireless MMX Technology Developer Guide 에서설명하는개별명령어를찾을수있습니다. 의사명령어 (6-10 페이지의표 6-3) 도참조하십시오. 이단원에서는 Wireless MMX 기술레지스터를 wrn 과 wrd 라고하고 ARM 레지스터를 Rn 과 Rd 라고합니다. 표 6-2 Wireless MMX 기술명령어 니모닉 TANDC TBCST 예제 TANDCB r15 TBCSTB wr15, r1 TEXTRC TEXTRCB r15, #0 TEXTRM TEXTRMUBCS r3, wr7, #7 TINSR TINSRB wr6, r11, #0 TMIA, TMIAPH, TMIAxy TMOVMSK TMIANE wr1, r2, r3 TMIAPH wr4, r5, r6 TMIABB wr4, r5, r6 MIAPHNE wr4, r5, r6 TMOVMSKBNE r14, wr15 TORC TORCB r15 WACC WADD WALIGNI, WALIGNR WACCBGE wr1, wr2 WADDBGE wr1, wr2, wr13 WALIGNI wr7, wr6, wr5,#3 WALIGNR0 wr4, wr8, wr12 WAND, WANDN WAND wr1, wr2, wr3 WANDN wr5, wr5, wr9 WAVG2 WCMPEQ WCMPGT WAVG2B wr3, wr6, wr9 WAVG2BR wr4, wr7, wr10 WCMPEQB wr0, wr4, wr2 WCMPGTUB wr0, wr4, wr2 WLDR WLDRB wr1, [r2, #0] 6-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

Wireless MMX 기술명령어 표 6-2 Wireless MMX 기술명령어 ( 계속 ) 니모닉 예제 WMAC WMACU wr3, wr4, wr5 WMADD WMAX, WMIN WMUL WMADDU wr3, wr4, wr5 WMAXUB wr0, wr4, wr2 WMINSB wr0, wr4, wr2 WMULUL wr4, wr2, wr3 WOR WOR wr3, wr1, wr4 WPACK WPACKHUS wr2, wr7, wr1 WROR WRORH wr3, wr1, wr4 WSAD WSADB wr3, wr5, wr8 WSHUFH WSHUFH wr8, wr15, #17 WSLL, WSRL WSLLH wr3, wr1, wr4 WSRLHG wr3, wr1, wcgr0 WSRA WSRAH wr3, wr1, wr4 WSRAHG wr3, wr1, wcgr0 WSTR WSTRB wr1, [r2, #0] WSTRW wc1, [r2, #0] WSUB WUNPCKEH, WUNPCKEL WUNPCKIH, WUNPCKIL WSUBBGE wr1, wr2, wr13 WUNPCKEHUB wr0, wr4 WUNPCKELSB wr0, wr4 WUNPCKIHB wr0, wr4, wr2 WUNPCKILH wr1, wr5, wr3 WXOR WXOR wr3, wr1, wr4 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 6-9

Wireless MMX 기술명령어 6.3.1 의사명령어 표 6-3 에서는 Wireless MMX 기술의사명령어에대해간략히설명합니다. 이표를사용하면 Wireless MMX Technology Developer Guide 와 4 장 ARM 및 Thumb 명령어에서설명하는개별명령어를찾을수있습니다. 표 6-3 Wireless MMX 기술의사명령어 니모닉간단한설명예제 TMCR 소스레지스터 Rn 의내용을제어레지스터 wcn 으로이동합니다.ARM MCR 보조프로세서명령어로매핑합니다 (4-126 페이지참조 ). TMCR wc1, r10 TMCRR 두개의소스레지스터 RnLo 및 RnHi 의내용을대상레지스터 wrd 로이동합니다. RnLo 또는 RnHi 에 r15 를사용하면안됩니다. ARM MCRR 보조프로세서명령어로매핑합니다 (4-126 페이지참조 ). TMCRR wr4, r5, r6 TMRC 제어레지스터 wcn 의내용을대상레지스터 Rd 로이동합니다. Rd 에 r15 를사용하면안됩니다. ARM MRC 보조프로세서명령어로매핑합니다 (4-128 페이지참조 ). TMRC r1, wc2 TMRRC 소스레지스터 wrn 의내용을두개의대상레지스터 RdLo 및 RdHi 로이동합니다. 대상레지스터에 r15 를사용하면안됩니다. RdLo 및 RdHi 서로다른레지스터여야합니다. 그렇지않으면결과를예상할수없습니다.ARM MRRC 보조프로세서명령어로매핑합니다 (4-128 페이지참조 ). TMRRC r1, r0, wr2 WMOV 소스레지스터 wrn 의내용을대상레지스터 wrd 로이동합니다. 이명령어는 WOR 형식입니다 (6-8 페이지의표 6-2 참조 ). WMOV wr1, wr8 WZERO 대상레지스터 wrd 를 0 으로설정합니다. 이명령어는 WANDN 형식입니다 (6-8 페이지의표 6-2 참조 ). WZERO wr1 6-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

7 장지시문참조 이장에서는 ARM 어셈블러인 armasm에서제공하는지시문에대해설명합니다. 이장은다음단원으로구성되어있습니다. 7-2페이지의지시문의사전순목록 7-4 페이지의심볼정의지시문 7-17 페이지의데이터정의지시문 7-32 페이지의어셈블리제어지시문 7-41 페이지의프레임지시문 7-57 페이지의보고지시문 7-63 페이지의명령어세트및구문선택지시문 7-65 페이지의기타지시문 참고이러한지시문은 ARM C 및 C++ 컴파일러의인라인어셈블러에서사용할수없습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-1

지시문참조 7.1 지시문의사전순목록 표 7-1 에서는지시문의전체목록을보여줍니다. 이표를사용하면이장의나머지부분에서설명하는개별지시문을찾을수있습니다. 표 7-1 지시문위치 지시문페이지지시문페이지지시문페이지 ALIGN 7-66페이지 EXPORT 또는 GLOBAL 7-76페이지 LTORG 7-19페이 지 ARM 및 CODE32 7-63페이지 EXPORTAS 7-78페이지 MACRO 및 MEND 7-33페이 지 AREA 7-69페이지 EXTERN 7-80페이지 MAP 7-20페이 지 ASSERT 7-57페이지 FIELD 7-21페이지 MEND(MACRO 참조 ) 7-33페이 지 CN 7-13페이지 FRAME ADDRESS 7-43페이지 MEXIT 7-36페이 지 CODE16 7-63페이지 FRAME POP 7-45페이지 NOFP 7-84페이 지 COMMON 7-31페이지 FRAME PUSH 7-46페이지 OPT 7-60페이 지 CP 7-14페이지 FRAME REGISTER 7-48페이지 PRESERVE8(REQUIRE8 참 조 ) 7-85 페이지 DATA 7-31페이지 FRAME RESTORE 7-49페이지 PROC(FUNCTION 참조 ) 7-55페이 지 DCB 7-23페이지 FRAME SAVE 7-51페이지 QN 7-15페이 지 DCD 및 DCDU 7-24페이지 FRAME STATE REMEMBER 7-52페이지 RELOC 7-9페이 지 DCDO 7-25페이지 FRAME STATE RESTORE 7-53페이지 REQUIRE 7-84페이 지 DCFD 및 DCFDU 7-26 페이지 FRAME UNWIND ON 또는 OFF 7-54페이지 REQUIRE8 및 PRESERVE8 7-85페이 지 DCFS 및 DCFSU 7-27페이지 FUNCTION 또는 PROC 7-55페이지 RLIST 7-12페이 지 7-2 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 표 7-1 지시문위치 ( 계속 ) 지시문페이지지시문페이지지시문페이지 DCI 7-28페이지 GBLA, GBLL 및 GBLS 7-5페이지 RN 7-11페이 지 DCQ 및 DCQU 7-29페이지 GET 또는 INCLUDE 7-79페이지 ROUT 7-86페이 지 DCW 및 DCWU 7-30페이지 GLOBAL(EXPORT 참조 ) 7-76페이지 SETA, SETL 및 SETS 7-8페이 지 DN 7-15페이지 IF, ELSE, ENDIF 및 ELIF 7-37페이지 SN 7-15페이 지 ELIF 및 ELSE(IF 참조 ) 7-37페이지 IMPORT 7-80페이지 SPACE 7-22페이 지 END 7-73페이지 INCBIN 7-82페이지 SUBT 7-62페이 지 ENDFUNC 또는 ENDP 7-56페이지 INCLUDE(GET 참조 ) 7-79페이지 THUMB 7-63페이 지 ENDIF(IF 참조 ) 7-37페이지 INFO 7-59페이지 THUMBX 7-63페이 지 ENTRY 7-73페이지 KEEP 7-83페이지 TTL 7-62페이 지 EQU 7-74페이지 LCLA, LCLL 및 LCLS 7-7페이지 WHILE 및 WEND 7-40페이 지 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-3

지시문참조 7.2 심볼정의지시문 이단원에서는다음지시문에대해설명합니다. 7-5페이지의 GBLA, GBLL 및 GBLS 전역산술, 논리또는문자열변수를선언합니다. 7-7페이지의 LCLA, LCLL 및 LCLS 논리산술, 논리또는문자열변수를선언합니다. 7-8페이지의 SETA, SETL 및 SETS 산술, 논리또는문자열변수의값을설정합니다. 7-9페이지의 RELOC 개체파일에서 ELF 재배치를인코딩합니다. 7-11페이지의 RN 지정한레지스터의이름을정의합니다. 7-12페이지의 RLIST 범용레지스터세트의이름을정의합니다. 7-13페이지의 CN 보조프로세서레지스터이름을정의합니다. 7-14페이지의 CP 보조프로세서이름을정의합니다. 7-15페이지의 QN, DN 및 SN 배정밀도또는단정밀도 VFP 레지스터이름을정의합니다. 7-4 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.1 GBLA, GBLL 및 GBLS GBLA 지시문은전역산술변수를선언하고해당값을 0 으로초기화합니다. GBLL 지시문은전역논리변수를선언하고해당값을 {FALSE} 로초기화합니다. The GBLS 지시문은전역문자열변수를선언하고해당값을 Null 문자열 ("") 로초기화합니다. 구문 <gblx> variable 인수설명 : <gblx> GBLA, GBLL 또는 GBLS 중하나입니다. variable 변수이름입니다. variable 은소스파일내의심볼간에고유해야합니다. 사용법 이미정의된변수에대해이러한지시문중하나를사용하면위에나온것과동일한값으로다시초기화됩니다. 변수범위는해당변수가들어있는소스파일로제한됩니다. SETA, SETL 또는 SETS 지시문 (7-8 페이지의 SETA, SETL 및 SETS 참조 ) 을사용하여변수값을설정합니다. 지역변수선언에대한자세한내용은 7-7 페이지의 LCLA, LCLL 및 LCLS 를참조하십시오. 전역변수는 -predefine 어셈블러명령행옵션을사용하여설정할수도있습니다. 자세한내용은 3-2 페이지의명령구문을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-5

지시문참조 예제 예제 7-1 에서는 objectsize 변수를선언하고 objectsize 값을 0xFF 로설정한다음나중에 SPACE 지시문에사용합니다. 예제 7-1 GBLA objectsize ; declare the variable name objectsize SETA 0xFF ; set its value.. ; other code. SPACE objectsize ; quote the variable 예제 7-2 에서는 armasm 을호출할때변수를선언하고설정하는방법을보여줍니다. 어셈블리타임에변수값을설정하려는경우이예제코드를사용하십시오. --pd 는 --predefine 의동의어입니다. 예제 7-2 armasm --predefine "objectsize SETA 0xFF" sourcefile -o objectfile 7-6 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.2 LCLA, LCLL 및 LCLS LCLA 지시문은지역산술변수를선언하고해당값을 0 으로초기화합니다. LCLL 지시문은지역논리변수를선언하고해당값을 {FALSE} 로초기화합니다. LCLS 지시문은지역문자열변수를선언하고해당값을 Null 문자열 ("") 로초기화합니다. 구문 <lclx> variable 인수설명 : <lclx> LCLA, LCLL 또는 LCLS 중하나입니다. variable 변수의이름입니다. variable 은자신이포함된매크로내에서고유해야합니다. 사용법 이미정의된변수에대해이러한지시문중하나를사용하면위에나온것과동일한값으로다시초기화됩니다. 변수범위는해당변수가들어있는매크로의특정인스턴스화로제한됩니다 (7-33 페이지의 MACRO 및 MEND 참조 ). SETA, SETL 또는 SETS 지시문 (7-8 페이지의 SETA, SETL 및 SETS 참조 ) 을사용하여변수값을설정합니다. 전역변수선언에대한자세한내용은 7-5 페이지의 GBLA, GBLL 및 GBLS 를참조하십시오. 예제 MACRO ; Declare a macro $label message $a ; Macro prototype line LCLS err ; Declare local string ; variable err. err SETS "error no: " ; Set value of err $label ; code INFO 0, "err":cc::str:$a ; Use string MEND ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-7

지시문참조 7.2.3 SETA, SETL 및 SETS SETA 지시문은지역또는전역산술변수를설정합니다. SETL 지시문은지역또는전역논리변수를설정합니다. SETS 지시문은지역또는전역문자열변수를설정합니다. 구문 variable <setx> expr 인수설명 : <setx> SETA, SETL 또는 SETS 중하나입니다. variable GBLA, GBLL, GBLS, LCLA, LCLL 또는 LCLS 지시문에의해선언된변수이름입니다. expr 다음중하나입니다. SETA의경우, 숫자식 (3-32페이지의숫자식참조 ) 입니다. SETL의경우, 논리식 (3-35페이지의논리식참조 ) 입니다. SETS의경우, 문자열식 (3-31페이지의문자열식참조 ) 입니다. 사용법 이러한지시문중하나를사용하기전에전역또는지역선언지시문을사용하여 variable 을선언해야합니다. 자세한내용은 7-5 페이지의 GBLA, GBLL 및 GBLS 및 7-7 페이지의 LCLA, LCLL 및 LCLS 를참조하십시오. 명령행에서변수이름을미리정의할수도있습니다. 자세한내용은 3-2 페이지의명령구문을참조하십시오. 예제 GBLA VersionNumber VersionNumber SETA 21 GBLL Debug Debug SETL {TRUE} GBLS VersionString VersionString SETS "Version 1.0" 7-8 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.4 RELOC RELOC 지시문은개체파일에서 ELF 재배치를명시적으로인코딩합니다. 구문 RELOC n, symbol RELOC n 인수설명 : n 0 ~ 255 범위에있어야합니다. symbol 임의의프로그램기준레이블일수있습니다. 사용법 RELOC n, symbol 을사용하여 symbol 로레이블이지정된주소와관련한재배치를만듭니다. RELOC 를 ARM 또는 Thumb 명령어바로다음에사용할경우해당명령어에재배치가만들어집니다. RELOC 를 DCB, DCW, DCD 또는다른모든데이터생성지시문바로다음에사용할경우데이터의시작부분에재배치가만들어집니다. 적용할모든가수는명령어나 DCI 또는 DCD 에인코딩해야합니다. 어셈블러가해당위치에서재배치를이미만든경우이재배치는 RELOC 지시문의세부정보로업데이트됩니다. 예를들면다음과같습니다. DCD sym2 ; R_ARM_ABS32 to sym32 RELOC 55 ;... makes it R_ARM_ABS32_NOI 그밖의모든경우에는 RELOC 를사용하면오류가발생합니다. 예를들어이지시문을 LTORG 또는 ALIGN 같이데이터를생성하지않는지시문다음에사용하거나 AREA 에서맨처음사용하면오류가발생합니다. RELOC n 을사용하여익명심볼즉, 익명테이블의심볼 0 과관련한재배치를만듭니다. 위의어셈블러가만든재배치없이 RELOC n 을사용하면익명심볼과관련한재배치가만들어집니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-9

지시문참조 예제 IMPORT impsym LDR r0,[pc,#-8] RELOC 4, impsym DCD 0 RELOC 2, sym DCD 0,1,2,3,4 ; the final word is relocated RELOC 38,sym2 ; R_ARM_TARGET1 7-10 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.5 RN RN 지시문은지정한레지스터의레지스터이름을정의합니다. 구문 name RN expr 인수설명 : name 레지스터에지정할이름입니다. name 은 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름과같을수없습니다. expr 0 에서 15 사이의레지스터번호로평가됩니다. 사용법 RN 을사용하여각레지스터의용도를기억하기쉽도록레지스터에적절한이름을지정합니다. 한레지스터에여러이름을사용하지않도록주의해야합니다. 예제 regname RN 11 ; defines regname for register 11 sqr4 RN r6 ; defines sqr4 for register 6 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-11

지시문참조 7.2.6 RLIST RLIST( 레지스터목록 ) 지시문은범용레지스터세트에이름을지정합니다. 구문 name RLIST {list-of-registers} 인수설명 : name 레지스터세트에지정할이름입니다. name 은 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름과같을수없습니다. list-of-registers 레지스터이름및 / 또는레지스터범위를쉼표로구분하여나열한목록입니다. 레지스터목록은중괄호로묶어야합니다. 사용법 RLIST 를사용하여 LDM 또는 STM 명령어를통해전송할레지스터세트에이름을지정합니다. LDM 및 STM 은해당 LDM 또는 STM 명령어에레지스터가제공되는순서에관계없이항상최하위메모리주소에최하위물리레지스터번호를배치합니다. 사용자고유의심볼레지스터이름을정의한경우레지스터목록이오름차순으로되어있지않으므로명확성이떨어질수있습니다. --diag_warning 1206 어셈블러옵션을사용하여레지스터목록에레지스터가오름차순으로나열되도록합니다. 레지스터가오름차순으로나열되지않으면경고가나타납니다. 예제 Context RLIST {r0-r6,r8,r10-r12,r15} 7-12 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.7 CN CN 지시문은보조프로세서레지스터의이름을정의합니다. 구문 name CN expr 인수설명 : name 보조프로세서레지스터에대해정의할이름입니다. name 은 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름과같을수없습니다. expr 0 에서 15 사이의보조프로세서레지스터번호로평가됩니다. 사용법 CN 을사용하여각레지스터의용도를기억하기쉽도록적절한이름을레지스터에지정합니다. 참고 한레지스터에여러이름을사용하면안됩니다. c0 ~ c15 이름이미리정의되어있습니다. 예제 power CN 6 ; defines power as a symbol for ; coprocessor register 6 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-13

지시문참조 7.2.8 CP CP 지시문은지정한보조프로세서의이름을정의합니다. 보조프로세서번호는 0 ~ 15 범위에있어야합니다. 구문 name CP expr 인수설명 : name 보조프로세서에지정할이름입니다. name 은 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름과같을수없습니다. expr 0 에서 15 사이의보조프로세서번호로평가됩니다. 사용법 CP 를사용하여각보조프로세서의용도를기억하기쉽도록보조프로세서에적절한이름을지정합니다. 참고 한보조프로세서에여러이름을사용하면안됩니다. 보조프로세서 0 ~ 15 에대해 p0 ~ p15 이름이미리정의되어있습니다. 예제 dmu CP 6 ; defines dmu as a symbol for ; coprocessor 6 7-14 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.2.9 QN, DN 및 SN QN 지시문은지정한 128비트확장레지스터의이름을정의합니다. DN 지시문은지정한 64비트확장레지스터의이름을정의합니다. SN 지시문은지정한단정밀도 VFP 레지스터의이름을정의합니다. 구문 name directive expr{.type}{[x]} 인수설명 : 지시문 QN, DN 또는 SN입니다. name 확장레지스터에지정할이름입니다. name 은 3-21 페이지의미리정의된레지스터및보조프로세서이름에나와있는미리정의된이름과같을수없습니다. expr 다음과같을수있습니다. 배정밀도 VFP 레지스터나 NEON 128비트레지스터이면 0 ~ 15 범위의숫자로평가되고, 그렇지않으면 0 ~ 31로평가되는식 미리정의된레지스터이름이나이전지시문에서이미정의된레지스터이름 type [x] 5-12 페이지의 NEON 및 VFP 데이터유형에서설명하는데이터유형중하나입니다. NEON 코드에만사용할수있습니다. [x] 는레지스터에대한스칼라인덱스입니다. type 및 [x] 는확장표시입니다. 자세한내용은 5-15 페이지의확장표시를참조하고, 사용법예제는 7-16 페이지의확장표시예제를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-15

지시문참조 사용법 QN, DN 또는 SN 을사용하여각확장레지스터의용도를기억하기쉽도록확장레지스터에적절한이름을지정합니다. 참고한레지스터에여러이름을사용하면안됩니다. DN 또는 SN 지시문에서는벡터길이를지정할수없습니다 (5-102 페이지의 VFP 지시문및벡터표시참조 ). 예제 energy DN 6 ; defines energy as a symbol for ; VFP double-precision register 6 mass SN 16 ; defines mass as a symbol for ; VFP single-precision register 16 확장표시예제 vara DN d1.u16 varb DN d2.u16 varc DN d3.u16 VADD vara,varb,varc ; VADD.U16 d1,d2,d3 index DN d4.u16[0] result QN q5.i32 VMULL result,vara,index ; VMULL.U16 q5,d1,d3[2] 7-16 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3 데이터정의지시문 이단원에서는메모리를할당하고, 데이터구조체를정의하며, 초기메모리내용을설정하는다음지시문에대해설명합니다. 7-19페이지의 LTORG 리터럴풀의원점을설정합니다. 7-20페이지의 MAP 저장맵의원점을설정합니다. 7-21페이지의 FIELD 저장맵내에서필드를정의합니다. 7-22페이지의 SPACE 0으로채워진메모리블록을할당합니다. 7-23페이지의 DCB 메모리의바이트를할당하고초기내용을지정합니다. 7-24페이지의 DCD 및 DCDU 메모리의워드를할당하고초기내용을지정합니다. 7-25페이지의 DCDO 메모리의워드를할당하고초기내용을정적기준레지스터의오프셋으로지정합니다. 7-26페이지의 DCFD 및 DCFDU 메모리의더블워드를할당하고초기내용을배정밀도부동소수점숫자로지정합니다. 7-27페이지의 DCFS 및 DCFSU 메모리의워드를할당하고초기내용을단정밀도부동소수점숫자로지정합니다. 7-28 페이지의 DCI 메모리의워드를할당하고초기내용을지정합니다. 위치를데이터가아닌코드로표시합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-17

지시문참조 7-29페이지의 DCQ 및 DCQU 메모리의더블워드를할당하고초기내용을배정밀도 64비트정수로지정합니다. 7-30페이지의 DCW 및 DCWU 메모리의하프워드를할당하고초기내용을지정합니다. 7-31페이지의 COMMON 심볼에메모리블록을할당하고정렬을지정합니다. 7-31 페이지의 DATA 코드섹션내의데이터를표시합니다. 역방향호환성을위해서만사용됩니다. 7-18 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.1 LTORG LTORG 지시문은현재리터럴풀을즉시어셈블하도록어셈블러에지시합니다. 구문 LTORG 사용법 어셈블러는코드섹션이끝날때마다현재리터럴풀을어셈블합니다. 코드섹션의끝은그다음섹션의시작부분이나어셈블리끝에있는 AREA 지시문으로확인됩니다. 이러한기본리터럴풀은경우에따라일부 LDR, FLDD 및 FLDS 의사명령어의범위를벗어날수있습니다. 자세한내용은 4-157 페이지의 LDR 의사명령어를참조하십시오. LTORG 를사용하면리터럴풀이범위내에서어셈블되었는지확인할수있습니다. 큰프로그램에는여러개의리터럴풀이필요할수있습니다. 프로세서에서상수를명령어로실행하려고하지않도록하려면무조건분기또는하위루틴반환명령어다음에 LTORG 지시문을배치합니다. 어셈블러는리터럴풀의데이터를워드로정렬합니다. 예제 AREA Example, CODE, READONLY start BL func1 func1 ; function body ; code LDR r1,=0x55555555 ; => LDR R1, [pc, #offset to Literal Pool 1] ; code MOV pc,lr ; end function LTORG ; Literal Pool 1 contains literal &55555555. data SPACE 4200 ; Clears 4200 bytes of memory, ; starting at current location. END ; Default literal pool is empty. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-19

지시문참조 7.3.2 MAP MAP 지시문은저장맵의원점을지정된주소로설정합니다. 저장맵위치카운터인 {VAR} 도이주소로설정됩니다. ^ 기호는 MAP 의동의어입니다. 구문 MAP expr{,base-register} 인수설명 : expr 다음과같은숫자또는프로그램기준식입니다. base-register를지정하지않으면 expr은저장맵이시작하는주소로평가됩니다. 저장맵위치카운터도이주소로설정됩니다. expr이프로그램기준식이면맵에서이식을사용하기전에레이블을정의해야합니다. 어셈블러의첫번째패스중에맵에는레이블의정의가필요합니다. base-register 레지스터를지정합니다. base-register 를지정하지않으면저장맵을시작하는주소는 expr 과 base-register 런타임값의합입니다. 사용법 FIELD 지시문과함께 MAP 지시문을사용하여저장맵을설명합니다. base-register 를지정하여레지스터기준레이블을정의합니다. 기준레지스터는다음 MAP 지시문이나올때까지이후 FIELD 지시문에의해정의된모든레이블에서암시적레지스터가됩니다. 레지스터기준레이블은로드및저장명령어에서사용할수있습니다. 예제를보려면 7-21 페이지의 FIELD 를참조하십시오. MAP 지시문은다중저장소맵을정의하기위해횟수에제한없이원하는대로사용할수있습니다. {VAR} 카운터는첫번째 MAP 지시문이사용되기전에 0 으로설정됩니다. 예제 MAP 0,r9 MAP 0xff,r9 7-20 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.3 FIELD FIELD 지시문은 MAP 지시문을사용하여정의한저장맵내의공간을설명합니다. # 기호는 FIELD 의동의어입니다. 구문 {label} FIELD expr 인수설명 : label 선택적레이블입니다. 지정된경우저장위치카운터인 {VAR} 값이 label 에할당되고저장위치카운터는다시 expr 값만큼증가합니다. expr 저장카운터를증가하는데사용할바이트수로평가되는식입니다. 사용법 저장맵이 base-register 를지정하는 MAP 지시문에의해설정될경우기준레지스터는다음 MAP 지시문이나올때까지이후 FIELD 지시문에의해정의된모든레이블에서암시적레지스터가됩니다. 이러한레지스터기준레이블은로드및저장명령어에인용할수있습니다 (7-20 페이지의 MAP 참조 ). 예제 다음예제에서는 MAP 및 FIELD 지시문을사용하여레지스터기준레이블을정의하는방법을보여줍니다. MAP 0,r9 ; set {VAR} to the address stored in r9 FIELD 4 ; increment {VAR} by 4 bytes Lab FIELD 4 ; set Lab to the address [r9 + 4] ; and then increment {VAR} by 4 bytes LDR r0,lab ; equivalent to LDR r0,[r9,#4] ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-21

지시문참조 7.3.4 SPACE SPACE 지시문은 0 으로채워진메모리블록을예약합니다. % 기호는 SPACE 의동의어입니다. 구문 {label} SPACE expr 인수설명 : expr 예약할 0 으로채워진바이트수로평가됩니다 (3-32 페이지의숫자식참조 ). 사용법 ALIGN 지시문을사용하여 SPACE 지시문다음에나오는코드를정렬합니다. 자세한내용은 7-66 페이지의 ALIGN 을참조하십시오. 추가참고 : 7-23페이지의 DCB 7-24페이지의 DCD 및 DCDU 7-25페이지의 DCDO 7-30페이지의 DCW 및 DCWU 예제 AREA MyData, DATA, READWRITE data1 SPACE 255 ; defines 255 bytes of zeroed store 7-22 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.5 DCB DCB 지시문은메모리의바이트를하나이상할당하고메모리의초기런타임내용을정의합니다. = 기호는 DCB 의동의어입니다. 구문 {label} DCB expr{,expr}... 인수설명 : expr 다음중하나입니다. -128에서 255 사이의정수로평가되는숫자식 (3-32페이지의숫자식참조 ) 입니다. 인용된문자열입니다. 문자열의문자는저장소의연속된바이트로로드됩니다. 사용법 DCB 다음에명령어가나오면 ALIGN 지시문을사용하여이명령어가정렬되도록합니다. 자세한내용은 7-66 페이지의 ALIGN 을참조하십시오. 추가참고 : 7-24페이지의 DCD 및 DCDU 7-29페이지의 DCQ 및 DCQU 7-30페이지의 DCW 및 DCWU 7-22페이지의 SPACE 예제 C 문자열과달리 ARM 어셈블러문자열은 Null 로끝나지않습니다. 다음과같이 DCB 를사용하여 Null 로끝나는 C 문자열을만들수있습니다. C_string DCB "C_string",0 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-23

지시문참조 7.3.6 DCD 및 DCDU DCD 지시문은 4 바이트단위로정렬된메모리의워드를하나이상할당하고메모리의초기런타임내용을정의합니다. & 기호는 DCD 의동의어입니다. 메모리를임의로정렬한다는점을제외하면 DCDU 는이지시문과같습니다. 구문 {label} DCD{U} expr{,expr} 인수설명 : expr 다음중하나입니다. 숫자식 (3-32페이지의숫자식참조 ) 프로그램기준식 사용법 DCD 는필요한경우 4 바이트단위로정렬하기위해첫번째로정의된워드앞에최대 3 바이트의패딩을삽입합니다. 정렬이필요하지않으면 DCDU 를사용합니다. 추가참고 : 7-23페이지의 DCB 7-30페이지의 DCW 및 DCWU 7-29페이지의 DCQ 및 DCQU 7-22페이지의 SPACE 예제 data1 DCD 1,5,20 ; Defines 3 words containing ; decimal values 1, 5, and 20 data2 DCD mem06 + 4 ; Defines 1 word containing 4 + ; the address of the label mem06 AREA MyData, DATA, READWRITE DCB 255 ; Now misaligned... data3 DCDU 1,5,20 ; Defines 3 words containing ; 1, 5 and 20, not word aligned 7-24 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.7 DCDO DCDO 지시문은 4 바이트단위로정렬된메모리의워드를하나이상할당하고메모리의초기런타임내용을정적기준레지스터인 sb(r9) 의오프셋으로정의합니다. 구문 {label} DCDO expr{,expr}... 인수설명 : expr 레지스터기준식이거나레이블입니다. 기준레지스터는 sb 여야합니다. 사용법 DCDO 를사용하여재배치가능한정적기준레지스터기준주소를위한메모리에공간을할당합니다. 예제 IMPORT externsym DCDO externsym ; 32-bit word relocated by offset of ; externsym from base of SB section. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-25

지시문참조 7.3.8 DCFD 및 DCFDU DCFD 지시문은워드로정렬된배정밀도부동소수점숫자를위한메모리를할당하고메모리의초기런타임내용을정의합니다. 배정밀도숫자는 2 워드를차지하며, 산술연산에사용할수있도록워드로정렬되어야합니다. 메모리를임의로정렬한다는점을제외하면 DCDFU 는이지시문과같습니다. 구문 {label} DCFD{U} fpliteral{,fpliteral}... 인수설명 : fpliteral 배정밀도부동소수점리터럴 (3-34 페이지의부동소수점리터럴참조 ) 입니다. 사용법 어셈블러는필요한경우 4 바이트단위로정렬하기위해첫번째로정의된숫자앞에최대 3 바이트의패딩을삽입합니다. 정렬이필요하지않으면 DCFDU 를사용합니다. fpliteral 을내부형식으로변환할때사용되는워드순서는선택한부동소수점아키텍처에의해제어됩니다. --fpu none 옵션을선택하면 DCFD 또는 DCFDU 를사용할수없습니다. 배정밀도숫자의범위는다음과같습니다. 최대 1.79769313486231571e+308 최소 2.22507385850720138e-308 7-27 페이지의 DCFS 및 DCFSU 도참조하십시오. 예제 DCFD DCFDU 1E308,-4E-100 10000,-.1,3.1E26 7-26 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.9 DCFS 및 DCFSU DCFS 지시문은워드로정렬된단정밀도부동소수점숫자를위한메모리를할당하고메모리의초기런타임내용을정의합니다. 단정밀도숫자는 1 워드를차지하며, 산술연산에사용할수있도록워드로정렬되어야합니다. 메모리를임의로정렬한다는점을제외하면 DCDSU 는이지시문과같습니다. 구문 {label} DCFS{U} fpliteral{,fpliteral}... 인수설명 : fpliteral 단정밀도부동소수점리터럴 (3-34 페이지의부동소수점리터럴참조 ) 입니다. 사용법 DCFS 는필요한경우 4 바이트단위로정렬하기위해첫번째로정의된숫자앞에최대 3 바이트의패딩을삽입합니다. 정렬이필요하지않으면 DCFSU 를사용합니다. 단정밀도값의범위는다음과같습니다. 최대 3.40282347e+38 최소 1.17549435e-38 7-26 페이지의 DCFD 및 DCFDU 도참조하십시오. 예제 DCFS DCFSU 1E3,-4E-9 1.0,-.1,3.1E6 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-27

지시문참조 7.3.10 DCI ARM 코드에서 DCI 지시문은 4 바이트단위로정렬된메모리의워드를하나이상할당하고메모리의초기런타임내용을정의합니다. Thumb 코드에서 DCI 지시문은 2 바이트단위로정렬된메모리의하프워드를하나이상할당하고메모리의초기런타임내용을정의합니다. 구문 {label} DCI{.W} expr{,expr} 인수설명 : expr. 숫자식 (3-32 페이지의숫자식참조 ) 입니다..W. 있을경우 Thumb 코드에 4 바이트를삽입해야함을나타냅니다. 사용법 DCI 지시문은위치가데이터대신코드로표시된다는점을제외하고 DCD 또는 DCW 지시문과매우유사합니다. DCI 는사용중인어셈블러버전에서지원하지않는새명령어의매크로를작성할때사용합니다. ARM 코드에서 DCI 는필요한경우 4 바이트단위로정렬하기위해첫번째로정의된워드앞에최대 3 바이트의패딩을삽입합니다. Thumb 코드에서 DCI 는필요한경우 2 바이트단위로정렬하기위해처음 1 바이트의패딩을삽입합니다. DCI 를사용하여명령어스트림에비트패턴을삽입할수있습니다. 예를들어다음과같이사용합니다. DCI 0x46c0 Thumb 연산 MOV r8,r8 을삽입합니다. 7-24 페이지의 DCD 및 DCDU 및 7-30 페이지의 DCW 및 DCWU 도참조하십시오. 예제매크로 MACRO newinst DCI MEND ; this macro translates newinstr Rd,Rm ; to the appropriate machine code $Rd,$Rm 0xe16f0f10 :OR: ($Rd:SHL:12) :OR: $Rm Thumb-2 예제 DCI.W 0xf3af8000 ; inserts 32-bit NOP, 2-byte aligned. 7-28 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.11 DCQ 및 DCQU DCQ 지시문은 4 바이트단위로정렬된메모리의 8 바이트블록을하나이상할당하고메모리의초기런타임내용을정의합니다. 메모리를임의로정렬한다는점을제외하면 DCQU 는이지시문과같습니다. 구문 {label} DCQ{U} {-}literal{,{-}literal}... 인수설명 : literal 64비트숫자리터럴 (3-33페이지의숫자리터럴참조 ) 입니다. 허용되는숫자범위는 0에서 2 64-1 사이입니다. 숫자리터럴에일반적으로허용되는문자외에도 literal의접두사로빼기기호를사용할수도있습니다. 이경우허용되는숫자범위는 -2 63 에서 -1 사이입니다. -n 을지정한결과와 2 64 -n 을지정한결과는같습니다. 사용법 DCQ 는필요한경우 4 바이트단위로정렬하기위해첫번째로정의된 8 바이트블록앞에최대 3 바이트의패딩을삽입합니다. 정렬이필요하지않으면 DCQU 를사용합니다. 추가참고 : 7-23페이지의 DCB 7-24페이지의 DCD 및 DCDU 7-30페이지의 DCW 및 DCWU 7-22페이지의 SPACE 예제 AREA MiscData, DATA, READWRITE data DCQ -225,2_101 ; 2_101 means binary 101. DCQU number+4 ; number must already be defined. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-29

지시문참조 7.3.12 DCW 및 DCWU DCW 지시문은 2 바이트단위로정렬된메모리의하프워드를하나이상할당하고메모리의초기런타임내용을정의합니다. 메모리를임의로정렬한다는점을제외하면 DCWU 는이지시문과같습니다. 구문 {label} DCW{U} expr{,expr}... 인수설명 : expr -32768 에서 6553 사이의정수로평가되는숫자식 (3-32 페이지의숫자식참조 ) 입니다. 사용법 DCW 는필요한경우 2 바이트단위로정렬하기위해첫번째로정의된하프워드앞에 1 바이트의패딩을삽입합니다. 정렬이필요하지않으면 DCWU 를사용합니다. 추가참고 : 7-23페이지의 DCB 7-24페이지의 DCD 및 DCDU 7-29페이지의 DCQ 및 DCQU 7-22페이지의 SPACE 예제 data DCW -225,2*number ; number must already be defined DCWU number+4 7-30 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.3.13 COMMON COMMON 지시문은지정된심볼에정의된크기의메모리블록을할당합니다. 이때메모리가정렬되는방식을지정합니다. 정렬을생략할경우기본정렬은 4 이고, 크기를생략할경우기본크기는 0 입니다. 다른메모리에액세스할때와마찬가지로이메모리에액세스할수있지만개체파일에공간이할당되지는않습니다. 구문 COMMON symbol{,size{,alignment}} 인수설명 : symbol 심볼이름입니다. 심볼이름은대소문자를구분합니다. size 예약할바이트수입니다. alignment 정렬입니다. 사용법 링커에서는링크단계중에필요한공간을 0 으로초기화된메모리로할당합니다. 예제 COMMON xyz,255,4 ; defines 255 bytes of ZI store, word-aligned 7.3.14 DATA DATA 지시문은어셈블러에서무시되므로더이상필요하지않습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-31

지시문참조 7.4 어셈블리제어지시문 이단원에서는조건부어셈블리, 루핑, 포함및매크로를제어하는다음지시문에대해설명합니다. 7-33페이지의 MACRO 및 MEND 7-36페이지의 MEXIT 7-37페이지의 IF, ELSE, ENDIF 및 ELIF 7-40페이지의 WHILE 및 WEND 7.4.1 중첩지시문 다음구조는총깊이 256까지중첩될수있습니다. MACRO 정의 WHILE...WEND 루프 IF...ELSE...ENDIF 조건부구조 INCLUDE 파일포함 제한은중첩방식에관계없이함께있는모든구조에적용됩니다. 각유형의구조는 256 개로제한되지않습니다. 7-32 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.4.2 MACRO 및 MEND MACRO 지시문은매크로정의의시작을표시합니다. 매크로확장은 MEND 지시문에서끝납니다. 자세한내용은 2-51 페이지의매크로사용을참조하십시오. 구문 두개의지시문이매크로를정의하는데사용됩니다. 구문은다음과같습니다. MACRO {$label} macroname{$cond} {$parameter{,$parameter}...} ; code MEND 인수설명 : $label 매크로가호출될때지정한심볼로대체되는매개변수입니다. 심볼은대개레이블입니다. macroname 매크로이름으로, 명령어나지시문으로시작하면안됩니다. $cond $parameter 조건코드를포함하도록설계된특수매개변수입니다. 유효한조건코드가아닌값이허용됩니다. 매크로가호출될때대체되는매개변수입니다. 매개변수의기본값은다음형식을사용하여설정할수있습니다. $parameter="default value" 기본값의내부나한쪽끝에공백이있을경우큰따옴표를사용해야합니다. 사용법 매크로내에서 WHILE...WEND 루프나 IF...ENDIF 조건을시작한경우 MEND 지시문에도달하기전에이들을닫아야합니다. 루프내에서매크로를종료하는등의매크로조기종료를활성화하려면 7-36 페이지의 MEXIT 를참조하십시오. 매크로본문내에서 $label, $parameter 또는 $cond 와같은매개변수는다른변수와같은방식으로사용됩니다 (3-27 페이지의변수의어셈블리타임대체참조 ). 이러한매개변수에는매크로가호출될때마다새값이지정됩니다. 매개변수는다른심볼과구분할수있도록 $ 기호로시작해야하며개수에관계없이원하는대로사용할수있습니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-33

지시문참조 $label 은선택적매개변수로, 매크로가내부레이블을정의하는경우에유용합니다. 이매개변수는매크로의매개변수로처리되며매크로확장내의첫번째명령어를나타내지않을수도있습니다. 매크로는모든레이블의위치를정의합니다. 를인수로사용하여매개변수의기본값을사용합니다. 인수를생략할경우빈문자열이사용됩니다. 여러개의내부레이블을사용하는매크로에서는서로다른접미사를사용하여각내부레이블을기본레이블로정의하는것이좋습니다. 확장에공백이필요하지않을경우매개변수와후행텍스트사이나두매개변수사이에마침표를사용합니다. 선행텍스트와매개변수사이에는마침표를사용하면안됩니다. $cond 매개변수를조건코드에사용할수있습니다. 반대조건코드를찾으려면단항연산자 :REVERSE_CC: 를사용하고조건코드의 4 비트인코딩을찾으려면 :CC_ENCODING: 을사용합니다. 매크로는지역변수 (7-7 페이지의 LCLA, LCLL 및 LCLS 참조 ) 의범위를정의합니다. 매크로는중첩될수있습니다 (7-32 페이지의중첩지시문참조 ). 예제 ; macro definition MACRO $label xmac $p1,$p2 ; code $label.loop1 ; code ; code BGE $label.loop1 $label.loop2 ; code BL $p1 BGT $label.loop2 ; code ADR $p2 ; code MEND ; start macro definition ; end macro definition ; macro invocation abc xmac subr1,de ; invoke macro ; code ; this is what is abcloop1 ; code ; is produced when 7-34 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 abcloop2 ; code ; the xmac macro is BGE abcloop1 ; expanded ; code BL subr1 BGT abcloop2 ; code ADR de ; code 매크로를사용하여어셈블리타임진단만들기 MACRO ; Macro definition diagnose $param1="default" ; This macro produces INFO 0,"$param1" ; assembly-time diagnostics MEND ; (on second assembly pass) ; macro expansion diagnose diagnose "hello" diagnose ; Prints blank line at assembly-time ; Prints "hello" at assembly-time ; Prints "default" at assembly-time 조건부매크로예제 AREA codx, CODE, READONLY ; macro definition MACRO Return$cond [ {ARCHITECTURE} <> "4" BX$cond lr MOV$cond pc,lr ] MEND ; macro invocation fun PROC CMP MOVEQ ReturnEQ MOV Return ENDP END r0,#0 r0,#1 r0,#0 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-35

지시문참조 7.4.3 MEXIT MEXIT 지시문은매크로가끝나기전에매크로정의를종료하는데사용됩니다. 사용법 MEXIT 는매크로를중간에중단해야할때사용합니다. 매크로본문내의닫히지않은 WHILE...WEND 루프나 IF...ENDIF 조건은매크로가종료되기전에어셈블러에의해닫힙니다. 7-33 페이지의 MACRO 및 MEND 도참조하십시오. 예제 MACRO $abc example abc $param1,$param2 ; code WHILE condition1 ; code IF condition2 ; code MEXIT ELSE ; code ENDIF WEND ; code MEND 7-36 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.4.4 IF, ELSE, ENDIF 및 ELIF IF 지시문은명령어및 / 또는지시문시퀀스를어셈블할지여부를결정하는데사용되는조건을추가합니다. [ 기호는 IF 의동의어입니다. ELSE 지시문은선행조건이실패할경우어셈블할명령어및 / 또는지시문시퀀스의시작을표시합니다. 기호는 ELSE 의동의어입니다. ENDIF 지시문은조건부로어셈블할명령어및 / 또는지시문시퀀스의끝을표시합니다. ] 기호는 ENDIF 의동의어입니다. ELIF 지시문은 ELSE IF 와같지만조건을중첩시키거나반복하지않아도되는구조를만듭니다. 자세한내용은 7-38 페이지의 ELIF 사용을참조하십시오. 구문 IF logical-expression... {ELSE...} ENDIF 인수설명 : logical-expression {TRUE} 또는 {FALSE} 로평가되는식입니다. 자세한내용은 3-42페이지의관계연산자를참조하십시오. 사용법 지정한조건에서만어셈블하거나실행할명령어및 / 또는지시문시퀀스에 IF 를 ENDIF 와함께사용하거나, 경우에따라 ELSE 와함께사용합니다. IF...ENDIF 조건은중첩될수있습니다 (7-32 페이지의중첩지시문참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-37

지시문참조 ELIF 사용 다음과같이 ELIF 를사용하지않고도중첩된조건부명령어세트를만들수있습니다. IF logical-expression instructions ELSE IF logical-expression2 instructions ELSE IF logical-expression3 instructions ENDIF ENDIF ENDIF 이러한중첩된구조는최대 256 수준깊이까지중첩될수있습니다. ELIF 를사용하면다음과같이위와동일한구조를더간단하게작성할수있습니다. IF logical-expression instructions ELIF logical-expression2 instructions ELIF logical-expression3 instructions ENDIF 이구조는현재중첩깊이에 IF...ENDIF 쌍을하나만추가합니다. 7-38 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 예제 예제 7-3 에서는 NEWVERSION 이정의된경우첫번째명령어세트를어셈블하고, 그렇지않으면대체세트를어셈블합니다. 예제 7-3 정의중인변수에따른조건부어셈블리 IF :DEF:NEWVERSION ; first set of instructions/directives ELSE ; alternative set of instructions/directives ENDIF armasm 을다음과같이호출하면 NEWVERSION 이정의되어명령어및지시문의첫번째세트가어셈블됩니다. armasm --predefine "NEWVERSION SETL {TRUE}" test.s armasm 을다음과같이호출하면 NEWVERSION 이정의되지않은채로있어명령어및지시문의두번째세트가어셈블됩니다. armasm test.s 예제 7-4 에서는 NEWVERSION 의값이 {TRUE} 이면첫번째명령어세트를어셈블하고, 그렇지않으면대체세트를어셈블합니다. 예제 7-4 변수값에따른조건부어셈블리 IF NEWVERSION = {TRUE} ; first set of instructions/directives ELSE ; alternative set of instructions/directives ENDIF armasm 을다음과같이호출하면명령어및지시문의첫번째세트가어셈블됩니다. armasm --predefine "NEWVERSION SETL {TRUE}" test.s armasm 을다음과같이호출하면명령어및지시문의두번째세트가어셈블됩니다. armasm --predefine "NEWVERSION SETL {FALSE}" test.s ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-39

지시문참조 7.4.5 WHILE 및 WEND WHILE 지시문은반복적으로어셈블할명령어또는지시문시퀀스를시작합니다. 이러한시퀀스는 WEND 지시문으로끝납니다. 구문 WHILE logical-expression code WEND 인수설명 : logical-expression {TRUE} 또는 {FALSE} 로평가될수있는식입니다 (3-35 페이지의논리식참조 ). 사용법 WEND 지시문과함께 WHILE 지시문을사용하여명령어시퀀스를여러번어셈블합니다. 반복횟수는 0 일수있습니다. WHILE...WEND 루프내에서 IF...ENDIF 조건을사용할수있습니다. WHILE...WEND 루프는중첩될수있습니다 (7-32 페이지의중첩지시문참조 ). 예제 count SETA 1 ; you are not restricted to WHILE count <= 4 ; such simple conditions count SETA count+1 ; In this case, ; code ; this code will be ; code ; repeated four times WEND 7-40 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5 프레임지시문 이단원에서는다음지시문에대해설명합니다. 7-43페이지의 FRAME ADDRESS 7-45페이지의 FRAME POP 7-46페이지의 FRAME PUSH 7-48페이지의 FRAME REGISTER 7-49페이지의 FRAME RESTORE 7-50페이지의 FRAME RETURN ADDRESS 7-51페이지의 FRAME SAVE 7-52페이지의 FRAME STATE REMEMBER 7-53페이지의 FRAME STATE RESTORE 7-54페이지의 FRAME UNWIND ON 7-54페이지의 FRAME UNWIND OFF 7-55페이지의 FUNCTION 또는 PROC 7-56페이지의 ENDFUNC 또는 ENDP 다음은이러한지시문의올바른사용방법입니다. armlink --callgraph 옵션을설정하여어셈블러함수의스택사용량을계산합니다. 다음규칙이스택사용량을확인하는데사용됩니다. 함수가 PROC 또는 ENDP로표시되지않을경우스택사용량을알수없습니다. 함수가 FRAME PUSH 또는 FRAME POP 없이 PROC 또는 ENDP로만표시될경우스택사용량은 0으로간주됩니다. 즉, FRAME PUSH 0 또는 FRAME POP 0을수동으로추가하지않아도됩니다. 함수가 PROC 또는 ENDP 및 FRAME PUSH n 또는 FRAME POP n으로표시될경우스택사용량은 n바이트로간주됩니다. 함수생성시특히, 기존코드를수정할때오류가발생하지않도록도와줍니다. 어셈블러에서함수를생성할때오류가발생하면경고메시지를표시하도록합니다. 디버그하는동안함수호출을백트레이싱할수있도록합니다. 디버거에서어셈블러함수를프로파일링할수있도록합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-41

지시문참조 어셈블러함수를프로파일링해야하지만프레임설명지시문을다른목적으로사용하지않으려는경우 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문을사용해야합니다. 다른 FRAME 지시문을생략할수있습니다. 프로파일링할함수에대해서만 FUNCTION 및 ENDFUNC 지시문을사용해야합니다. DWARF 에서표준프레임주소는중단된함수의호출프레임이있는위치를지정하는스택상의주소를나타냅니다. 7-42 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.1 FRAME ADDRESS FRAME ADDRESS 지시문은이후명령어의표준프레임주소를계산하는방법을설명합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME ADDRESS reg[,offset] 인수설명 : reg offset 표준프레임주소의기반이될레지스터로, 함수에서별도의프레임포인터를사용하지않을경우 sp 입니다. reg 를기준으로한표준프레임주소의오프셋으로, offset 이 0 일경우생략할수있습니다. 사용법 코드에서표준프레임주소의기반이되는레지스터를변경하거나레지스터를기준으로한표준프레임주소의오프셋을변경할경우 FRAME ADDRESS 를사용합니다. FRAME ADDRESS 는표준프레임주소의계산을변경하는명령어바로다음에사용해야합니다. 참고코드에서단일명령어를사용하여레지스터를저장하고스택포인터를변경하는경우 FRAME ADDRESS 와 FRAME SAVE 를둘다사용하는대신 FRAME PUSH 를사용할수있습니다 (7-46 페이지의 FRAME PUSH 참조 ). 코드에서단일명령어를사용하여레지스터를로드하고스택포인터를변경하는경우 FRAME ADDRESS 와 FRAME RESTORE 를둘다사용하는대신 FRAME POP 을사용할수있습니다 (7-45 페이지의 FRAME POP 참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-43

지시문참조 예제 _fn FUNCTION ; CFA (Canonical Frame Address) is value ; of sp on entry to function PUSH {r4,fp,ip,lr,pc} FRAME PUSH {r4,fp,ip,lr,pc} SUB sp,sp,#4 ; CFA offset now changed FRAME ADDRESS sp,24 ; - so we correct it ADD fp,sp,#20 FRAME ADDRESS fp,4 ; New base register ; code using fp to base call-frame on, instead of sp 7-44 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.2 FRAME POP FRAME POP 지시문을사용하여호출수신자가레지스터를다시로드할때어셈블러에이를알립니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 함수의마지막명령어뒤에서는이렇게하지않아도됩니다. 구문 FRAME POP의대체구문에는다음과같은세가지가있습니다. FRAME POP {reglist} FRAME POP {reglist},n FRAME POP n 인수설명 : reglist 함수엔트리포인트에있는값으로복원할레지스터목록입니다. 이목록에는최소한하나이상의레지스터가있어야합니다. n 스택포인터가이동하는바이트수입니다. 사용법 FRAME POP 은 FRAME ADDRESS 지시문과 FRAME RESTORE 지시문을모두사용하는것과같습니다. 이지시문은단일명령어가레지스터를로드하고스택포인터를변경할때사용할수있습니다. FRAME POP 은해당지시문이참조하는명령어바로다음에사용해야합니다. n 이지정되지않거나 0 일경우어셈블러는 {reglist} 를기준으로표준프레임주소의새오프셋을계산합니다. 어셈블러는다음을가정합니다. 팝된각 ARM 레지스터가스택에서 4 바이트를차지합니다. 팝된각 VFP 단정밀도레지스터가스택에서 4 바이트외에도각목록을위한 4 바이트워드를추가로차지합니다. 팝된각 VFP 배정밀도레지스터가스택에서 8 바이트외에도각목록을위한 4 바이트워드를추가로차지합니다. 7-43 페이지의 FRAME ADDRESS 및 7-49 페이지의 FRAME RESTORE 를참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-45

지시문참조 7.5.3 FRAME PUSH FRAME PUSH 지시문을사용하여주로함수엔트리포인트에서호출수신자가레지스터를저장할때어셈블러에이를알립니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME PUSH 의대체구문에는다음과같은두가지가있습니다. FRAME PUSH {reglist} FRAME PUSH {reglist},n FRAME PUSH n 인수설명 : reglist 표준프레임주소아래에연속적으로저장된레지스터목록입니다. 이목록에는최소한하나이상의레지스터가있어야합니다. n 스택포인터가이동하는바이트수입니다. 사용법 FRAME PUSH 는 FRAME ADDRESS 지시문과 FRAME SAVE 지시문을모두사용하는것과같습니다. 이지시문은단일명령어가레지스터를저장하고스택포인터를변경할때사용할수있습니다. FRAME PUSH 는해당지시문이참조하는명령어바로다음에사용해야합니다. n 이지정되지않거나 0 일경우어셈블러는 {reglist} 를기준으로표준프레임주소의새오프셋을계산합니다. 어셈블러는다음을가정합니다. 푸시된각 ARM 레지스터가스택의 4 바이트를차지합니다. 푸시된각 VFP 단정밀도레지스터가스택에서 4 바이트외에도각목록을위한 4 바이트워드를추가로차지합니다. 팝된각 VFP 배정밀도레지스터가스택에서 8 바이트외에도각목록을위한 4 바이트워드를추가로차지합니다. 7-43 페이지의 FRAME ADDRESS 및 7-51 페이지의 FRAME SAVE 를참조하십시오. 7-46 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 예제 p PROC ; Canonical frame address is sp + 0 EXPORT p PUSH {r4-r6,lr} ; sp has moved relative to the canonical frame address, ; and registers r4, r5, r6 and lr are now on the stack FRAME PUSH {r4-r6,lr} ; Equivalent to: ; FRAME ADDRESS sp,16 ; 16 bytes in {r4-r6,lr} ; FRAME SAVE {r4-r6,lr},-16 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-47

지시문참조 7.5.4 FRAME REGISTER FRAME REGISTER 지시문을사용하여레지스터에들어있는함수인수의위치에대한레코드를유지관리합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME REGISTER reg1,reg2 인수설명 : reg1 함수엔트리포인트에있는인수가포함된레지스터입니다. reg2 값이저장되는레지스터입니다. 사용법 레지스터를사용하여함수엔트리포인트에있는다른레지스터에포함된인수를저장할때 FRAME REGISTER 지시문을사용합니다. 7-48 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.5 FRAME RESTORE FRAME RESTORE 지시문을사용하여지정한레지스터의내용이함수엔트리포인트에있는값으로복원되었음을어셈블러에알립니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME RESTORE {reglist} 인수설명 : reglist 해당내용이복원된레지스터목록입니다. 이목록에는최소한하나이상의레지스터가있어야합니다. 사용법 호출수신자가스택에서레지스터를다시로드한후바로 FRAME RESTORE 를사용합니다. 함수의마지막명령어뒤에서는이렇게하지않아도됩니다. reglist 에는정수레지스터나부동소수점레지스터중하나만포함될수있으며둘다포함될수는없습니다. 참고코드에서단일명령어를사용하여레지스터를로드하고스택포인터를변경하는경우 FRAME RESTORE 와 FRAME ADDRESS 를둘다사용하는대신 FRAME POP 을사용할수있습니다 (7-45 페이지의 FRAME POP 참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-49

지시문참조 7.5.6 FRAME RETURN ADDRESS FRAME RETURN ADDRESS 지시문은복귀주소로 r14 이외의레지스터를사용하는함수를제공합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 참고 복귀주소로 r14 이외의레지스터를사용하는함수는 AAPCS 와호환되지않습니다. 이러한함수는내보내면안됩니다. 구문 FRAME RETURN ADDRESS reg 인수설명 : reg 복귀주소에사용되는레지스터입니다. 사용법 FRAME RETURN ADDRESS 지시문을복귀주소로 r14 를사용하지않는모든함수에사용합니다. 이렇게하지않으면디버거가함수를백트레이싱할수없습니다. 함수를시작하는 FUNCTION 또는 PROC 지시문바로다음에 FRAME RETURN ADDRESS 를추가합니다. 7-50 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.7 FRAME SAVE FRAME SAVE 지시문은표준프레임주소에상대적인저장된레지스터내용의위치를설명합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME SAVE {reglist}, offset 인수설명 : reglist 표준프레임주소의 offset 에서시작하여연속적으로저장된레지스터목록입니다. 이목록에는최소한하나이상의레지스터가있어야합니다. 사용법 호출수신자가스택에서레지스터를다시로드한후바로 FRAME RESTORE 를사용합니다. reglist 에는백트레이싱할필요가없는레지스터가포함될수있습니다. 어셈블러는 DWARF 호출프레임정보에기록해야하는레지스터를확인합니다. 참고코드에서단일명령어를사용하여레지스터를저장하고스택포인터를변경하는경우 FRAME SAVE 및 FRAME ADDRESS 를둘다사용하는대신 FRAME PUSH 를사용할수있습니다 (7-46 페이지의 FRAME PUSH 참조 ). ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-51

지시문참조 7.5.8 FRAME STATE REMEMBER FRAME STATE REMEMBER 지시문은표준프레임주소와저장된레지스터값의위치를계산하는방법에대한현재정보를저장합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME STATE REMEMBER 사용법 인라인종료시퀀스중에표준프레임주소와저장된레지스터값의위치를계산하는방법에대한정보가변경될수있습니다. 종료시퀀스후에는이전과동일한정보를사용하여다른분기가계속될수있습니다. FRAME STATE REMEMBER 를사용하면이정보를저장할수있고 FRAME STATE RESTORE 를사용하면이정보를복원할수있습니다. 이러한지시문은중첩될수있습니다. 각 FRAME STATE RESTORE 지시문에는대응하는 FRAME STATE REMEMBER 지시문이있어야합니다. 다음을참조하십시오. 7-53페이지의 FRAME STATE RESTORE 7-55페이지의 FUNCTION 또는 PROC 예제 exitb ; function code FRAME STATE REMEMBER ; save frame state before in-line exit sequence POP {r4-r6,pc} ; do not have to FRAME POP here, as control has ; transferred out of the function FRAME STATE RESTORE ; end of exit sequence, so restore state ; code for exitb POP {r4-r6,pc} ENDP 7-52 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.9 FRAME STATE RESTORE FRAME STATE RESTORE 지시문은표준프레임주소와저장된레지스터값의위치를계산하는방법에대한정보를복원합니다. 이지시문은 FUNCTION 및 ENDFUNC 또는 PROC 및 ENDP 지시문이있는함수내에서만사용할수있습니다. 구문 FRAME STATE RESTORE 사용법참조 : 7-52페이지의 FRAME STATE REMEMBER 7-55페이지의 FUNCTION 또는 PROC ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-53

지시문참조 7.5.10 FRAME UNWIND ON FRAME UNWIND ON 지시문은현재함수를포함한이후의모든함수에대한해제테이블을생성하도록어셈블러에지시합니다. 구문 FRAME UNWIND ON 사용법 이지시문은함수외부에서사용할수있습니다. 이경우어셈블러는 FRAME UNWIND OFF 지시문에도달할때까지이후의모든함수에대한해제테이블을생성합니다. 3-18 페이지의예외테이블생성제어도참조하십시오. 7.5.11 FRAME UNWIND OFF FRAME UNWIND OFF 지시문은현재함수와이후의모든함수에대한해제없음테이블을생성하도록어셈블러에지시합니다. 구문 FRAME UNWIND OFF 사용법 이지시문은함수외부에서사용할수있습니다. 이경우어셈블러는 FRAME UNWIND ON 지시문에도달할때까지이후의모든함수에대한해제없음테이블을생성합니다. 3-18 페이지의예외테이블생성제어도참조하십시오. 7-54 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.5.12 FUNCTION 또는 PROC FUNCTION 지시문은함수의시작을표시합니다. PROC 는 FUNCTION 의동의어입니다. 구문 label FUNCTION [{reglist1} [, {reglist2}]] 인수설명 : reglist1 호출수신자가저장하는 ARM 레지스터의선택적목록입니다. reglist1 이없을경우디버거는레지스터사용을검사할때 AAPCS 가사용중이라고간주합니다. reglist2 호출수신자가저장하는 VFP 레지스터의선택적목록입니다. 사용법 FUNCTION 을사용하여함수의시작을표시합니다. 어셈블러는 FUNCTION 을사용하여 ELF 에대한 DWARF 호출프레임정보를생성할때함수의시작을확인합니다. FUNCTION 은표준프레임주소를 r13(sp) 으로설정하고프레임상태스택을빈상태로설정합니다. 각 FUNCTION 지시문에는대응하는 ENDFUNC 지시문이있어야합니다. FUNCTION/ENDFUNC 쌍은중첩될수없으며, PROC 또는 ENDP 지시문을포함할수없습니다. 사용자고유의디버거를사용하는경우선택적 reglist 매개변수를사용하여대체프로시저호출표준에대해디버거에알릴수있습니다. 일부디버거에서는이기능이지원하지않습니다. 자세한내용은디버거설명서를참조하십시오. 7-43 페이지의 FRAME ADDRESS ~ 7-53 페이지의 FRAME STATE RESTORE 도참조하십시오. 참고 FUNCTION은자동으로워드단위 (Thumb의경우하프워드단위 ) 로정렬되도록하지않습니다. 정렬이필요하면 ALIGN을사용합니다. 그렇지않으면호출프레임이함수의시작을가리키지않을수있습니다. 자세한내용은 7-66페이지의 ALIGN을참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-55

지시문참조 예제 ALIGN ; ensures alignment dadd FUNCTION ; without the ALIGN directive, this might not be word-aligned EXPORT dadd PUSH {r4-r6,lr} ; this line automatically word-aligned FRAME PUSH {r4-r6,lr} ; subroutine body POP {r4-r6,pc} ENDFUNC func6 PROC {r4-r8,r12},{d1-d3} ; non-aapcs-conforming function... ENDP 7.5.13 ENDFUNC 또는 ENDP ENDFUNC 지시문은 AAPCS 준수함수의끝을표시합니다 (7-55 페이지의 FUNCTION 또는 PROC 참조 ). ENDP 는 ENDFUNC 의동의어입니다. 7-56 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.6 보고지시문 이단원에서는다음지시문에대해설명합니다. ASSERT 어셈블리중에어설션이실패할경우오류메시지를생성합니다. 7-59페이지의 INFO 어셈블리중에진단정보를생성합니다. 7-60페이지의 OPT 목록옵션을설정합니다. 7-62페이지의 TTL 및 SUBT 목록에제목과부제목을삽입합니다. 7.6.1 ASSERT ASSERT 지시문은지정한어설션이실패할경우어셈블리의두번째패스중에오류메시지를생성합니다. 구문 ASSERT logical-expression 인수설명 : logical-expression {TRUE} 또는 {FALSE} 로평가될수있는어설션입니다. 사용법 ASSERT를사용하여어셈블리중에필요한모든조건이충족되도록합니다. 어설션이실패할경우오류메시지가생성되고어셈블리가실패합니다. 7-59페이지의 INFO도참조하십시오. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-57

지시문참조 예제 ASSERT label1 <= label2 ; Tests if the address ; represented by label1 ; is <= the address ; represented by label2. 7-58 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.6.2 INFO INFO 지시문은어셈블리패스에서진단정보를생성할수있도록합니다.! 기호는간단한진단정보를생성한다는점을제외하고 INFO 와매우유사합니다. 구문 INFO numeric-expression, string-expression 인수설명 : numeric-expression string-expression 어셈블리중에평가되는숫자식입니다. 이식이 0으로평가되면다음과같이됩니다. 첫번째패스중에아무런작업도수행되지않습니다. 두번째패스중에 string-expression이인쇄됩니다. 이식이 0으로평가되지않으면 string-expression이오류메시지로인쇄되고어셈블리가실패합니다. 문자열로평가되는식입니다. 사용법 INFO 는사용자지정오류메시지를생성하는유연한방법을제공합니다. 숫자및문자열식에대한자세한내용은 3-32 페이지의숫자식및 3-31 페이지의문자열식을참조하십시오. 7-57 페이지의 ASSERT 도참조하십시오. 예제 INFO 0, "Version 1.0" IF endofdata <= label1 INFO 4, "Data overrun at label1" ENDIF ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-59

지시문참조 7.6.3 OPT OPT 지시문은소스코드내에서목록옵션을설정합니다. 구문 OPT n 인수설명 : n OPT 지시문설정값입니다. 표 7-2 에서는유효한설정값을보여줍니다. 표 7-2 OPT 지시문설정값 OPT n 효과 1 일반목록을설정합니다. 2 일반목록을해제합니다. 4 페이지넘김. 폼피드를실행하고새페이지를시작합니다. 8 행번호카운터를 0으로리셋합니다. 16 SET, GBL 및 LCL 지시문의목록을설정합니다. 32 SET, GBL 및 LCL 지시문의목록을해제합니다. 64 매크로확장목록을설정합니다. 128 매크로확장목록을해제합니다. 256 매크로호출목록을설정합니다. 512 매크로호출목록을해제합니다. 1024 첫번째패스목록을설정합니다. 2048 첫번째패스목록을해제합니다. 4096 조건부지시문의목록을설정합니다. 8192 조건부지시문의목록을해제합니다. 16384 MEND 지시문의목록을설정합니다. 32768 MEND 지시문의목록을해제합니다. 7-60 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 사용법 --list= 어셈블러옵션을지정하여목록을설정합니다. 기본적으로 --list= 옵션은변수선언, 매크로확장, 호출조건부지시문및 MEND 지시문이포함된일반목록을생성합니다. 이목록은두번째패스에서만생성됩니다. OPT 지시문을사용하면소스코드내에서기본목록옵션을수정할수있습니다. --list= 옵션에대한자세한내용은 3-14 페이지의파일에출력나열을참조하십시오. OPT 를사용하여코드목록의형식을지정할수있습니다. 예를들어함수와섹션앞에새페이지를지정할수있습니다. 예제 start func1 AREA ; code ; code BL ; code OPT 4 ; code Example, CODE, READONLY func1 ; places a page break before func1 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-61

지시문참조 7.6.4 TTL 및 SUBT TTL 지시문은목록파일에있는각페이지의시작부분에제목을삽입합니다. 제목은 TTL 지시문이나타날때까지각페이지에인쇄됩니다. SUBT 지시문은목록파일의각페이지에부제목을삽입합니다. 부제목은 SUBT 지시문이나타날때까지각페이지에인쇄됩니다. 구문 TTL title SUBT subtitle 인수설명 : title 제목입니다. subtitle 부제목입니다. 사용법 TTL 지시문을사용하여목록파일에있는각페이지의맨위에제목을삽입합니다. 첫페이지에제목을표시하려면 TTL 지시문이소스파일의첫행에있어야합니다. 추가 TTL 지시문을사용하여제목을변경합니다. 각새 TTL 지시문은다음페이지의맨위에서부터적용됩니다. SUBT 를사용하여목록파일에있는각페이지의맨위에부제목을삽입합니다. 부제목은제목행아래에표시됩니다. 첫페이지에부제목을표시하려면 SUBT 지시문이소스파일의첫행에있어야합니다. 추가 SUBT 지시문을사용하여부제목을변경합니다. 각새 SUBT 지시문은다음페이지의맨위에서부터적용됩니다. 예제 TTL First Title ; places a title on the first ; and subsequent pages of a ; listing file. SUBT First Subtitle ; places a subtitle on the ; second and subsequent pages ; of a listing file. 7-62 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.7 명령어세트및구문선택지시문 이단원에서는다음지시문에대해설명합니다. 7-63페이지의 ARM, THUMB, THUMBX, CODE16 및 CODE32 7.7.1 ARM, THUMB, THUMBX, CODE16 및 CODE32 ARM 지시문과 CODE32 지시문은같습니다. 이러한지시문은이후의명령어를 ARM 명령어로해석하도록어셈블러에지시하고, 필요한경우다음워드경계에맞춰정렬하도록최대 3 바이트의패딩을삽입하기도합니다. 이모드에서는어셈블러가최신어셈블리언어와이전버전의어셈블리언어를모두지원합니다. 구문 ARM THUMB THUMBX CODE16 CODE32 사용법 다양한명령어세트를사용하는코드가포함된파일에서다음과같이합니다. ARM 지시문이 ARM 코드앞에와야합니다. CODE32는 ARM의동의어입니다. THUMB 지시문이새구문으로작성된 Thumb 코드앞에와야합니다. THUMBX 지시문이새구문으로작성된 Thumb-2EE 코드앞에와야합니다. CODE16 지시문이이전 Thumb 구문으로작성된 Thumb 코드앞에와야합니다. 이러한명령어는상태를변경하는명령어로어셈블되지않습니다. 다만 ARM, Thumb-2, Thumb-2EE 또는 Thumb 명령어를적절하게어셈블하도록어셈블러에지시하고, 필요한경우패딩을삽입합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-63

지시문참조 예제 이예제에서는 ARM 및 CODE16 을사용하여 ARM 명령어에서 16 비트 Thumb 명령어로분기하는방법을보여줍니다. start AREA ToThumb, CODE, READONLY ENTRY ARM ; Name this block of code ; Mark first instruction to execute ; Subsequent instructions are ARM ADR r0, into_thumb + 1 ; Processor starts in ARM state BX r0 ; Inline switch to Thumb state THUMB ; Subsequent instructions are Thumb into_thumb MOVS r0, #10 ; New-style Thumb instructions 7-64 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8 기타지시문 이단원에서는다음지시문에대해설명합니다. 7-66페이지의 ALIGN 7-69페이지의 AREA 7-73페이지의 END 7-73페이지의 ENTRY 7-74페이지의 EQU 7-76페이지의 EXPORT 또는 GLOBAL 7-78페이지의 EXPORTAS 7-79페이지의 GET 또는 INCLUDE 7-80페이지의 IMPORT 및 EXTERN 7-82페이지의 INCBIN 7-83페이지의 KEEP 7-84페이지의 NOFP 7-84페이지의 REQUIRE 7-85페이지의 REQUIRE8 및 PRESERVE8 7-86페이지의 ROUT ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-65

지시문참조 7.8.1 ALIGN ALIGN 지시문은 NOP 명령어나 0 으로패딩하여지정한경계에맞춰현재위치를정렬합니다. 구문 ALIGN {expr{,offset{,pad {, padsize }}}} 인수설명 : expr 2 0 에서 2 31 사이의 2의제곱으로평가되는숫자식입니다. offset 임의의숫자식일수있습니다. pad 임의의숫자식일수있습니다. padsize 1, 2 또는 4일수있습니다. 연산 현재위치는아래형식의다음주소에맞춰정렬됩니다. offset + n * expr expr 을지정하지않으면 ALIGN 이현재위치를다음워드 (4 바이트 ) 경계에설정합니다. 이전위치와새현재위치사이의사용하지않는바이트는다음으로채워집니다. pad 를지정한경우, pad 의복사본다음조건을모두만족하는경우, NOP 명령어 pad를지정하지않은경우 ALIGN 지시문이 ARM 또는 Thumb 명령어뒤에나오는경우 현재섹션에서 CODEALIGN 특성이 AREA 지시문에설정되어있는경우 그외의경우는 0 pad 는 padsize 의값에따라바이트, 하프워드또는워드로처리됩니다. padsize 를지정하지않으면 pad 가데이터섹션에서는바이트로, Thumb 코드에서는하프워드로, ARM 코드에서는워드로기본적으로처리됩니다. 7-66 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 사용법 ALIGN 을사용하여데이터와코드가적절한경계에맞춰정렬되도록합니다. 일반적으로이지시문은다음경우에필요합니다. ADR Thumb 의사명령어가워드로정렬된주소만로드할수있지만 Thumb 코드내의레이블이워드로정렬되지않을수있습니다. ALIGN 4 를사용하면 Thumb 코드내의주소를 4 바이트로정렬할수있습니다. ALIGN 을통해일부 ARM 프로세서에서캐시를이용합니다. 예를들어 ARM940T 에서 16 바이트행이있는캐시를이용합니다. ALIGN 16 을사용하면 16 바이트단위로함수엔트리를정렬하고캐시효율성을최대화할수있습니다. LDRD 및 STRD 더블워드데이터전송이 8 바이트로정렬되어야합니다. LDRD 또는 STRD 를사용하여데이터에액세스해야할경우 DCQ(7-17 페이지의데이터정의지시문참조 ) 같은메모리할당지시문앞에 ALIGN 8 을사용합니다. 행의레이블은자동으로임의로정렬될수있습니다. 다음 ARM 코드는워드로정렬됩니다 (Thumb 코드의경우하프워드로정렬됨 ). 따라서레이블이코드주소를올바로지정하지않습니다. 레이블앞에 ALIGN 4(Thumb 의경우, ALIGN 2) 를사용합니다. 정렬은루틴이있는 ELF 섹션의시작부분을기준으로지정됩니다. 이섹션은동일하거나덜정교한경계에맞춰정렬되어야합니다. AREA 지시문의 ALIGN 특성은이와다르게지정됩니다 (7-69 페이지의 AREA 및예제참조 ). 예제 AREA cacheable, CODE, ALIGN=3 rout1 ; code ; aligned on 8-byte boundary ; code MOV pc,lr ; aligned only on 4-byte boundary ALIGN 8 ; now aligned on 8-byte boundary rout2 ; code AREA OffsetExample, CODE DCB 1 ; This example places the two ALIGN 4,3 ; bytes in the first and fourth DCB 1 ; bytes of the same word. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-67

지시문참조 AREA Example, CODE, READONLY start LDR r6,=label1 ; code MOV pc,lr label1 DCB 1 ; pc now misaligned ALIGN ; ensures that subroutine1 addresses subroutine1 ; the following instruction. MOV r5,#0x5 7-68 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8.2 AREA AREA 지시문은새코드또는데이터섹션을어셈블하도록어셈블러에지시합니다. 섹션은링커에서조작하는코드또는데이터의더이상나눌수없는독립적인명명된청크입니다. 자세한내용은 2-17 페이지의 ELF 섹션및 AREA 지시문을참조하십시오. 구문 AREA sectionname{,attr}{,attr}... 인수설명 : sectionname 섹션에지정할이름입니다. 아무이름이나선택할수있지만숫자로시작하는이름은막대로묶어야합니다. 그렇지않으면섹션이름이없다는오류메시지가생성됩니다. 예를들면 1_DataArea 와같습니다. 일부이름은기존방식을사용하여지정됩니다. 예를들어.text 는 C 컴파일러가생성한코드섹션이나 C 라이브러리와다른방식으로연결된코드섹션에사용됩니다. attr 하나이상의쉼표로구분된섹션특성입니다. 유효한특성은다음과같습니다. ALIGN=expression 기본적으로 ELF 섹션은 4 바이트단위로정렬됩니다. expression 은 0 에서 31 사이의모든정수값을가질수있습니다. 섹션은 2 expression 바이트경계를기준으로정렬됩니다. 예를들어 expression 이 10 이면섹션은 1KB 경계를기준으로정렬됩니다. 이지시문은 ALIGN 지시문과다른방법으로지정됩니다. 자세한내용은 7-66 페이지의 ALIGN 을참조하십시오. 참고 ARM 코드섹션에 ALIGN=0 또는 ALIGN=1을사용하면안됩니다. Thumb 코드섹션에 ALIGN=0을사용하면안됩니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-69

지시문참조 ASSOC=section section은연결된 ELF 섹션을지정합니다. sectionname은 section이들어있는모든링크에포함되어야합니다. CODE CODEALIGN COMDEF 시스템명령어를포함합니다. READONLY 가기본값입니다. ALIGN 지시문이다른패딩을지정하지않는경우, 섹션내의 ARM 또는 Thumb 명령어뒤에 ALIGN 지시문이사용되면 NOP 명령어를삽입하도록어셈블러에지시합니다. 공통섹션정의입니다. 이 ELF 섹션은코드나데이터를포함할수있으며다른소스파일에서같은이름을가진다른모든섹션과동일해야합니다. 같은이름을가진동일한 ELF 섹션은링커에서같은메모리섹션에겹쳐서배치합니다. 다른 ELF 섹션이있을경우링커에서경고를생성하고섹션을겹쳐서배치하지않습니다. 자세한내용은 RealView Compilation Tools 링커및유틸리티설명서에서 3장기본링커기능사용을참조하십시오. COMGROUP=symbol_name COMMON 공통그룹섹션입니다. 공통그룹안의모든섹션은공통입니다. 개체가링크될때다른개체파일에 symbol_name 서명이포함된 GROUP 이있을수있습니다. 한그룹만최종이미지에유지됩니다. 공통데이터정의입니다. 이안에들어있는코드나데이터는사용자가정의할수없으며링커에서 0 으로초기화합니다. 같은이름을가진모든공통섹션은링커에서같은메모리섹션에겹쳐서배치합니다. 이러한공통섹션은모두크기가달라야합니다. 링커에서는각이름의가장큰공통섹션에필요한공간을할당합니다. DATA 명령어가아니라데이터를포함합니다. READWRITE 가기본값입니다. 7-70 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 GROUP=symbol_name NOALLOC NOINIT READONLY 그룹에대한서명이며소스파일이나소스파일에포함된파일로정의되어야합니다. 동일한 symbol_name 서명이포함된모든 AREAS 가동일한그룹에배치됩니다. 그룹내의섹션은유지되거나함께검색됩니다. 타겟시스템의메모리가현재영역에할당되지않았음을나타냅니다. 데이터섹션이초기화되지않았거나 0 으로초기화되었음을나타냅니다. 여기에는공간예약지시문인 SPACE 나 0 으로초기화된값이있는 DCB, DCD, DCDU, DCQ, DCQU, DCW 또는 DCWU 만포함될수있습니다. 영역이초기화되지않았는지아니면 0 으로초기화되었는지여부는링크타임에확인할수있습니다 (RealView Compilation Tools 링커및유틸리티설명서에서 3 장기본링커기능사용참조 ). 현재섹션에서쓰기작업을수행할수없음을나타냅니다. 이값이코드영역의기본값입니다. READWRITE 현재섹션에서읽기및쓰기작업을수행할수있음을나타냅니다. 이값이데이터영역의기본값입니다. 사용법 AREA 지시문을사용하여소스파일을여러 ELF 섹션으로나눕니다. 둘이상의 AREA 지시문에같은이름을사용할수있습니다. 같은이름을가진모든영역은동일한 ELF 섹션에배치됩니다. 이경우첫번째 AREA 지시문의특성만적용됩니다. 일반적으로코드와데이터에대해각기다른 ELF 섹션을사용해야합니다. 큰프로그램은보통여러코드섹션으로쉽게나눌수있습니다. 대개큰독립적데이터세트는여러섹션에배치하는것이좋습니다. 지역레이블의범위는 AREA 지시문에의해정의되며, 경우에따라 ROUT 지시문에의해나뉩니다 (3-29 페이지의지역레이블및 7-86 페이지의 ROUT 참조 ). 어셈블리에대한 AREA 지시문은최소한하나이상있어야합니다. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-71

지시문참조 예제 다음예제에서는 Example 이라는읽기전용코드섹션을정의합니다. AREA Example,CODE,READONLY ; An example code section. ; code 7-72 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8.3 END END 지시문은소스파일의끝에도달하면이를어셈블러에알립니다. 구문 END 사용법 모든어셈블리언어소스파일은별도의행에서 END 로끝나야합니다. GET 지시문이상위파일에소스파일을포함시킨경우어셈블러는상위파일로돌아가서 GET 지시문다음에나오는첫번째행에서어셈블리를계속합니다. 자세한내용은 7-79 페이지의 GET 또는 INCLUDE 를참조하십시오. END 가첫번째패스중에오류없이최상위소스파일에도달하면두번째패스가시작됩니다. END 가두번째패스중에최상위소스파일에도달하면어셈블리가완료되고적절한출력이기록됩니다. 7.8.4 ENTRY ENTRY 지시문은프로그램에대한엔트리포인트를선언합니다. 구문 ENTRY 사용법 프로그램에대한 ENTRY 포인트를최소한하나이상지정해야합니다. ENTRY 가없으면링크타임에경고가생성됩니다. 단일소스파일에서둘이상의 ENTRY 지시문을사용하면안됩니다. 모든소스파일에 ENTRY 지시문이있을필요는없습니다. 단일소스파일에둘이상의 ENTRY 가있으면어셈블리타임에오류메시지가생성됩니다. 예제 AREA ENTRY ARMex, CODE, READONLY ; Entry point for the application ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-73

지시문참조 7.8.5 EQU EQU 지시문은숫자상수, 레지스터기준값또는프로그램기준값에심볼이름을지정합니다. * 기호는 EQU 의동의어입니다. 구문 name EQU expr{, type} 인수설명 : name 값에지정할심볼이름입니다. expr 레지스터기준주소, 프로그램기준주소, 절대주소또는 32 비트정수상수입니다. type 선택사항입니다. type은다음중하나일수있습니다. ARM THUMB CODE32 CODE16 DATA type은 expr이절대주소일경우에만사용할수있습니다. name을내보낸경우개체파일에있는심볼테이블의 name 엔트리는 type에따라 ARM, THUMB, CODE32, CODE16 또는 DATA로표시됩니다. 이엔트리는링커에서사용할수있습니다. 사용법 EQU 를사용하여상수를정의합니다. 이지시문은 C 에서 #define 을사용하여상수를정의하는것과같습니다. 심볼내보내기에대한자세한내용은 7-83 페이지의 KEEP 및 7-76 페이지의 EXPORT 또는 GLOBAL 을참조하십시오. 예제 abc EQU 2 xyz EQU label+8 ; assigns the value 2 to the symbol abc. ; assigns the address (label+8) to the ; symbol xyz. 7-74 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 fiq EQU 0x1C, CODE32 ; assigns the absolute address 0x1C to ; the symbol fiq, and marks it as code ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-75

지시문참조 7.8.6 EXPORT 또는 GLOBAL EXPORT 지시문은별도의개체및라이브러리파일에있는심볼참조를확인하기위해링커에서사용할수있는심볼을선언합니다. GLOBAL 은 EXPORT 의동의어입니다. 구문 EXPORT {[WEAK]} EXPORT symbol {[attr}]} EXPORT symbol [WEAK{,attr}] 인수설명 : symbol 내보낼심볼이름입니다. 심볼이름은대소문자를구분합니다. symbol 을생략하면모든심볼이내보내집니다. WEAK 다른소스에서대체 symbol 을내보내지않는경우에만 symbol 을다른소스로가져오게됩니다. [WEAK] 을 symbol 없이사용하면내보낸심볼은모두 weak 심볼이됩니다. attr 다음중하나일수있습니다. DYNAMIC 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시됩니다. PROTECTED 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시되지만다른구성요소에의해다시정의되면안됩니다. HIDDEN 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시되지않습니다. 7-76 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 사용법 EXPORT 를사용하여다른파일의코드에서현재파일의심볼에액세스할수있도록합니다. 다른소스에있는 symbol 의다른인스턴스를사용할수있는경우 [WEAK] 특성을사용하여이다른인스턴스가현재인스턴스보다우선함을링커에알립니다. [WEAK] 특성은모든심볼표시유형특성과함께사용할수있습니다. 7-80 페이지의 IMPORT 및 EXTERN 도참조하십시오. 예제 AREA Example,CODE,READONLY EXPORT DoAdd ; Export the function name ; to be used by external ; modules. DoAdd ADD r0,r0,r1 내보내기가중복될경우심볼표시유형이무시될수있습니다. 다음예제에서는마지막 EXPORT 가바인딩및표시유형에대한우선권을갖습니다. EXPORT SymA[WEAK] EXPORT SymA[DYNAMIC] ; Export as weak-hidden ; SymA becomes non-weak dynamic. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-77

지시문참조 7.8.7 EXPORTAS EXPORTAS 지시문은소스파일에있는다른심볼에해당하는심볼을개체파일에내보낼수있도록합니다. 구문 EXPORTAS symbol1, symbol2 인수설명 : symbol1 소스파일에있는심볼이름입니다. symbol1 은이미정의되어있어야합니다. 영역이름, 레이블또는상수가포함된임의의심볼일수있습니다. symbol2 개체파일에표시할심볼이름입니다. 심볼이름은대소문자를구분합니다. 사용법 EXPORTAS 를사용하면소스파일에있는모든인스턴스를변경하지않고도개체파일에있는심볼을변경할수있습니다. 7-76 페이지의 EXPORT 또는 GLOBAL 도참조하십시오. 예제 AREA data1, DATA ;; starts a new area data1 AREA data2, DATA ;; starts a new area data2 EXPORTAS data2, data1 ;; the section symbol referred to as data2 will ;; appear in the object file string table as data1. one EQU 2 EXPORTAS one, two EXPORT one ;; the symbol 'two' will appear in the object ;; file's symbol table with the value 2. 7-78 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8.8 GET 또는 INCLUDE GET 지시문은어셈블중인파일에다른파일을포함시킵니다. 포함된파일은 GET 지시문의위치에서어셈블됩니다. INCLUDE 는 GET 의동의어입니다. 구문 GET filename 인수설명 : filename 어셈블리에포함할파일의이름입니다. 어셈블러에서는 UNIX 또는 MS-DOS 형식의파일이름을사용할수있습니다. 사용법 GET 은어셈블리에매크로정의, EQU 및저장맵을포함하는데유용합니다. 포함된파일의어셈블리가완료되면 GET 지시문다음에나오는행에서어셈블리가계속됩니다. 기본적으로어셈블러는포함된파일의현재위치를검색합니다. 현재위치는호출하는파일이있는디렉토리입니다. -i 어셈블러명령행옵션을사용하면검색경로에디렉토리를추가할수있습니다. 공백이포함된파일이름과디렉토리이름은큰따옴표로묶으면안됩니다. 포함된파일에는다른파일을포함하기위한추가 GET 지시문이포함될수있습니다 (7-32 페이지의중첩지시문참조 ). 포함된파일이현재위치와다른디렉토리에있으면포함된파일이끝날때까지이디렉토리가현재위치가됩니다. 포함된파일이끝나면이전현재위치가복원됩니다. GET 은개체파일을포함하는데사용할수없습니다 (7-82 페이지의 INCBIN 참조 ). 예제 AREA Example, CODE, READONLY GET file1.s ; includes file1 if it exists ; in the current place. GET c:\project\file2.s ; includes file2 GET c:\program files\file3.s ; space is permitted ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-79

지시문참조 7.8.9 IMPORT 및 EXTERN 이러한지시문은현재어셈블리에정의되어있지않은이름을어셈블러에제공합니다. IMPORT 는현재어셈블리에서해당지시문이참조되는지여부에관계없이이름을가져옵니다. EXTERN 은현재어셈블리에서해당지시문이참조되는경우에만이름을가져옵니다. 구문 IMPORT symbol {[attr}]} IMPORT symbol [WEAK{,attr}] EXTERN symbol {[attr}]} EXTERN symbol [WEAK{,attr}] 인수설명 : symbol WEAK 별도로어셈블된소스파일, 개체파일또는라이브러리에정의된심볼이름입니다. 심볼이름은대소문자를구분합니다. 심볼이다른위치에정의되어있지않은경우링커에서오류메시지를생성하지않도록합니다. 또한링커에서아직포함되어있지않은라이브러리를검색하지않도록합니다. attr 다음중하나일수있습니다. DYNAMIC 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시됩니다. PROTECTED 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시되지만다른구성요소에의해다시정의되면안됩니다. HIDDEN 소스가동적구성요소에링크되면 symbol 이다른구성요소에표시되지않습니다. 7-80 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 사용법 이름은링크타임에별도의개체파일에정의되어있는심볼로확인됩니다. 심볼은프로그램주소로처리됩니다. [WEAK] 를지정하지않으면링크타임에해당심볼을찾을수없는경우링커에서오류메시지를생성합니다. [WEAK] 를지정했지만링크타임에해당심볼을찾을수없는경우다음과같이됩니다. 참조가 B 또는 BL 명령어의대상일경우심볼값이그다음명령어의주소로지정됩니다. 이경우 B 또는 BL 명령어를효과적으로 NOP 로만들수있습니다. 그렇지않으면심볼값이 0 으로지정됩니다. 예제 이예제에서는 C++ 라이브러리가링크되었고결과에따라조건부로분기되는지여부를테스트합니다. of AREA Example, CODE, READONLY EXTERN CPP_INITIALIZE[WEAK] ; If C++ library linked, gets the address ; CPP_INITIALIZE function. LDR r0,= CPP_INITIALIZE ; If not linked, address is zeroed. CMP r0,#0 ; Test if zero. BEQ nocplusplus ; Branch on the result. ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-81

지시문참조 7.8.10 INCBIN The INCBIN 지시문은어셈블중인파일에다른파일을포함시킵니다. 파일은어셈블되지않고있는그대로포함됩니다. 구문 INCBIN filename 인수설명 : filename 어셈블리에포함할파일의이름입니다. 어셈블러에서는 UNIX 또는 MS-DOS 형식의파일이름을사용할수있습니다. 사용법 INCBIN 을사용하여실행가능파일, 리터럴또는임의의데이터를포함할수있습니다. 파일의내용은어떤방식으로든해석되지않고현재 ELF 섹션에바이트단위로추가됩니다. 어셈블리는 INCBIN 지시문다음에나오는행에서계속됩니다. 기본적으로어셈블러는포함된파일의현재위치를검색합니다. 현재위치는호출하는파일이있는디렉토리입니다. -i 어셈블러명령행옵션을사용하면검색경로에디렉토리를추가할수있습니다. 공백이포함된파일이름과디렉토리이름은큰따옴표로묶으면안됩니다. 예제 AREA Example, CODE, READONLY INCBIN file1.dat INCBIN c:\project\file2.txt ; includes file1 if it ; exists in the ; current place. ; includes file2 7-82 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8.11 KEEP KEEP 지시문은개체파일의심볼테이블에지역심볼을유지하도록어셈블러에지시합니다. 구문 KEEP {symbol} 인수설명 : symbol 유지할지역심볼의이름입니다. symbol 을지정하지않으면레지스터기준심볼을제외한모든지역심볼이유지됩니다. 사용법 기본적으로어셈블러가해당출력개체파일을통해설명하는유일한심볼은다음과같습니다. 내보낸심볼 다시재배치된심볼 KEEP 을사용하여디버깅에유용하게사용할수있는지역심볼을유지합니다. 유지된심볼은 ARM 디버거와링커맵파일에표시됩니다. KEEP 은레지스터기준심볼을유지할수없습니다 (7-20 페이지의 MAP 참조 ). 예제 label ADC r2,r3,r4 KEEP label ; makes label available to debuggers ADD r2,r2,r5 ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-83

지시문참조 7.8.12 NOFP NOFP 지시문은어셈블리언어소스파일에부동소수점명령어가포함되지않도록합니다. 구문 NOFP 사용법 NOFP 를사용하여소프트웨어나타겟하드웨어에서부동소수점명령어를지원하지않을경우부동소수점명령어가사용되지않도록합니다. NOFP 지시문다음에부동소수점명령어가실행되면알수없는 opcode 오류가생성되고어셈블리가실패합니다. NOFP 지시문이부동소수점명령어다음에실행되면어셈블러에서다음오류를생성합니다. 부동소수점명령어를금지하기에는늦었습니다. 그런다음어셈블리가실패합니다. 7.8.13 REQUIRE REQUIRE 지시문은섹션간의종속관계를지정합니다. 구문 REQUIRE label 인수설명 : label 필요한레이블의이름입니다. 사용법 REQUIRE 를사용하여관련섹션이직접호출되지않은경우에도포함되도록합니다. REQUIRE 지시문에들어있는섹션이링크에포함되어있으면링커에서지정된레이블의정의가들어있는섹션도포함합니다. 7-84 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK

지시문참조 7.8.14 REQUIRE8 및 PRESERVE8 REQUIRE8 지시문은현재파일에스택의 8 바이트정렬이필요함을지정하고, 링커에알림을제공하기위해 REQ8 빌드특성을설정합니다. PRESERVE8 지시문은현재파일에서스택의 8 바이트정렬을유지함을지정하고, 링커에알림을제공하기위해 PRES8 빌드특성을설정합니다. 링커에서는스택의 8 바이트정렬을필요로하는코드가직접적으로든간접적으로든스택의 8 바이트정렬을유지하는코드에의해서만호출되는지검사합니다. 구문 REQUIRE8 {bool} PRESERVE8 {bool} 인수설명 : bool 선택적부울상수인 {TRUE} 또는 {FALSE} 입니다. 사용법 필요한경우코드에서스택의 8 바이트정렬을유지하면 PRESERVE8 을사용하여 PRES8 빌드특성을파일에설정합니다. 코드에서스택의 8 바이트정렬을유지하지않으면 PRESERVE8 {FALSE} 를사용하여 PRES8 빌드특성이설정되지않도록합니다. 참고 PRESERVE8 과 PRESERVE8 {FALSE} 를둘다생략하면어셈블러에서 sp 를수정하는명령어를검사하여 PRES8 빌드특성을설정할지여부를결정합니다. PRESERVE8 을명시적으로지정하는것이좋습니다. 다음을사용하여경고를활성화할수있습니다. armasm --diag_warning 1546 자세한내용은 3-2 페이지의명령구문을참조하십시오. 이렇게하면다음과같은경고가표시됩니다. "test.s", line 37: Warning: A1546W: Stack pointer update potentially breaks 8 byte stack alignment 37 00000044 STMFD sp!,{r2,r3,lr} ARM DUI 0204HK Copyright 2002-2007 ARM Limited. All rights reserved. 7-85

지시문참조 예제 REQUIRE8 REQUIRE8 {TRUE} ; equivalent to REQUIRE8 REQUIRE8 {FALSE} ; equivalent to absence of REQUIRE8 PRESERVE8 {TRUE} ; equivalent to PRESERVE8 PRESERVE8 {FALSE} ; NOT exactly equivalent to absence of PRESERVE8 7.8.15 ROUT ROUT 지시문은지역레이블범위의경계를표시합니다 (3-29 페이지의지역레이블참조 ). 구문 {name} ROUT 인수설명 : name 범위에지정할이름입니다. 사용법 ROUT 지시문을사용하여지역레이블범위를제한합니다. 이렇게하면실수로잘못된레이블을참조하는문제를보다쉽게방지할수있습니다. ROUT 지시문이없으면지역레이블의범위는전체영역이됩니다 (7-69 페이지의 AREA 참조 ). name 옵션을사용하여각참조가올바른지역레이블에대한것인지확인합니다. 레이블이름이나레이블에대한참조가선행 ROUT 지시문과일치하지않으면오류메시지가생성되고어셈블리가실패합니다. 예제 ; code routinea ROUT ; ROUT is not necessarily a routine ; code 3routineA ; code ; this label is checked ; code BEQ %4routineA ; this reference is checked ; code BGE %3 ; refers to 3 above, but not checked ; code 4routineA ; code ; this label is checked ; code otherstuff ROUT ; start of next scope 7-86 Copyright 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HK