7. Indexing modes


Indexing modes란?

ARM 명령어는 operand로 register또는 immediate value 를 사용한다.(load, store, branch 제외)

명령어 Rdest, Rsource1, source2

Operand는 레지스터 이거나 혹은 값이 될 수 있다.
첫번째 Operand 즉, Rdest위치에 항상 destination이 온다. (STR 예외)
Rsource1 에는 항상 register가 온다.
source2에는 register가 올 수도 있고, immediate value가 올 수도 있다.

이렇게 명령어의 Operand 집합을 총칭하여 인덱싱 모드라고 한다.

Shifted operand

ARM은 Shift (좌/우) operation 에 관련 명령어가 없다.
Operand는 Shift operation과 결합될 수 있다.

LSL #n         Logical Shift Left. 
LSL Rsource3
LSR #n        Logical Shift Right.
LSR Rsource3
ASR #n        Arithmetic Shift Right.
ASR Rsource3
ROR #n         Rotate Right.
ROR Rsource3

source2

mov r1, r2, LSL #1

Usage of Shifted operand

mov r1, r2, LSL #1      /* r1 ← (r2*2) */
mov r1, r2, LSL #2      /* r1 ← (r2*4) */
mov r1, r3, ASR #3      /* r1 ← (r3/8) */
mov r3, #4
mov r1, r2, LSL r3      /* r1 ← (r2*16) */

shift 하여 2의 배수 곱셈 가능

add r1, r2, r2, LSL #1   /* r1 ← r2 + (r2*2) equivalent to r1 ← r2*3 */
add r1, r2, r2, LSL #2   /* r1 ← r2 + (r2*4) equivalent to r1 ← r2*5 */

이렇게 하면 홀수배도 곱셈 가능

sub r1, r2, r2, LSL #3  /* r1 ← r2 - (r2*8) equivalent to r1 ← r2*(-7)

음수배 곱셈 가능

rsb r1, r2, r2, LSL #3      /* r1 ← (r2*8) - r2 equivalent to r1 ← r2*7 */

rsb 로 곱셈 가능 rsb (Reverse Substract)

sub Rd A B

A - B

rsb Rd A B

B - A Shift 연산에서 어떤 값을 뺄때 유용

  • 왜 더 간단한 곱셈연산을 사용하지 않나?

일반 곱셈연산은 연산량이 더 많다. 계산하는데 오버헤드가 더 크다.

results matching ""

    No results matching ""