네트워크2012. 11. 9. 23:00

 

Atoms

 

QuickTime file 에서의 기본적인 데이터 단위는 atom 이다. 각각의 atom 은 다른 data 들에 앞서서 size 와 type field 들을 포함하고 있다. size field 는 size 와 type field 들을 포함하여 atom 에 있는 총 바이트수를 표시하고, type field 는 atom 에 저장된 데이타의 타입과 데이터의 포맷(data format 은 암시에 의하여(by impilcation))을 명시한다. 어느 경우에는 size 와 type field 들이 version field 와 flags field 에 따라 나오기도 한다. 이러한 version, flags field 들을 포함한 atom 을 두고 종종 full atom 이라 부르기도 한다.

 

Note : 이 문서에서 서술된 atom 은 MPEG-4 와 Motion JPEG-2000 을 위한 ISO 사양(specifications) 에서 서술된 box 와 기능적으로 동일하다. 그리고 또한 이런 사양에서 정의된 full box 와 version 과 flags fields 를 포함한 atom (즉, full atom) 과 기능적으로 동일하다.

 

atom type 들은 전형적으로 ASCII code 4 글자로 번역될 수 있는 32-bit unsigned int 로 명시된다. (Apple, inc. 는 전부 소문자들로 이루어진 모든 4 글자 코드에 대해 법적 권리를 가지고 있다.) 만약 다른 언급이 없으면(Unless otherwise stated), QuickTime movie 의 모든 데이터들은 네트워크 바이트 ordering 으로 일반적으로 알려져있는 big-endian (MSB 가 가장 먼저 저장되고, 가장 먼저 전송되는) 으로 저장된다.

 

atom 은 본질적으로 계층구조를 갖고있다. 이 말은 즉슨, 하나의 atom 이 또 다른 것들을 포함할 가능성이 있는 다른 atom 들을 포함할 수 있다. 이런 계층구조는 종종 부모, 자식, 형제(siblings), 손주(grandchildren), 등등으로 표현되기도 한다. 다른 atom 을 포함하는 atom 을 container atom 이라고 부르며, parent atom 은 계층구조에서 주어진 atom 에서 정확히 한 단계 위의 container atom 을 가리킨다.

 

다른 atom 들을 포함하지 않는 atom 은 leaf atom 이라고 부른다. 이 leaf atom 은 전형적으로 하나 또는 더 많은 필드나 테이블(tables)로서의 data 를 포함한다. 하지만 어떤 몇몇의 leaf atom 들은 flags 나 placeholders 처럼 행동하고, size 와 type fields 외에는 어떠한 정보도 갖지 않는다.

 

given atom 에 저장된 데이타의 포맷은 항상 혼자서 atom 의 type field 에 의해 결정될 수 없다.; parent atom 의 타입 또한 중요할 수도 있다. 다른 말로, given atom 타입은 parent atom 에 의존하는 다른 종류의 정보들을 포함할 수 있다. 예를 들어 movie atom 안에 있는 profile atom 은 the movie 에 대한 정보들을 포함한다. 반면에 profile atom 이 track atom 안에 있다면, profile atom 은 트랙에 대한 정보들을 포함하게된다.

 

 

 

- Atom Layout

 

A sample atom

오른쪽 그림 1-1 (Figure 1-1 A sample atom) 에서 보여지는 leaf atom 은 간단히 오프셋에 의해 접근가능한 a series of data fields 를 포함한다.

 

Container Atom들 안에 있는 Atom들은 이 문서 내부에서 따로 특별하게 어떤 순서를 언급하지 않는한, 일반적으로 어떤 특정한 순서(order)을 갖지 않는다. 하나의 예를 들자면, 무조건 handle 하는 data 의 앞(before)부분에 위치해야하는 handler description atom 이 있다.

 

예를 들어, media handler description atom 은 media information atom 앞에(before) 위치해야하고, data handler description atom 은 data information atom 앞에(before) 위치해야한다.

 

 

 

- Atom Structure

 

