一. 带点的(一般都是ARM GNU伪汇编指令)


1. ".text"、".data"、".bss"

依次表示的是“以下是代码段”,
“以下是初始化数据段”,
“以下是未初始化数据段”。

2.".global"

定义一个全局符号,通常是为ld使用。比如经常看到的

.global _start

3.".ascii"、".byte"、".short"、".int"、".long"、".word"、".quad"

定义一个字符串,并为它分配空间
定义一个字节,并为它分配空间,占单字节,0x34
定义一个短整型,并为它分配空间,占双字节,0x1234
定义一个整型,并为它分配空间,占四字节,0x12345678
定义一个长整型,并为它分配空间,占四字节,0x12345678
定义一个字,并为它分配空间,
定义一个,并为它分配定义,占八字节,...
比如

.long 0x22011110//BWSCON

.long 0x00000700//BANKCON0

...

4.".abort"

停止汇编

5.".align"

.align absexpr1,absexpr2

以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值

6.".if .else .endif"

.if

.else

.endif:支持条件预编译

7.".include"

.include "file":包含指定的头文件,
可以把一个汇编常量定义放在头文件中

8.".comm"

.comm  symbol, length:

在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间

9.".equ"

.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间,相当于c语言中的#define。例如

.equ aaa,0x20000000

10.".macro .endm"

.macro: 定义一段宏代码,.macro表示代码的开始,.endm表示代码的结束,.exitm跳出宏,
示例如下:

.macro SHIFTLEFT a, b.if \b < 0

mov \a, \a, ASR #-\b

.exitm

.endif

mov \a, \a, LSL #\b

.endm

11.".req"

name .req register name: 为寄存器定义一个别名

12.".code"

.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令

13.".ltorg"

.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间

二.带下滑线的


1._start

汇编程序的缺省入口,但是可以更改,想要更改其他标志,到相应的链接脚本中去用ENTRY指明其他入口标志。标号可以直接认为是地址。

三.不带点的


1.mov--数据传送指令

它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量,比如

mov r1,r2

mov r1,#4096

这个立即数是小于0xff(65535)的数,如果大于65535,则用ldr指令赋值

2.b、bl--相对跳转指令

b只是跳转,而bl除跳转外还将返回地址(bl的下一条指令的地址)保存到lr寄存器中。其中跳转范围是当前指令的前后32M。

3.ldr、str--内存访问指令

ldr指令即可能是大范围的地址读取伪指令,也可能是内存访问指令,当它的第二个参数之前有“=”时,表示伪指令,否则是内存访问指令,比如

ldr r0, =0x53000000//r0=0x53000000

