arm instructions i prof. taeweon suh computer science education korea university

36
ARM Instructions I Prof. Taeweon Suh Computer Science Education Korea University

Upload: lucinda-white

Post on 23-Dec-2015

225 views

Category:

Documents


0 download

TRANSCRIPT

ARM Instructions I

Prof. Taeweon SuhComputer Science Education

Korea University

Korea Univ

Data Processing Instructions

• Arithmetic instructions• Logical instructions• Comparison instructions• Move instructions

2

Korea Univ

Execution Unit in ARM

3

ALU

Rn (1st source)

Barrel Shifter

Rm

Rd

Pre-processing

No pre-processing

N (=shifter_operand)(2nd source)

Data processing instructions take 2 source operands: One is always a register. The other is called a shifter operand

(either immediate or a register). If the second operand is a register, it can have a shift applied to it.

Source: ARM Architecture Reference Manual

Korea Univ

Arithmetic Instructions

4

ALU

Rn

Barrel Shifter

Rm

Rd

N

ADC add two 32-bit values with carry Rd = Rn + N + carry

ADD add two 32-bit values Rd = Rn + N

RSB reverse subtract of two 32-bit values Rd = N - Rn

RSCreverse subtract of two 32-bit values with carry Rd = N – Rn - !C

SBC subtract two 32-bit values with carry Rd = Rn - N - !C

SUB subtract two 32-bit values Rd = Rn - N

Syntax: <instruction>{cond}{S} Rd, Rn, N

Korea Univ

ARM Arithmetic Instructions

• ARM Arithmetic instructions include add, adc, sub, sbc and some more Check out the Architecture Reference Manual

for the list of all arithmetic instructions

5

High-level code

a = b + c

ARM assembly code

# R0 = a, R1 = b, R2 = cadd R0, R1, R2

compile

Korea Univ

Arithmetic Instructions – ADD

• ADD adds two operands, placing the result in Rd Use S suffix to update conditional field The addition may be performed on signed or unsigned numbers

6

ADD R0, R1, R2 ; R0 = R1 + R2 ADD R0, R1, #256 ; R0 = R1 + 256 ADDS R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1) and update flags

Korea Univ

add

add r1, r2, r3 # r1 <= r2 + r3

7

ARM architect defines the opcode

1110binary

hexadecimal 0xe082 1003

0000 00001000 0010 0001 0000 0011

1110 0 0 0010 0001 00000000 0011

Korea Univ

Immediate

• 8-bit immediate field in ARM instructions limits values to the range of (0 ~ 255 (28–1)) They are called immediates because they are

immediately available from the instructions• They do not require a register or memory access

8

Korea Univ

add

add r4, r5, #255 # r4 <= r5 + 255

9

ARM architect defines the opcode

1110binary

hexadecimal 0xe285 40ff

0010 00001000 0101 0100 1111 1111

1110 1 0 0101 0100 0000 1111 1111

Korea Univ

Rm with Barrel Shifter

10

add r0, r1, r2, LSL #1

Shift Operation (for Rm) Syntax

Immediate #immediateRegister RmLogical shift left by immediate Rm, LSL #shift_immLogical shift left by register Rm, LSL RsLogical shift right by immediate Rm, LSR #shift_immLogical shift right by register Rm, LSR Rs

Arithmetic shift right by immediate Rm, ASR #shift_imm

Arithmetic shift right by register Rm, ASR RsRotate right by immediate Rm, ROR #shift_immRotate right by register Rm, ROR RsRotate right with extend Rm, RRX

Encoded here

LSL: Logical Shift LeftLSR: Logical Shift RightASR: Arithmetic Shift RightROR: Rotate RightRRX: Rotate Right with Extend

add r0, r1, r2, LSL r3

Korea Univ

Arithmetic Instructions – SUB

• SUB subtracts operand 2 from operand 1, placing the result in Rd Use S suffix to update conditional field

The subtraction may be performed on signed or unsigned numbers

11

SUB R0, R1, R2 ; R0 = R1 - R2 SUB R0, R1, #256 ; R0 = R1 - 256 SUBS R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1) and update flags

Korea Univ

sub

sub r4, r5, #255 # r4 <= r5 - 255

12

ARM architect defines the opcode

1110binary

hexadecimal 0xe245 40ff

0010 00000100 0101 0100 1111 1111

1110 1 0 0101 0100 0000 1111 1111

ARM architect defines the opcode

Korea Univ

Examples

13

Before:

