ARM汇编指令特点

根据朱有鹏老师课程笔记整理而来:  

  (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行。

  (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。

两种不同风格的ARM指令

  ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]

  GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]

ARM汇编特点1LDR/STR架构

  ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。

  ldr(load register)指令将内存内容加载入通用寄存器。

  str(store register)指令将寄存器内容存入内存空间中。

  ldr/str组合用来实现 ARM CPU和内存数据交换。

ARM汇编特点2:8种寻址方式

  寄存器寻址                     mov r1, r2

  立即寻址                         mov r0, #0xFF00

  寄存器移位寻址              mov r0, r1, lsl #3

  寄存器间接寻址              ldr r1, [r2]

             [r2] 这一整体表示一个内存地址   内存地址在r2里面存放       r2相当于一个指针    指令的意思是把这个内存地址里面的值赋给r1

  基址变址寻址                 ldr r1, [r2, #4]                   表示在r2里面地址的基础上加4依次为地址  并取此地址里面的值赋给r1

  多寄存器寻址                 ldmia r1!, {r2-r7, r12}       r1里面的内存地址为基地址,从这个地址读出数据依次放在r2-r7以及r12中

  堆栈寻址                       stmfd sp!, {r2-r7, lr}          从栈地址连续访问数据放在寄存器中

  相对寻址                       beq flag

          Flag:

ARM汇编特点3:指令后缀

  同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:

  B(byte)功能不变,操作长度变为8位

  H(half word)功能不变,长度变为16位

  S(signed)功能不变,操作数变为有符号

  如 ldr ldrb ldrh ldrsb ldrsh

  S(S标志)功能不变,影响CPSR标志位

  如 mov和movs        movs r0, #0

ARM汇编特点4:条件执行后缀

ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,为0,为负…)

CMP R0,R1

BNE NoMatch

比如上一句,BNE隐含的使用的上一句CMP执行结果.NE后缀表示使用Z标志位.两句合起来的意思就是,如果R0,R1的值不相等,就跳转到NoMatch处执行.

注意,PC=R15,CPSR=R16

                                      

ARM汇编特点5:多级指令流水线

  为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级)允许多个操作同时处理,而非顺序执行。

                                        

PC指向正被取指的指令,而非正在执行的指令

时间: 2024-10-25 07:08:35

ARM汇编指令特点的相关文章

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

ARM汇编指令的一些总结-转

ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch dog timer mov r1, #0x53000000 //立即数寻址方式mov r2, #0x0str r2, [r1] MOV 没有什么好说的,只要掌握几个寻址方式就可以了,而且ARM的寻址方式比386的简单很多.立即数寻址方式,立即数要求以“#”作前缀,对于十六进制的 数,还要求在#后面

ARM汇编指令MCR/MRC学习

MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中.如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断. 指令的语法格式: MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} MCR2 p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>} 其中,<cond>为指令执行的条件码.当<

GNU ARM 汇编指令

http://blog.chinaunix.net/u2/87718/showart_1683402.html GNU ARM 汇编指令简介第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C代码执行.需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范. 一. Linux汇编行结构任何汇编行

ARM汇编指令

ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令. 一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转.Ⅰ.使用专门的跳转指令: Ⅱ.直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同

常用ARM汇编指令

一面学习,一面总结,一面记录. 下面是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令. 一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转. Ⅰ.使用专门的跳转指令: Ⅱ.直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用M

arm汇编指令的条件码

几乎所有的ARM指令都可以包含一个可选的条件码,句法中以{cond}来标识.可用的条件码如下面所示.几乎所有的ARM数据处理指令均可以根据执行结果来选择是否更新条件码标志,即在指令中包含后缀S. 条件玛 助记符 标志 含义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N清零 整数或零 0110 VS V置位 溢出 0111 VC V清零 未溢出 100