arm instruction set & assembly language programming

60
ARM Instruction Set & Assembly Language Programming Jianjian SONG Software Institute, Nanjing University

Upload: talia

Post on 21-Jan-2016

192 views

Category:

Documents


0 download

DESCRIPTION

ARM Instruction Set & Assembly Language Programming. Jianjian SONG Software Institute, Nanjing University. Content. ARM Architecture Introduction ARM Instruction Set ARM Assembly Language Programming. 2. ARM Architecture Introduction. ARM ( A dvanced R ISC M achines) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ARM Instruction Set &  Assembly Language Programming

ARM Instruction Set & Assembly Language Programming

Jianjian SONGSoftware Institute, Nanjing University

Page 2: ARM Instruction Set &  Assembly Language Programming

Content ARM Architecture Introduction ARM Instruction Set ARM Assembly Language

Programming

Page 3: ARM Instruction Set &  Assembly Language Programming

2. ARM Architecture Introduction

ARM (Advanced RISC Machines) 既可以认为是一个公司的名字,也可以认为

是一类微处理器的通称,还可以认为是一种技术的名字。

ARM 公司是一家设计公司,是 IP (Intellectual Property) 供应商,靠转让设计许可证由合作伙伴生产各具特色的芯片。

http://www.arm.com

Page 4: ARM Instruction Set &  Assembly Language Programming

ARM 的特点 ARM 具有 RISC 体系的一般特点:

大量寄存器 绝大多数操作都在寄存器中进行,通过 Load/

Store 的在内存和寄存器间传递数据。 寻址方式简单 采用固定长度的指令格式

此外, 小体积、低功耗、低成本、高性能 16 位 /32 位双指令集 全球众多合作伙伴

Page 5: ARM Instruction Set &  Assembly Language Programming

ARM 体系结构的扩充 Thumb (T variant):

16 位指令集,用以改善指令密度; Long Multiplication (M variant):

增加两条用于长乘法操作的指令; DSP (E variant):

用于 DSP 应用的算术运算指令集; Jazeller (J variant):

允许直接执行 Java 字节码什么是指令密度?

执行同等操作序列的前提下,单位内存空间所容纳的机器指令数。

什么是指令密度?

执行同等操作序列的前提下,单位内存空间所容纳的机器指令数。

Page 6: ARM Instruction Set &  Assembly Language Programming

ARM 处理器系列 ARM7 系列 ARM9 系列 ARM9E 系列 ARM10 系列 SecureCore 系列 Intel StrongARM Intel XScale

Page 7: ARM Instruction Set &  Assembly Language Programming

3. ARM Instruction Set Assembly language ARM programming model ARM memory organization ARM data operations ARM flow of control

Page 8: ARM Instruction Set &  Assembly Language Programming

Assembly language

What is assembly language and why assembly language?

One-to-one with instructions (more or less). Basic features:

One instruction per line. Labels provide names for addresses (usually in

first column). Instructions often start in later columns. Columns run to end of line.

Page 9: ARM Instruction Set &  Assembly Language Programming

ARM assembly language example

label1 ADR r4,c

LDR r0,[r4] ; a comment

ADR r4,d

LDR r1,[r4]

SUB r0,r0,r1 ; comment

Page 10: ARM Instruction Set &  Assembly Language Programming

ARM 指令的一般编码格式

cond 00 X opcode S Rn Rd Shifter-operand

31 28 27 26 25 24 21 20 19 16 15 12 11 0

opcode: 指令操作符编码cond: 指令执行条件编码S: 指令的操作是否影响 CPSR 的值Rn: 包含第一个操作数的寄存器编码Rd: 目标寄存器编码Shifter_operand: 第二个操作数

符号表示:

<opcode>{<cond>}{<S>} <Rd>, <Rn>, <shifter-operand>

符号表示:

<opcode>{<cond>}{<S>} <Rd>, <Rn>, <shifter-operand>