r0 = 0x0000_0000r1 = 0x0000_0002r2 = 0x0000_0001

SUB r0, r1, r2After:

r0 = 0x0000_0001r1 = 0x0000_0002r2 = 0x0000_0001

Before:

r0 = 0x0000_0000r1 = 0x0000_0005

ADD r0, r1, r1, LSL#1

After:

r0 = 0x0000_000Fr1 = 0x0000_0005

Korea Univ

Examples

14

Before: cpsr = nzcvr1 = 0x0000_0001

SUBS r1, r1, #1

After: cpsr = nZCvr1 = 0x0000_0000

• Why is the C flag set (C = 1)?

Korea Univ

Logical Instructions

15

ALU

Rn

Barrel Shifter

Rm

Rd

N

AND logical bitwise AND of two 32-bit values Rd = Rn & N

ORR logical bitwise OR of two 32-bit values Rd = Rn | N

EOR logical exclusive OR of two 32-bit values Rd = Rn ^ N

BIC logical bit clear Rd = Rn & ~N

Syntax: <instruction>{cond}{S} Rd, Rn, N

Korea Univ

ARM Logical Instructions

• ARM logical instructions include and, orr, eor, bic

• Logical instructions operate bit-by-bit on 2 source operands and write the result to the destination register

16

High-level code

a = b & c ;

ARM assembly code

# R0 = a, R1 = b, R2 = cand R0, R1, R2

compile

Korea Univ

Logical Instructions – AND

• AND performs a logical AND between the two operands, placing the result in Rd It is useful for masking the bits

17

AND R0, R0, #3 ; Keep bits zero and one of R0 and discard the rest

Korea Univ

Logical Instructions – EOR

• EOR performs a logical Exclusive OR between the two operands, placing the result in the destination register It is useful for inverting certain bits

18

EOR R0, R0, #3 ; Invert bits zero and one of R0

Korea Univ

Examples

19

Before: r0 = 0x0000_0000r1 = 0x0204_0608r2 = 0x1030_5070

ORR r0, r1, r2

After: r0 = 0x1234_5678

Before: r1 = 0b1111r2 = 0b0101

BIC r0, r1, r2

After: r0 = 0b1010

Korea Univ

AND, OR, and EOR Usages

• and, or, nor and is useful for masking bits

• Example: mask all but the least significant byte of a value: 0xF234012F AND 0x000000FF = 0x0000002F

or is useful for combining bit fields• Example: combine 0xF2340000 with 0x000012BC:

0xF2340000 OR 0x000012BC = 0xF23412BC

eor is useful for inverting certain bits: • Example: A EOR 3

20

Korea Univ

Comparison Instructions

21

ALU

Rn

Barrel Shifter

Rm

Rd

N

CMN compare negated Flags set as a result of Rn + N

CMP Compare Flags set as a result of Rn – N

TEQtest for equality of two 32-bit values Flags set as a result of Rn ^ N

TST test bits of a 32-bit value Flags set as a result of Rn & N

Syntax: <instruction>{cond}{S} Rn, N

• The comparison instructions update the cpsr flags according to the result, but do not affect other registers

• After the bits have been set, the information can be used to change program flow by using conditional execution

Korea Univ

Comparison Instructions – CMP

22

• CMP compares two values by subtracting the second operand from the first operand Note that there is no destination register It only update cpsr flags based on the execution result

CMP R0, R1;

Korea Univ

Move Instructions

23

ALU

Rn

Barrel Shifter

Rm

Rd

N MOV Move a 32-bit value into a register Rd = N

MVN Move the NOT of the 32-bit value into a register Rd = ~ N

Syntax: <instruction>{cond}{S} Rd, N

Korea Univ

Move Instructions – MOV

• MOV loads a value into the destination register (Rd) from another register, a shifted register, or an immediate value Useful to setting initial values and transferring data between

registers

It updates the carry flag (C), negative flag (N), and zero flag (Z) if S bit is set• C is set from the result of the barrel shifter

24* SBZ: should be zeros

MOV R0, R0; move R0 to R0, Thus, no effectMOV R0, R0, LSL#3 ; R0 = R0 * 8MOV PC, R14; (R14: link register) Used to return to callerMOVS PC, R14; PC <- R14 (lr), CPSR <- SPSR ; Used to return from interrupt or exception

Korea Univ

MOV Example

25

Before: cpsr = nzcvr0 = 0x0000_0000r1 = 0x8000_0004

MOVS r0, r1, LSL #1