Atom data 다음에 따라오는 Atom 들은 header 들로 구성되어 있다. header 는 atom의 크기를 bytes 단위로 갖는 atom의 크기필드, 그것의 타입을 갖는 atom의 타입필드를 갖는다. 또한 large atom을 64-bit integer 값으로 갖는 extended size field 도 포함하고 있다. 만약에 이 extended 필드가 존재한다면, 크기필드의 값은 1로 설정되어있을것이다. atom의 실질적인 크기는 8 바이트(minimum size of the type and size fields)보다 작은 값을 가지지 않는다. (최소 8 바이트이다.) 

 

몇 atom 들은 또한 version, flag fields 도 포함한다. 이들은 종종 full atoms 라고 불린다. flag 와 version field들은 이 문서 내부의 atom header의 부분으로 처리되지는 않는다. 그들은 full atoms 을 포함하는 각 atom type 에 특화된 (specific to each atom type) data fields 로 간주된다. (? : they are treated as data fields specific to each atom type that contains them.) 이러한 필드들은 따로 특별한 상황이 아니면, 항상 0 값으로 세팅되어있어야한다.

 

atom header 는 다음 필드들로 구성되어 있다.

 

Atom size

 

atom 의 컨텐츠(다른 포함된 atom들을 포함해서)들과, atom 의 헤더를 포함한 atom 의 크기를 가리키는 32-bis integer 이다. 일반저긍로 size field 는 32-bit unsigned integer 로 표현된 실제의 bytes 단위의 atom 크기를 포함한다. 하지만 size field 는 atom 크기를 정하는데 사용되는 다른 대안의 방법을 지칭하는 특별한 값을 가질수도 있다. (이 특별한 값은 일반적으로 media data atom ('mdat') 에만 사용된다.)

 

두 특별한 값은 사이즈 필드에서 유효한 값들이다 :

 

0 : 오직 top-level atom 만을 위해 허락된 값으로, 파일안에 마지막 atom 을 가리키고, 파일의 끝에서 확장된 것을 가르켜준다. 

(? : , designates the last atom in the file and indicates that the atom extends to the end of file.)

 

1 : 실제 크기는 extended size field 에 존재한다는 뜻이다. extended size field 는 type field 를 따르는 선택적인(optional) 64-bit filed 이다.

 

This accommodates media data atoms that contain more than 2^32 bytes.

이것은 2^32 바이트보다 더 많은것을 포함하는 media data atoms 를 수용한다. 

아래 Figure 1-2 는 어떻게 atom 의 크기를 계산하는지에 대해 나와있다.

 

Calculating atom sizes 

Figure 1-2 Caculating atom sizes 

 

Type

 

atom 의 타입을 가리키는 32-bis integer 이다. 이건 종종 mnemonic 값을 가진 4 char 필드로 유용하게 처리될 수 있다. 예를 들어 movie atom 을 위한 'moov' (0x6D6F6F76), 또는 track atom 을 위한 'trak' (0x7472616B) 이 있다. non-ASCII 값들도 이용되기도 한다. (예를 들어 0x00000001) 

 

atom 의 타입을 아는것은 당신이 그 data 를 해석하게 해준다. atom data 는 fields, tables, 다른 atom 들의 독자적인 모음으로서 나열될 수 있다. data structure 는 atom type 에 특화되어 있다. 주어진 type 에 대한 atom 은 각각 정의된 data structure 를 갖고 있다.

 

만약에 당신의 애플리케이션이 알려지지않은 type 의 atom 을 마주하였다고 하였을때, app 은 그 해당 atom data 를 해석하려는 시도하면 안된다. atom 과 그 해당 atom 이 포함하고 있는 content 들을 스킵하기 위하여 atom 의 size field 를 이용하여라. 이 행위는 QuickTime file format 를 확장하는것에 대한 a degree of forward compatibility 를 허락해준다. 

(* forward compatibility ? : (software) Capability of interoperating with anticipated future systems.)

 

Warning : 주어진 atom 의 타입에 대한 내부 구조는 새로운 버전이 출시될때 바뀔 수 있습니다. version 필드가 존재한다면, 항상 version 필드를 확인하십시오. 절대 Size or Extended Size 필드에서 정의된 atom 말고 그 외부에 떨어진 data 를 해석하려 시도하지 마십시오.

 

Extended Size

 

만약 atom 의 size 필드가 1 로 세팅되있다면 type 필드는 64-bit unsigned integer 형으로 atom 의 실제 크기를 갖는 64-bit extended size 필드를 자신의 뒤로 갖게 된다. (the type field is followed) 이는 media data atom 의 크기가 2^32 bytes 를 넘었을때 사용된다.

 