Page 11: ARM Instruction Set &  Assembly Language Programming

ARM Addressing Modes (preliminary) 寄存器寻址

例: ADD R0 , R1 , R2 ; (R1)+(R2)→R0 立即数寻址

例: ADD R3 , R3 , #2 ; (R3)+2→R3 寄存器间接寻址

例: LDR R0 , [R3] ; ((R3))→R0 寄存器变址

例: LDR R0 , [R1, #4] ; ((R1)+4)→R0 相对寻址

例: B rel ; (PC)+offset→PC

Page 12: ARM Instruction Set &  Assembly Language Programming

Pseudo-ops

Some assembler directives don’t correspond directly to instructions: Define current address. Reserve storage. Constants.

Page 13: ARM Instruction Set &  Assembly Language Programming

ARM programming model

r0r1r2r3r4r5r6r7

r8r9

r10r11r12r13r14

r15 (PC)

CPSR

31 0

N Z C V

Page 14: ARM Instruction Set &  Assembly Language Programming

ARM status bits

Every arithmetic, logical, or shifting operation sets CPSR bits: N (negative), Z (zero), C (carry), V

(overflow). Examples:

-1 + 1 = 0: NZCV = 0110. 231-1+1 = -231: NZCV = 0101.

Page 15: ARM Instruction Set &  Assembly Language Programming

ARM data types

Word is 32 bits long. Word can be divided into four 8-bit

bytes. ARM addresses can be 32 bits long. Address refers to byte.

Address 4 starts at byte 4. Can be configured at power-up as

either little- or big-endian mode.

Page 16: ARM Instruction Set &  Assembly Language Programming

Instructions Overview

Data instructions Load/Store instructions Move Instructions Comparison instructions Branch instructions

Page 17: ARM Instruction Set &  Assembly Language Programming

ARM data instructions

Basic format:ADD r0,r1,r2 Computes r1+r2, stores in r0.

Immediate operand:ADD r0,r1,#2 Computes r1+2, stores in r0.

Page 18: ARM Instruction Set &  Assembly Language Programming

ARM data instructions

ADD, ADC : add (w. carry)

SUB, SBC : subtract (w. carry)

RSB, RSC : reverse subtract (w. carry)

MUL, MLA : multiply (and accumulate)

AND, ORR, EOR BIC : bit clear LSL, LSR : logical

shift left/right ASL, ASR : arithmetic

shift left/right ROR : rotate right RRX : rotate right

extended with C

Page 19: ARM Instruction Set &  Assembly Language Programming

Data operation varieties

Logical shift: fills with zeroes.

Arithmetic shift: fills with zeroes or ones.

RRX performs 33-bit rotate, including C bit from CPSR above sign bit.

Page 20: ARM Instruction Set &  Assembly Language Programming

ARM load/store instructions

LDR, LDRH, LDRB : load (half-word, byte)

STR, STRH, STRB : store (half-word, byte)

Addressing modes: register indirect : LDR r0,[r1] with second register : LDR r0,[r1,-r2] with constant : LDR r0,[r1,#4]

Page 21: ARM Instruction Set &  Assembly Language Programming

ARM ADR pseudo-op

Cannot refer to an address directly in an instruction.

Generate value by performing arithmetic on PC.

ADR pseudo-op generates instruction required to calculate address:ADR r1,FOO

Page 22: ARM Instruction Set &  Assembly Language Programming

伪指令 ADR

ADR{cond} register, expr 将基于 PC 的地址值或基于寄存器的地址值读取到寄存器中 汇编替换成一条指令

ADRL ADRL{cond} register, expr ADRL 伪指令比 ADR 读取更大的地址范围。 汇编替换为两条指令

LDR LDR{cond} register, =[expr | label_expr] 将一个 32 位的常数或地址值读取到寄存器中

NOP 空操作,如 MOV R0, R0

Page 23: ARM Instruction Set &  Assembly Language Programming

ARM move instructions

MOV, MVN : move (negated)

MOV r0, r1 ; r0 <- r1

Page 24: ARM Instruction Set &  Assembly Language Programming

ARM comparison instructions

CMP : compare CMN : negated compare TST : bit-wise test TEQ : bit-wise negated test These instructions set only the

NZCV bits of CPSR.

Page 25: ARM Instruction Set &  Assembly Language Programming

ARM branch instructions

B: Branch BL: Branch and Link

Page 26: ARM Instruction Set &  Assembly Language Programming

Example: C assignments

C: x = (a + b) - c;

Assembler:ADR r4,a ; get address for a

LDR r0,[r4] ; get value of a

ADR r4,b ; get address for b, reusing r4

LDR r1,[r4] ; get value of b

ADD r3,r0,r1 ; compute a+b

ADR r4,c ; get address for c

LDR r2,[r4] ; get value of c

Page 27: ARM Instruction Set &  Assembly Language Programming

C assignment, cont’d.

SUB r3,r3,r2 ; complete computation of x

ADR r4,x ; get address for x

STR r3,[r4] ; store value of x

Page 28: ARM Instruction Set &  Assembly Language Programming

Example: C assignment

C:y = a*(b+c);

Assembler:ADR r4,b ; get address for b

LDR r0,[r4] ; get value of b

ADR r4,c ; get address for c

LDR r1,[r4] ; get value of c

ADD r2,r0,r1 ; compute partial result

ADR r4,a ; get address for a

LDR r0,[r4] ; get value of a

Page 29: ARM Instruction Set &  Assembly Language Programming

C assignment, cont’d.

MUL r2,r2,r0 ; compute final value for y

ADR r4,y ; get address for y

STR r2,[r4] ; store y

Page 30: ARM Instruction Set &  Assembly Language Programming

Example: C assignment

C:z = (a << 2) | (b & 15);

Assembler:ADR r4,a ; get address for a

LDR r0,[r4] ; get value of a

MOV r0,r0,LSL 2 ; perform shift

ADR r4,b ; get address for b

LDR r1,[r4] ; get value of b

AND r1,r1,#15 ; perform AND

ORR r1,r0,r1 ; perform OR

Page 31: ARM Instruction Set &  Assembly Language Programming

C assignment, cont’d.ADR r4,z ; get address for z

STR r1,[r4] ; store value for z

Page 32: ARM Instruction Set &  Assembly Language Programming

Additional addressing modes

Base-plus-offset addressing:LDR r0,[r1,#16] Loads from location r1+16

Auto-indexing increments base register:LDR r0,[r1,#16]!

Post-indexing fetches, then does offset:LDR r0,[r1],#16 Loads r0 from r1, then adds 16 to r1.

Page 33: ARM Instruction Set &  Assembly Language Programming

ARM flow of control

All operations can be performed conditionally, testing CPSR: EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS,

GE, LT, GT, LE Branch operation:

B #100 Can be performed conditionally.

Page 34: ARM Instruction Set &  Assembly Language Programming

Example: if statement

C: if (a < b) { x = 5; y = c + d; } else x = c - d;

Assembler:; compute and test condition

ADR r4,a ; get address for aLDR r0,[r4] ; get value of aADR r4,b ; get address for bLDR r1,[r4] ; get value for bCMP r0,r1 ; compare a < bBGE fblock ; if a >= b, branch to false block

Page 35: ARM Instruction Set &  Assembly Language Programming

If statement, cont’d.

; true blockMOV r0,#5 ; generate value for xADR r4,x ; get address for xSTR r0,[r4] ; store xADR r4,c ; get address for cLDR r0,[r4] ; get value of cADR r4,d ; get address for dLDR r1,[r4] ; get value of dADD r0,r0,r1 ; compute yADR r4,y ; get address for ySTR r0,[r4] ; store yB after ; branch around false block

Page 36: ARM Instruction Set &  Assembly Language Programming

If statement, cont’d.

; false block

fblock ADR r4,c ; get address for c

LDR r0,[r4] ; get value of c

ADR r4,d ; get address for d

LDR r1,[r4] ; get value for d

SUB r0,r0,r1 ; compute a-b

ADR r4,x ; get address for x

STR r0,[r4] ; store value of x

after ...

Page 37: ARM Instruction Set &  Assembly Language Programming

Example: Conditional instruction implementation

; true block

MOVLT r0,#5 ; generate value for x

ADRLT r4,x ; get address for x

STRLT r0,[r4] ; store x

ADRLT r4,c ; get address for c

LDRLT r0,[r4] ; get value of c

ADRLT r4,d ; get address for d

LDRLT r1,[r4] ; get value of d

ADDLT r0,r0,r1 ; compute y

ADRLT r4,y ; get address for y

STRLT r0,[r4] ; store y

Page 38: ARM Instruction Set &  Assembly Language Programming

Example: switch statement

C: switch (test) { case 0: … break; case 1: … }

Assembler:ADR r2,test ; get address for testLDR r0,[r2] ; load value for testADR r1,switchtab ; load address for switch tableLDR r15,[r1,r0,LSL #2] ; index switch table

switchtab DCD case0DCD case1

...

Page 39: ARM Instruction Set &  Assembly Language Programming

Example: FIR filter

C:for (i=0, f=0; i<N; i++)

f = f + c[i]*x[i];

Assembler; loop initiation code

MOV r0,#0 ; use r0 for I

MOV r8,#0 ; use separate index for arrays

ADR r2,N ; get address for N

LDR r1,[r2] ; get value of N

MOV r2,#0 ; use r2 for f

Page 40: ARM Instruction Set &  Assembly Language Programming

FIR filter, cont’.d

ADR r3,c ; load r3 with base of cADR r5,x ; load r5 with base of x

; loop bodyloop LDR r4,[r3,r8] ; get c[i]

LDR r6,[r5,r8] ; get x[i]MUL r4,r4,r6 ; compute c[i]*x[i]ADD r2,r2,r4 ; add into running sumADD r8,r8,#4 ; add one word offset to array indexADD r0,r0,#1 ; add 1 to iCMP r0,r1 ; exit?BLT loop ; if i < N, continue

Page 41: ARM Instruction Set &  Assembly Language Programming

ARM subroutine linkage

Branch and link instruction:BL foo Copies current PC to r14.

To return from subroutine:MOV r15,r14

Page 42: ARM Instruction Set &  Assembly Language Programming

Nested subroutine calls

Nesting/recursion requires coding convention:

f1 LDR r0,[r13] ; load arg into r0 from stack

; call f2()

STR r13!,[r14] ; store f1’s return adrs

STR r13!,[r0] ; store arg to f2 on stack

BL f2 ; branch and link to f2

; return from f1()

SUB r13,#4 ; pop f2’s arg off stack

LDR r13!,r15 ; restore register and return

Page 43: ARM Instruction Set &  Assembly Language Programming

Summary

Load/store architecture Most instructions are RISCy,

operate in single cycle. Some multi-register operations take

longer. All instructions can be executed

conditionally.

Page 44: ARM Instruction Set &  Assembly Language Programming

4. ARM Assembly Language Programming

Why and when to use? AT&T format and Intel format Grammar of ARM assembly

language Examples

Page 45: ARM Instruction Set &  Assembly Language Programming

Why and when to use?

操作系统内核中的底层程序直接与硬件打交道,需要用到的专用指令。

CPU 中的特殊指令 频繁使用代码的时间效率 程序的空间效率 ( 如操作系统的引导程

序 )Refer to “Linux 内核源代码情景分析” ( 浙江大学出版社 )1.5 节Refer to “Linux 内核源代码情景分析” ( 浙江大学出版社 )1.5 节

Page 46: ARM Instruction Set &  Assembly Language Programming

AT&T format and Intel format

Page 47: ARM Instruction Set &  Assembly Language Programming

Grammar of ARM assembly language

语句 程序格式

Page 48: ARM Instruction Set &  Assembly Language Programming

语句 语句

指令 伪操作 宏

语句格式 { symbol } { instruction | directive |

pseudo-instruction } { ;comment }

Page 49: ARM Instruction Set &  Assembly Language Programming

伪操作 符号定义伪操作 数据定义伪操作 汇编控制伪操作 框架描述伪操作 信息报告伪操作 其它伪操作

Page 50: ARM Instruction Set &  Assembly Language Programming

关于变量的伪操作 声明一个全局变量,并初始化

GBLA, GBLL, GBLS 声明一个局部变量,并初始化

LCLA, LCLL, LCLS 变量赋值

SETA, SETL, SETS

Page 51: ARM Instruction Set &  Assembly Language Programming

Example

GBLA objectsize ; 声明一个全局的算术变量objectsize SETA 0xff ; 给该变量赋值SPACE objectsize ; 使用该变量

GBLL statusBstatusB SETL {TRUE}

Page 52: ARM Instruction Set &  Assembly Language Programming

关于数据常量的伪操作 EQU

name EQU expr {, type} 通常在 .inc 文件中

Page 53: ARM Instruction Set &  Assembly Language Programming

分配内存单元 SPACE

{label} SPACE bye_num 分配一块内存单元,并用 0 初始化

DCB {label} DCB expr, {expr} 分配一段字节内存单元,并用 expr 初始化

DCD {label} DCD expr, {expr} 分配一段字内存单元 ( 分配的内存都是字对齐的 ),

并用 expr 初始化

Page 54: ARM Instruction Set &  Assembly Language Programming

MACRO and MEND 子程序与宏

在子程序比较短,而需要传递的参数比较多的情况下使用宏汇编技术

宏定义体 MACRO: 宏定义的开始 MEND: 宏定义的结束 通常在 .mac 文件中

格式 MACRO {$label} macroname {$para1, $para2, ...} ... ;code MEND

Page 55: ARM Instruction Set &  Assembly Language Programming

Example

MACRO $label xmac $p1 ... ;code$label.loop1 ; 宏定义体的内部标号 ... ;code BGE $label.loop1$label.loop2 ; 宏定义体的内部标号 ... ;code BL $p1 ;参数 p1 是一个子程序的名称 BGT $label.loop2 ... ;code MEND

Page 56: ARM Instruction Set &  Assembly Language Programming

Example (cont’d) “abc xmac subr1”调用宏展开后的结果

... ;codeabcloop1 ; 内部标号 label 被 abc 代替 ... ;code BGE abcloop1 ; 内部标号 label 被 abc 代替abcloop2 ; 内部标号 label 被 abc 代替 ... ;code BL subr1 ; 参数 p1被实际值 subr1 代替 BGT abcloop2 ... ;code

Page 57: ARM Instruction Set &  Assembly Language Programming

其它伪操作 AREA: 定义一个代码段或数据段

AREA sectionname {, attr1} {, attr2} ENTRY: 程序入口点 END: 源程序结束

Page 58: ARM Instruction Set &  Assembly Language Programming

其它伪操作 (cont’d)

GET/INCLUDE INCLUDE filename

EXPORT EXPORT symbol {[WEAK]}

IMPORT IMPORT symbol {[WEAK]}

Page 59: ARM Instruction Set &  Assembly Language Programming

程序格式 以段为单位组织源文件

代码段和数据段 AREA 伪操作

Example

Page 60: ARM Instruction Set &  Assembly Language Programming

Review

Computer architecture and ARM architecture

Instruction set Assembly language programming

Program structure Statements