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