BLOG

Record, summarize, and improve.

arm汇编

汇编语言的

1、语法依赖于汇编器,mov $5, %eax vs mov eax, 5

2、指令集、寄存器名称等依赖于硬件平台

ARM:

mov r4, #1000 @ counter

mov r0, #7
start:
add r0,r0, #7

sub r4,r4,#1
cmp r4,#0
bge start

bx lr

The same code, for x86:

mov ecx, 1000 ; counter

mov eax,7
start:
add eax, 7

sub ecx,1
cmp ecx,0
jge start
ret

http://www.cs.uaf.edu/2011/spring/cs641/lecture/02_10_assembly.html

3、保护模式 ASM 依赖的 API、入口点定义、文件格式等等,同时受 OS 和硬件平台限制。

ARM处理器寻址方式:

  1. 立即数寻址

mov r0,#15

  1. 寄存器寻址

add r0,r1,r2

  1. 寄存器间接寻址(寄存器中的值作为操作数的地址,操作数本身存放在存储器中)

ldr r0,[r4]

  1. 寄存器移位寻址(操作数由寄存器中的数值做相应移位得到)

add r0,r1,r2,lsl,#1

  1. 基址变址寻址(将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址)

ldr r0,[r1,#4]

  1. 多寄存器寻址(一条指令完成多个寄存器值的传送,连续寄存器用“-”连接,不连续用“,”分隔)

ldmia r0!,{r1-r4}

  1. 相对寻址(以PC的当前值为基地址,指令中的地址标号为偏移量,两者相加后得到操作数的有效地址)

bl proc

  1. 堆栈寻址(使用r13堆栈指针指示当前的操作位置)

stmfd r13!,{r0-r4}

数据处理指令

数据传送指令

mov mvn

移位操作

lsl lsr asr ror rrx

算术指令

add adc sub sbc rsb rsc

逻辑运算指令

add orr eor bic

比较指令

cmp cmn tst teq

乘法指令

mul mla smull smlal umull umlal

数据加载与存储指令

数据加载与存储指令概述

ARM处理器是加载/存储体系结构的处理器,对存储器的访问只能通加载和存储指令实现 。数据加载与存储指令用于在存储器和处理器的寄存器之间传送数据。而其他类的指令只能操作寄存器。

(1)立即数可以加到基址寄存器,也可以从基址寄存器中减去这个数值

ldr r5,[r6,#0x08]

str r6,[r7],#-0x08

(2)寄存器可以加到基址寄存器,也可以从基址寄存器中减去这个数值

ldr r5,[r6,r3]

str r6,[r7],-r8

(3)寄存器移位格式由一个通用寄存器和一个立即数组成

ldr r3,[r2,r4,lsl #2]

ldr r3,[r2],-r4,lsr #3

(4)标号是一种简单的寻址方式,PC是隐含的基址寄存器,偏移量是语句中标号所在的地址和PC之间的差值

ldr r4,START

地址索引是指令的一个功能,作为指令的一部分,影响指令执行结果

ldr r5,[r6,#0x04] ;前索引

ldr r5,[r6,#0x04]! ;自动索引

ldr r5,[r6],#0x04 ;后索引

单寄存器加载与存储指令

ldr/str ldrb/strb ldrh/strh ldrsb/strsb

多寄存器加载与存储指令

ldm/stm

堆栈操作

ldr r13,=0x90010

ldr SP,=0x90010

stm/ldm

交换指令

swp swpb

分支指令

ARM程序有两种方法可以实现程序的跳转,一种是使用分支指令,另一种是直接向PC写入目标地址值。第一种方式跳转空间受到限制(当前指令前后32MB的地址空间),第二种则没有限制。

b label label表示一个符号地址,实际值是想对于当前PC值的一个偏移量,而不是一个绝对地址,值由汇编器计算,范围+-32MB

bl 跳转前将PC保存到LR中

bx 跳转并实现状态的切换,例如ARM到Thumb状态

blx 综上

程序状态寄存器访问指令

mrs/msr

协处理器指令

cdp ldc/stc mcr/mrc

异常指令

swi

ARM伪指令

adr 小范围地址读取

将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中(非字节对齐-255-255,字节对齐-1024-1024)

adrl 中等范围地址读取

比adr范围更大(非字节对齐-64-64KB,字节对齐-256-256KB)

ldr 大范围地址读取

ldr{cond} Rm,=addr

加载32位立即数或一个地址值到指定寄存器,与ldr指令不同的是伪指令有"="

nop

会被替换成arm中的空操作指令,可用于延时,例如mov r0,r0

GNU汇编器(as)伪操作

符号定义伪操作

数据定义伪操作

汇编控制伪操作

框架描述伪操作

信息报告伪操作

其他伪操作

参考manual