str r1, [r2, #4]         // 将r1的数据保存到地址为r2+4的内存单元中

str r1, [r2]                // 将r1的数据保存到地址为r2的内存单元中

str r1, [r2], #4         // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4

ldr r1, [r2,#4]         // 将地址为r2+4的内存单元数据读取到r1中

ldr r1, [r2]             // 将地址为r2的内存单元数据读取到r1中

ldr r1, [r2], #4         // 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4

作为变址方式有如下分类:

当ldr作为大范围地址读取伪指令,LDR伪指令用于加载32们的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或者MVN的范围,刚使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入字池,并使用一
条程序相对偏移的LDR指令从文字池读出常量。

作为寄存器的寻址,寄存器的间接寻址的3种方式

4.adr--小范围的地址读取(只有两个参数)

ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,刚产生错误,编译失败。比如

adr r0, delay//将标号delay的地址赋给r0

5.ldmia--多寄存器寻址

一条指令可以完成多个寄存器值的传递,可以完成最多16个通用寄存器值的传递。比如

ldmia r0, [r1, r2, r3, r4]

;r1 <- [r0]

;r2 <- [r0+4]

;r3 <- [r0+4*2]

;r4 <- [r0+4*3]

6.nop--空操作指令

什么都不做,可以用作延时。

7.add,sub--加法减法指令

共三个参数,将后边的两个参数操作并赋给第一个参数,比如

add r1, r1, r0//r1=r1+r0

sub r1, r1, r2//r1=r1-r2

//这两句的结果就是r1=r1+r0-r2

8.asr,lsl,lsr,ror,rrx,type rs

对于arm指令的基本格式如下:

对于operand2参数,如果能灵活使用,代码效率会很高。

桶型一位寄存器操作

9.cmp--比较指令

cspr

10.eq,ne,ce等--指令的条件域

所有的ARM指令都可以条件执行:指令的执行与否取决于CPSR寄存器的N,Z,CandV
每一条ARM指令包含4位的条件码位于指令的最高4位[31:28],条件码共16种,每个条件码可以用2个字符表示,这两个字符可以添加在指令助记符的后边和指令同时使用。
指令最高4位代表的条件域如下表

条件码

助记符后缀

标志

含义

0000

EQ

Z置位

相等

0001

NE

Z清零

不相等

0010

CS

C置位

无符号数大于或等于

0011

CC

C清零

无符号数小于

0100

MI

N置位

负数

0101

PL

N清零

正数或零

0110

VS

V置位

溢出

0111

VC

V清零

未溢出

1000

HI

C置位Z清零

无符号数大于

1001

LS

C清零Z置位

无符号数小于或等于

1010

GE

N等于V

带符号数大于或等于

1011

LT

N不等于V

带符号数小于

1100

GT

Z清零且(N等于V)

带符号数大于

1101

LE

Z置位或(N不等于V)

带符号数小于或等于

1110

AL

忽略

无条件执行

例如

cmp r0, r1

beq func//如果r1==r0,则跳转到func标志地址上去

cmp r0, r1

beq func//如果r1!=r0,则跳转到func标志地址上去

11.R13,R14寄存器--sp,lr

sp是堆栈指针,lr是链接地址寄存器。R13作为sp,R14作为lr。

对于链接地址寄存器,它的作用有两个:

1,当使用bl指令调用子程序时,系统会自动将 bl指令的下一条指令的地址存入lr中。

执行过程如下图

①,程序A正常执行到BL Lable然后转到程序B中去

②,系统将BL Lable的下一句NEXT的地址放到LR中去

③,执行完B的程序后,执行一个MOV PC,LR将NEXT的地址给到当前pc值

④,继续执行程序A下面的语句

2,当发生异常时,系统自动将异常的返回地址放入R14中(有些异常有一个小的固定的偏移量)。

11.逻辑运算指令--

;按位与

AND Rd, Rn                                 ; Rd &= Rn

AND.W Rd, Rn, #imm12           ; Rd = Rn & imm12

AND.W Rd, Rm, Rn                    ; Rd = Rm & Rn

;按位或

ORR Rd, Rn                                  ; Rd |= Rn

ORR.W Rd, Rn, #imm12            ; Rd = Rn | imm12

ORR.W Rd, Rm, Rn                     ; Rd = Rm | Rn

 

;按位清零

BIC Rd, Rn                                    ; Rd &= ~Rn

BIC.W Rd, Rn, #imm12             ; Rd = Rn & ~imm12

BIC.W Rd, Rm, Rn                      ; Rd = Rm & ~Rn

 

;按位或反

ORN.W Rd, Rn, #imm12          ; Rd = Rn | ~imm12

ORN.W Rd, Rm, Rn                   ; Rd = Rm | ~Rn

 

;按位异或

EOR Rd, Rn                                 ; Rd ^= Rn

EOR.W Rd, Rn, #imm12           ; Rd = Rn ^ imm12

EOR.W Rd, Rm, Rn                    ; Rd = Rm ^ Rn

 

;逻辑左移

LSL Rd, Rn, #imm5                  ; Rd = Rn<<imm5

LSL Rd, Rn                                 ; Rd <<= Rn

LSL.W Rd, Rm, Rn                   ; Rd = Rm<<Rn

 

;逻辑右移

LSR Rd, Rn, #imm5                ; Rd = Rn>>imm5

LSR Rd, Rn                               ; Rd >>= Rn

LSR.W Rd, Rm, Rn                  ; Rd = Rm>>Rn

 

;算术右移

ASR Rd, Rn, #imm5                 ; Rd = Rn>> imm5

ASR Rd, Rn                                ; Rd =>> Rn

ASR.W Rd, Rm, Rn                   ; Rd = Rm>>Rn

 

;循环右移

ROR Rd, Rn ;

ROR.W Rd, Rm, Rn ;

四.汇编中的注释


(1) @ 表示注释从当前位置到行尾的字符.

(2) # 注释掉一整行.

(3) ; 新行分隔符.

五.汇编中的常数


(1)十进制数以非0数字开头,如:123和9876;

(2)二进制数以0b开头,其中字母也可以为大写;

(3)八进制数以0开始,如:0456,0123;

(4)十六进制数以0x开头,如:0xabcd,0X123f;

(5)字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!/n”;

(6)当前地址以“.”表示,在汇编程序中可以使用这个符号代表当前指令的地址;

(7)表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“<>”表示不相等,其他的符号如:+、-、*、/、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、||跟C语言中的用法相似。

六.汇编程序较好的格式


版权声明:本文为博主原创文章,未经博主允许不得转载。

ARM中的---汇编指令的更多相关文章

  1. [zhuan]arm中的汇编指令

    http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令)   1. ".text& ...

  2. ARM中的汇编指令

    Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行, 指令都是32bit的,高四位是条件码[31:28], Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节 ...

  3. C表达式中的汇编指令

    C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...

  4. C 表达式中的汇编指令

    asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifier ...

  5. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

  6. C/C++中书写汇编指令

    汇编语言的指令格式目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM.NASM,Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法. ...

  7. arm中的ldr指令

    label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.

  8. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  9. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

随机推荐

  1. Django 源码安装及使用

    首先我们使用的是最新版的CentOS系统:CentOS 7.4 在安装django之前,我们首先保证系统中已经安装好setuptools Django安装: 1.首先我们在Django官网下载最新版本 ...

  2. Zznu 1913: yifan and matrix (多路归并)

    题目链接: 1913: yifan and matrix 题目描述: 有一个n*n的矩阵,在每一行取出一个数,可以得到n个数的和,问前n小的和分别是多少? 解题思路: 对于两个数组a[n],b[n], ...

  3. Hello!六月

    把这里当做记事本应该没人介意吧: 太忙了!六月! ACM: 背包九讲

  4. ACM_棋棋棋棋棋(规律题)

    棋棋棋棋棋 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在遥远的K次元空间,一年一度的GDUFE-GAME又开始了.每年的GD ...

  5. 使用dubbox开发REST应用

    新建项目,添加Maven支持. 在pom.xml中添加依赖. <dependency> <groupId>org.jboss.resteasy</groupId> ...

  6. 451 Sort Characters By Frequency 根据字符出现频率排序

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...

  7. WCF入门大致思路

    WCF服务: 1.IServer.cs(类似接口,WCF接口) 2.Server.svc(实现了WCF接口)右键浏览器运行可以看到WCF服务链接,类似(http://localhost:4609/Us ...

  8. 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...

  9. ReactJS-1-基本使用

    JSX使用 一.为什么使用JSX?React的核心机制之一就是虚拟DOM:可以在内存中创建的虚拟DOM元素.但是用js创建虚拟dom可读性差,于是创建了JSX,继续使用HTML代码创建dom,增加可读 ...

  10. 4 Visual Effects 视觉效果 读书笔记 第四章

    4   Visual Effects    视觉效果        读书笔记 第四章 Well, circles and ovals are good, but how about drawing r ...