size field 가 atom 의 실제 크기를 가질때, extended size 필드는 존재하지 않는다. 이 뜻은 data 를 더함으로서 QuickTime atom 이 수정될 때, 그리고 그것의 크기가 2^32 바이트 제한 내에 있다면, 새로운 atom size 를 기록하기 위한 extended size 필드는 없다는 뜻이다. 결과적으로, 2^32 바이트를 넘어서는 atom 를 확장하는 것이 새로운 atom 에 그 해당 atom 의 컨텐츠를 복사하지 않고서는 항상 가능하진 않다.

 

이런 불편을 방지하기 위하여, media data atoms 는 전형적으로 64-bit placeholder atom (즉각적으로 movie file 안에서 media data 를 앞서는 atom) 을 생성한다. placeholder atom 은 kWideAtomPlaceholderType('wide') 라는 타입을 갖고 있다.

 

'free' 혹은 'skip' atom 과 유사하게 'wide' atom 은 예약된 공간이다, 하지만 in this case 이 공간은 특별한 목적을 위해 예약된다. 만약 'wide' atom 이 즉각적으로 second atom 을 앞선다면, 단순하게 atom header 를 8 바이트 빠르게 시작하고('wide' atom 을 overwriting), size 필드 값을 1로 세팅하고, extended size 필드에 더함으로서 second atom 은 32-bit 크기에서 64-bit 크기로 확장될 수 있다. 이 방법에서 샘플데이타를 위한 오프셋은 재계산될 필요가 없다.

(? : Much like a 'free' or 'skip' atom, the 'wide' atom is reserved space, but in this case the space is reserved for a specific purpose. If a 'wide' atom immediately precedes a second atom, the second atom can be extended from a 32-bit size to a 64-bit size simply by starting the atom header 8 bytes earlier (overwriting the 'wide' atom), setting the size field to 1, and adding an extended size field. This way the offsets for sample data do not need to be recalculated.)

 

'wide' atom 의 크기는 정확히 8 바이트이다. 그리고 자체적으로(solely) size, type 필드를 포함하고 있고 그 이외의 data 는 포함하고있지않다.

 

Note : 흔한 오류는 'wide' atom 은 extended size 를 포함하고 있다고 생각한다는 점이다. 'wide' atom 은 필요하다면 extended size 필드를 포함하는 atom header 에 의해 overwritten 될 수 있는 단지 placeholder 일 뿐이다.

 

 

 

 

 

 

 

'네트워크' 카테고리의 다른 글

[QTFF] QT Atoms and Atom Containers  (0) 2012.11.15
[QTFF] QuickTime File Format Specification 시작부분  (0) 2012.11.09
Posted by 하늘_
네트워크2012. 11. 9. 22:58

 

Introduction to QuickTime File Format Specification

 

QTFF 는 devices, applications, operationg systems 간에 디지털미디어의 교환을 쉽게해주기 위한 이상적인 fomat. 이유는, QTFF 가 거의 대부분의 미디어 구조를 describe하는데에 사용될 수 있기 때문이다. The file format 은 (객체들의 유연한 모음으로 구성되어서 쉽게 분석되고, 쉽게 확장될 수 있는) object-oriented의 성질을 갖고있다. 모르는 객체는 간단하게 무시되거나 넘어갈 수 있다(skip). 이렇게 함으로써 새로운 객체 타입이 선언되었을때(introduced) 많은 수의 접근호환성(forward compatibility)을 지원해준다. 

 

QuickTime 그 자체로 많은 high-level function들을 제공해준다. 당신은 high-level function를 이용하여 실제 파일 포맷에 대한 이해없이, QuickTime files을 만들거나 조작하는 작업들을 수행할 수 있다. 이러한 함수들은 개발자들에게 operation 의 low-level 구체사항에 대한 요구를 필요없도록 도와준다. 그 이야기는 여기에 표현된(presented) 정보들 없이는 모든 종류의 QuickTime files 이 만들어질수없다는 것이다.

 

Important : QuickTime File Format 은 ISO에서 개발된 MPEG-4 기준과, JPEG-2000 기준으로 사용되는 포맷이다. 하지만 이들 file type 들은 비슷한 구조들을 갖고있고, 많은 함수적인 동일 요소(functionally identical elements)들을 포함하고 있음에도, 여전히 distinct 한 file types 이다.

 