After: cpsr = nzCvr0 = 0x0000_0008r1 = 0x8000_0004

Korea Univ

Branch Instructions

26

B branch pc = label

BL branch with link pc = labellr = address of the next instruction after the BL

Syntax: B{cond} label BL{cond} label

• A branch instruction changes the flow of execution or is used to call a function This type of instructions allows programs to have subroutines, if-then-else structures, and loops

Korea Univ

B, BL

• B (branch) and BL (branch with link) are used for conditional or unconditional branch BL is used for the subroutine (procedure, function) call

To return from a subroutine, use• MOV PC, R14; (R14: link register) Used to return to caller

• Branch target address Sign-extend the 24-bit signed immediate (2’s complement) to 30-bits

Left-shift the result by 2 bits

Add it to the current PC (actually, PC+8)

Thus, the branch target could be ±32MB away from the current instruction

27

Korea Univ

Examples

28

B forward ADD r1, r2,

#4ADD r0, r6,

#2ADD r3, r7,

#4forward:

SUB r1, r2, #4backward:

ADD r1, r2, #4

SUB r1, r2, #4

ADD r4, r6, r7

B backward

BL my_subroutine CMP r1, #5MOVEQ r1, #0…..

My_subroutine: < subroutine code >

MOV pc, lr // return from subroutine

Korea Univ

Memory Access Instructions

• Load-Store (memory access) instructions transfer data between memory and CPU registers Single-register transfer Multiple-register transfer Swap instruction

29

Korea Univ

Single-Register Transfer

30

LDR Load a word into a register Rd ← mem32[address]

STR Store a word from a register to memory Rd → mem32[address]

LDRB Load a byte into a register Rd ← mem8[address]

STRB Store a byte from a register to memory Rd → mem8[address]

LDRH Load a half-word into a register Rd ← mem16[address]

STRH Store a half-word into a register Rd → mem16[address]

LDRSB Load a signed byte into a register Rd ← SignExtend ( mem8[address])

LDRSH Load a signed half-word into a register Rd ← SignExtend ( mem16[address])

Korea Univ

LDR (Load Register)

31

• LDR loads a word from a memory location to a register The memory location is specified in a very flexible manner

with addressing mode

// Assume R1 = 0x0000_2000LDR R0, [R1] // R0 ← [R1]LDR R0, [R1, #16] // R0 ← [R1+16]; 0x0000_2010

Korea Univ

STR (Store Register)

32

• STR stores a word from a register to a memory location The memory location is specified in a very flexible manner

with a addressing mode

// Assume R1 = 0x0000_2000STR R0, [R1] // [R1] <- R0STR R0, [R1, #16] // [R1+16] <- R0

Korea Univ

Address Bus

0x0000

CPU Execution Example (ARM)

33

ARM CPU

r0

r1

r2

r3

r13

r14

32 bitsRegister File

R3+

Memory

Data Bus

add r2, r2, r3ldr r3, [r13, 8]ldr r2, [r13, 4]

0x002200220x00110011

PC (r15)0x00000x0004

0x00180x0014

0x00080x00040x0000ldr r2, [r13,

4]

ldr r3, [r13, 8]

add r2, r2, r3

0x00140x00110011

0x00220022

0x0004

0x0018

0x00080x0008

0x00220022

0x00110011

0x00330033

Assume that r13 contains 0x0010

Korea Univ

Load-Store Addressing Mode

34

Indexing Method Data Base Address register updated? Example

Preindex with writeback

Mem[base + offset] Yes (Base + offset) LDR r0, [r1, #4]!

Preindex Mem[base + offset] No LDR r0, [r1, #4]

Postindex Mem[base] Yes (Base + offset) LDR r0, [r1], #4

! Indicates that the instruction writes the calculated address back to the base address register

Before:

r0 = 0x0000_0000r1 = 0x0009_0000Mem32[0x0009_0000] = 0x01010101Mem32[0x0009_0004] = 0x02020202

After: r0 ← mem[0x0009_0004]r0 = 0x0202_0202r1 = 0x0009_0004

LDR r0, [r1, #4]!

LDR r0, [r1, #4]

LDR r0, [r1], #4

After: r0 ← mem[0x0009_0004]r0 = 0x0202_0202r1 = 0x0009_0000

After: r0 ← mem[0x0009_0000]r0 = 0x0101_0101r1 = 0x0009_0004

Korea Univ

(Assembly) Language

• There is no golden way to learn language• You got to use and practice to get used to

it

35

Korea Univ

Backup Slides

36