Warning : Do NOT use this specification to interpret a file that conforms to a different specification, however similar

 

QuickTime 은 audio/visual media 에서의 새로운 사용들과 요구들에 의해 계속해서 진화해가는 a rich technology 이다. 이때문에, 최근 QuickTime technology의 요소들은 시간이 지남에 따라 become deprecated 될지도 모른다. 이런 요소들은 포함하는 현존하는 QuickTime file 들에 대한 법적 요소(components)들의 충분한 정보들을 보존하기 위하여 deprecated 요소들은 QuickTime File Format Specification 의 수정사항 부분의 가장 위의 section 에 note 에 표기해놓을 것이다.

 

 

 

 

Overview of QTFF

 

QuickTime movies 는 정보를 저장하기 위한 2 가지 기본적인 구조를 이용하여 disk 에 저장한다.

- atoms (또한 simple atoms or classic atoms 로도 알려져있다.)

- QT atoms

 

어떻게 QuickTime movies 가 저장되는지를 알기위하여, 당신은 앞으로 서술할 기본적인 atom 구조에 대하여 이해해야한다.

당신이 QuickTime File Format 에서 만나는 대부분의 atom 들은 간단하거나 classic atoms 이다.하지만 simple atomsQT atoms 나 둘다 당신이 마음대로 복잡한 계층의 데이터구조를 설계할 수 있게끔 도와주고, 둘다 당신의 어플리케이션이 그들이 이해하지못한 data 를 무시할수 있게 허락한다.  

 

 

 

 

Media Description

 

QuickTime file 은 그 미디어에 대한 서술들을 미디어 데이터(media data)와 따로 저장한다. 

 

- Movie resource, movie atom, the movie (description)

 

이 서술을 movie resource, movie atom 또는 간단하게 the movie 라고 부르고, 이 서술은 트랙의 수, 비디오 압축 포맷, 시간 정보와 같은 정보들은 포함한다. movie resource 는 또한 어디에 모든 미디어 데이터가 저장되어 있는지를 서술하는 index 도 포함하고 있다.

 

- media data (actual data)

 

media data 는 비디오 프레임과 오디오 샘플들과 같은 the movie 에서 사용되는 실질적인 샘플 데이타이다. media data 는 1) QuickTime movie 와 같은 파일로, 2) 분리된 파일로, 3) 복수의 파일로, 4) 데이터베이스 혹은 실시간 스트림처럼 대체적인 소스로, 혹은 5) 이런것들중 몇몇의 조합으로 저장될 것이다. 

 

 

 

 

Atoms

 

QuickTime file 에서의 기본적인 데이터 단위는 atom 이다. 각각의 atom 은 다른 data 들에 앞서서 size 와 type field 들을 포함하고 있다. size field 는 size 와 type field 들을 포함하여 atom 에 있는 총 바이트수를 표시하고, type field 는 atom 에 저장된 데이타의 타입과 데이터의 포맷(data format 은 암시에 의하여(by impilcation))을 명시한다. 어느 경우에는 size 와 type field 들이 version field 와 flags field 에 따라 나오기도 한다. 이러한 version, flags field 들을 포함한 atom 을 두고 종종 full atom 이라 부르기도 한다.

 

Note : 이 문서에서 서술된 atom 은 MPEG-4 와 Motion JPEG-2000 을 위한 ISO 사양(specifications) 에서 서술된 box 와 기능적으로 동일하다. 그리고 또한 이런 사양에서 정의된 full box 와 version 과 flags fields 를 포함한 atom (즉, full atom) 과 기능적으로 동일하다.

 

atom type 들은 전형적으로 ASCII code 4 글자로 번역될 수 있는 32-bit unsigned int 로 명시된다. (Apple, inc. 는 전부 소문자들로 이루어진 모든 4 글자 코드에 대해 법적 권리를 가지고 있다.) 만약 다른 언급이 없으면(Unless otherwise stated), QuickTime movie 의 모든 데이터들은 네트워크 바이트 ordering 으로 일반적으로 알려져있는 big-endian (MSB 가 가장 먼저 저장되고, 가장 먼저 전송되는) 으로 저장된다.

 

atom 은 본질적으로 계층구조를 갖고있다. 이 말은 즉슨, 하나의 atom 이 또 다른 것들을 포함할 가능성이 있는 다른 atom 들을 포함할 수 있다. 이런 계층구조는 종종 부모, 자식, 형제(siblings), 손주(grandchildren), 등등으로 표현되기도 한다. 다른 atom 을 포함하는 atom 을 container atom 이라고 부르며, parent atom 은 계층구조에서 주어진 atom 에서 정확히 한 단계 위의 container atom 을 가리킨다.

 

다른 atom 들을 포함하지 않는 atom 은 leaf atom 이라고 부른다. 이 leaf atom 은 전형적으로 하나 또는 더 많은 필드나 테이블(tables)로서의 data 를 포함한다. 하지만 어떤 몇몇의 leaf atom 들은 flags 나 placeholders 처럼 행동하고, size 와 type fields 외에는 어떠한 정보도 갖지 않는다.

 

given atom 에 저장된 데이타의 포맷은 항상 혼자서 atom 의 type field 에 의해 결정될 수 없다.; parent atom 의 타입 또한 중요할 수도 있다. 다른 말로, given atom 타입은 parent atom 에 의존하는 다른 종류의 정보들을 포함할 수 있다. 예를 들어 movie atom 안에 있는 profile atom 은 the movie 에 대한 정보들을 포함한다. 반면에 profile atom 이 track atom 안에 있다면, profile atom 은 트랙에 대한 정보들을 포함하게된다.

 

 

 

 

 

'네트워크' 카테고리의 다른 글

[QTFF] QT Atoms and Atom Containers  (0) 2012.11.15
[QTFF] Atoms  (0) 2012.11.09
Posted by 하늘_


 

Data Processing Instructions

Comparisons ( no results - just set condition codes )

 

'비교'를 '산술 연산' 다음에서야 다루는 이유는 '비교'에서 절대 빠질 수 없는 CPSR에 대한 개념을 '산술 연산'에서 한번 다루고 그때 배운 CPSR 개념을 사용해서 '비교'를 더 제대로 배우기 위함이다. '산술 연산'에서 CPSR 을 사용할때 어떤 방법을 사용하였는지 기억하는가? 

 

접미사 (Postfix) 'S' 를 산술 연산에 관련된 Instruction 에 붙여서 '산술 연산'을 진행시킨다음 그 결과로 나온 값에 대한 여러 특징들을 살펴보고, 각각 특정 조건을 갖는가?(1) 갖지 않는가?(0) 등의 조건에 대한 Flag 들을 세팅하고 이렇게 세팅된 Flag 값들은 다음 라인부터 사용 가능했다. 이 정도는 기억할 수 있을꺼라 믿는다!

 

   1. No postfix 'S' is needed

그런데 Comparison 은 Postfix 'S' 가 필요없다. 그냥 '비교' Instruction 자체가 'S' 를 포함하고 있다고 생각하면 된다. [ CMP = 'CMPS 이렇게 S를 포함하여 쓴거하고 똑같다고 보면 된다.' ] 아래 Operation 들을 보면 '비교'를 진행시킴과 동시에 그 결과로 나온 값을 이용하여, 여러 특징들을 갖는가? 갖지않는가? 등의 조건에 대한 Flag 들을 세팅하고 이렇게 세팅된 Flag 값들은 다음 라인부터 사용 가능하다는 것을 알 수 있다. ( postfix 'S'를 쓰지 않았지만, CPSR 의 조건 Flag 사용법과 완전 똑같다. )

 

   2. No destination register is required

그리고 우리가 rd 로 사용해 왔던 Destination register 가 이 '비교'에서는 필요가 없다. CMP에 대한 결과값을 Destination register (연산의 결과가 들어갈 목적 레지스터) 에 저장하는것이 아니라, CPSR의 Flag bits 자리에 넣기 때문이다. 그렇기 때문에 이 Instruction 을 사용할 때는 간단하게 비교할 두 대상만 써주면 된다. ( XXX r1, r2 / r1 : 비교될 대상 1, r2 : 비교될 대상 2 )

 

시스템 프로그래밍 - 4 (3) : Data Processing Instructions - Comparisons 

 

 

 - Operations

 

-    CMP    r0, r1         @ r0 - r1 to set flags

     r0 과 r1 을 비교한다 (비교 방법은 r0에서 r1 값을 뺀다) 그리고 그 결과에 대한 Flag 들을 설정한다.

 

-    CMN    r0, #9        @ r0 + 9 to set flags

     뒤엣 #9 (또는 레지스터 값이 들어올 수 있다)를 NOT 시킨 결과를 r0 에서 빼준다.

결국엔 #9 를 r0 에서 더해주는 연산과 다를바가 없다. 그리고 그 결과에 대한 Flag 들을 설정한다.

 

-    TST     r0, #4         @ r0 & 0100(2진수) to set flags

     r0과 #4 (또는 레지스터 값이 들어올 수 있다)를 2 진수 연산인 AND 를 시킨다.

그리고 그 결과에 대한 Flag 들을 설정한다.

 

-    TEQ     r0, r1         @ r0 ^ r1 to set flags

r0과 r1를 2 진수 연산인 OR 를 시킨다. 그리고 그 결과에 대한 Flag 들을 설정한다.

 

 

 

 - Branch Instructions

 

C 언어에서는 프로그램을 작성할 때 여러 함수들을 main 함수와 분리시켜 놓고, main 함수에서 특정한 기능들이 필요할 때 마다 우리가 만들어 놓았던 여러 함수들을 호출하면, 컴퓨터는 C 언어를 위에서 아래로 쭉 읽어나가다가 호출된 함수로 이동해서 해당 함수의 작업들을 끝내고, 다시 원래 읽어나가고 있던 자리로 돌아온다.

 

우리가 배우고 있는 이 ARM 프로그래밍 (시스템 프로그래밍)은 알다시피 '어셈블리어'이다. C 언어와 같이 우리가 고수준 언어로 여러 함수들을 호출, 리턴하는 작업들을 간단하게 작성했던것과 달리 우리는 컴퓨터의 작동 원리를 그대로 따라서 (컴퓨터처럼 생각해야한다.) 하나하나 일일이 다 작업해주어야한다.

 

  - 특정 함수를 호출하면 어느 Line에 그 함수가 있는지 알아내어 그 Line 으로 가라고 명령해야하고,

 

  - 리턴할때는 어떤 Line 으로 가야지 월래 컴퓨터가 실행하던 라인으로 다시 돌아가는지 알려주어야한다.

 

마치, 'A칸부터 D칸까지 순서대로 있는 책장'을 가리키며 갑이 을에게 '책장 C칸에 있는 'Hello'이라는 제목을 가진 책좀 가져다 줄래?' 라는 말을 '책장을 보면 오른쪽부터 왼쪽까지 A, B, C, D 칸이 있어, 거기서 오른쪽에서 순서대로 세 칸을 이동하면 거기에 C 칸이 존재하는데, 그 C 칸에서 오른쪽부터 123번째에 있는 책이 'Hello'이라는 제목을 가지고 있을거야. 그 책을 나에게 가져다 줘' 라고 귀찮게 일일이 다 말해주어야하는것과 같다.

 

Branch는 이 귀찮은 작업들을 조금 더 유용하게 해준다.

Branch Instruction 을 사용하기 위해서는 'Label' 과 'Branch'. 이 두 개를 이용한다.

 

 

 

 - Label

 

'책장을 보면 오른쪽부터 왼쪽까지 A, B, C, D 칸이 있어.'

'C칸에서 오른쪽부터 123번째에 있는 책이 'Hello'이라는 제목을 가지고 있을꺼야.'

 

Label 은 함수가 존재하는 Line 을 '2388 번째 Line' 이렇게 일일이 숫자를 붙혀 표현하면 힘들기 때문에 해당 2388번 Line에 말 그대로 Label (이름표)을 달아주는 것이다. 123 번째에는 Hello 라는 이름표를 붙여주어, 나중에 Hello 라는 책을 찾을때 몇 번째에 있는지 일일이 다 세어보지 않고서도 Label (이름표)를 찾기만 하면 된다.

 

 

 

 

 - Branch (B, BL)

 

Branch 의 언어적인 뜻은 '나뭇가지'이다. 어셈블리어에서 branch는 C 언어에서의 goto 와 비슷한 것으로 '위에서 아래로'라는 일반적인 컴퓨터의 실행 흐름에서 특정한 장소로 실행 위치를 이동하기 위함이다.

 

C 언어에서는 권장하지 않는 goto 문의 기능을 왜 어셈블리어에서는 굉장히 중요한 명령어로 취급할까? 그 이유는 바로 어셈블리어의 특징에 있다. 컴퓨터가 읽기 쉬운 형태로 만들어놓은 어셈블리어에는 자동적으로 실행 위치를 바꾸어주는(for while switch 등등) 복잡한 고급언어에 존재하는 명령어들이 없다.

 

for 이든 while 이든 switch 이든 실행라인 위치를 자동으로 변환시켜주는 이러한 고급언어의 명령어들은 실제로 어셈블리어로 어셈블리 되면, Branch 라는 (goto 와 유사) 명령어를 통해 일일이 '실행라인 이동 명령'들의 집합으로 구성되게 된다. Branch을 필요로 하는 상황들은 아래와 같다.

 

 

1. 컴퓨터의 일반적인 실행 방향인 '위에서 아래로'에서 특정한 조건에 따라 실행하기 싫은 Instruction 이 중간에 있다면, 그 Instruction을 뛰어 넘어야 할때 (예를 들어, 어떤 값이 음수이면 어떤 명령어는 실행하지 말아야할 때)

 

2. 특정한 위치에 내가 사용하고 싶은 특정한 Instruction 을 만들어 놓고, 그 Instruction 을 이용하고 싶을때 마다 그 Instruction의 위치로 이동하여 그것을 실행하고 싶을 때 (마치, C언어에서 함수를 호출하는 방법과 유사하다)

 

3. 혹은, 위에서 아래로 순서대로 읽어서 실행하는 어셈블리어에 있어서, 반복문 (Loop 문)을 넣고싶을 때, 한번 그 반복문을 돌고나서 반복문의 끝부분에서 다시 반복문의 처음부분으로 넘어가야할 상황. ( C 언어에서는 간단하게 for 나 while 문을 이용해서 { } 로 필드를 구성해주면 알아서 그 안에서 반복하게 되지만, 이 고급언어가 어셈블리어로 변환되면 컴퓨터가 읽기 위한 어셈블리어에는 이렇게 { } 필드 구성이 없게된다. 그래서 반복문의 끝 부분에 Branch를 넣어서 '반복문의 첫 부분으로 이동하라!' 라는 명령을 넣어야지만이 처음으로 돌아가 반복문을 반복 수행하게 된다. )

 

우리는 이 Branch에 (2)와 (3)의 첫 부분인 Comparison 와 Arithmetics operation 에서 배운 CPSR의 Condition Flag 값들을 이용해 Branch 라인의 전 라인의 Instruction 에서의 연산(혹은 비교) 결과 값이 음수인지 아닌지? (N Flag), 0인지 0이 아닌 값인지? (Z Flag)... 등등의 특징들을 조건으로 부가해줄수 있다. 

 

LOOP:   CMP     r0, #10            @ CMP 의 결과(r0 - #10)에 대한 Condition Flag 가 세팅된다.

BEQ     LOOP              @ r0 - #10 의 결과가 '0' 이라면 같다는 뜻이다 ( EQ 의 의미 )

    @ '0' 이면 (같으면) 'Z Flag = 1'로 세팅, EQ 는 'Z Flag = 1'이면 실행한다

    @ Z Flag = 1 (비교 결과 같다) > EQ 만족 > LOOP 의 Label로 이동하라

    @                                                   (이것이 Branch 의 의미)

 

@ EQ 는 오직 'Z Flag' 가 1인지 0인지만을 판단하는 조건이다.

 

N, Z, C, V 이 조건 Flag 들의 조합에 따라 다양한 '조건'들을 만들어 낼 수 있다.

N = 0, Z = 1, C = 1, V = 0        ( = 0110 라고 CPSR의 최상위 비트(MSB)의 4bits 자리에 새겨진다.)

이런 방식으로 0111, 0100, 1010 ... 많은 조건들을 단순하게 인간이 이해할 수 있는 표현언어로 만들었다.

이렇게 만들어진 표현언어는 <cond> (=Condition, 조건) 자리에 '조건'으로 자리잡게된다.

 

Branch 사용법, 표현법 :   

B<cond> LABEL

@ B = Branch

 

예시:

LOOP:     CMP      r0, #10

BEQ       LOOP

 

 

<cond>에 들어갈 Condition Field - 모든 조건들 모음 :

 

After CMP, CMN ...

 

EQ : equal                                                    NE : not equal

 

HS : unsigned higher or same                            GE : signed greater or equal

HI : unsigned higher                                       GT : signed greater

 

LS : unsigned lower or same                              LE : signed less or equal

LO : unsigned lower                                        LT : signed less

 

 

After TST, TEQ ... or Numeric Operation with S postfix

 

EQ : zero                                                     NE : non-zero

 

CS : carry-bit set                                            VS : overflow

CC : carry-bit clear                                          VC : no overflow

 

MI : negative                                                PL : positive or zero

 

[ 조건 조합에 관한 블로그 : http://blog.naver.com/yosiba?Redirect=Log&logNo=60058803504 ]

 

 

Branch 확장 - Procedure Call (프로시져 콜) Basic :

BL<cond> LABEL

@ BL = Boy's Love (xD) = Branch with Link

...

...

MOV pc, lr

@ 돌아갈때 lr 에 저장해두었던 LABEL 다음 Line 을 pc에다 넣는다.

그냥 Branch 는 B 뒤에 LABEL 로 이동하는 작업'만' 한다. 그런데 BL 은 뜻에서도 알 수 있듯이 B 뒤에 LABEL 로 이동함과 '동시에' BL 명령어 다음 Line 을 저장한다. 예를 들어 BL 이 Line 30 번에 있으면 Line 31번 을 lr 에 복사해 넣고, 이동한 LABEL ( Line 55라고 가정, LABEL의 끝은 Line 60 이라고 가정 )에서 모든 작업이 끝나면 lr 에 저장되었던 Line 31를 바로 pc에 넣는다. pc 값은 'Line 60' 이었다가 'Line 31'로 바뀌어서 다시 BL<cond> LABEL 다음 Instruction 으로 이동하게 된다.

 

예시:

                    BL         FUNC

                 ...

FUNC:         ...

                 ...

         MOV      pc, lr

 

 

 

 

 - Pointer Initialization

 

Branch 말고도 LABEL 을 이용하는 Instruction 이 하나 또 있다. Pointer Initialization 이라고 하며, 프로그램의 끝 부분에 여러 문자들이나 문장들을 써넣으면 그 문장을 특정 메모리 주소에 저장하고 포인터를 갖게 되는데 그 포인터(주소)를 우리가 원하는 레지스터(예를 들어, r1 과 같은)에 저장하는 것이다.

 

Pointer Initialization 사용법, 표현법 :

ADR      rd, LABEL

 

예시:

ADR           r0, HELLO

......

HELLO:                                         

.asciz "Hello, world! \n"

 

ADR 은 실제로는 ARM Instruction 가 아니라 ADD 와 같은 다른 Instruction 들의 조합으로 만들어(emulated) pseudo Instruction (수도, 가짜 명령어) 이다.

 

지금까지 (1), (2), (3) 에 걸쳐서 Data Processing Instruction 들에 대하여 알아보았다. 이 4장을 통해 우리는 이제서야 제대로 된 ARM 프로그래밍을 할 수 있다. 지금까지 배운 명령어들과 1, 2, 3에서 배운 기초적이면서도 매우 basic한 지식들을 기반으로 ARM Assembly Language 를 이용해서 몇 간단한 프로그램을 작성할것이다.

 

Hello, World 출력 프로그램과  Hello, World 구문의 길이(String Length)를 계산하는 프로그램.

 

4장을 시작할때 ARM Instruction 은 매우 방대한데, Data Processing Instruction 이 전체 ARM Instruction 의 대부분을 차지한다고 설명하였었다. 다음 장은 4장에서 배운 Data Processing 관련 명령어가 아닌 기타 다른 Basic ARM Instruction 에 대해 알아보고 우리가 작성한 위 2개의 간단한 프로그램보다 조금더 복잡한 (추가로 배울 Basic ARM Instruction 들을 더 추가로 사용하여 작성한) 프로그램들을 살펴볼것이다.

 

 

 

 

 

 

Posted by 하늘_