嵌入式之ARM汇编

汇编语言长什么的样子呢?

  • 举例:向寄存器中一个值添加100
    x86:add eax,#100
    68K:ADD #100,D0
    ARM:add r0,r0,#100

  • 举例:从一个寄存器指针加载到寄存器
    x86:mov eax,DWORD PTR[ebx]
    68K:MOVE L (A0),D0
    ARM:ldr r0,[r1]

  • 举例:ARM起始代码结构
    在这里插入图片描述

  • ARM汇编指令格式
    Operation[cond]{status} Rd,Rn, Operand2

ARM汇编

指令条件和状态Status码

  • 条件码(cond)
    在这里插入图片描述
  • 状态码(Status)

在这里插入图片描述

ARM汇编寻址方式

  • 立即数寻址
    ADD R0,R0,#0x3F
  • 寄存器寻址:
    ADD R0,R1,R2
  • 寄存器间接寻址
    LDR R0,[R1]
    STR R0,[R1]
  • 寄存器移位寻址
    ADD R3,R2,R1,LSL #2 (R1 左移两位再加上R1,然后赋值给R3)
  • 基址地址寻址
    LDR R0,[R1,#4] (把R1地址加上4所指向的值赋值给R0)
    LDR R0,[R1],#4(把R1地址取出的值加上4赋值给R0)
    LDR R0,[R1,R2]
  • 多寄存器寻址
    LDMIA R0,{R1,R2,R3,R4}
  • 相对寻址
    BL NEXT (跳转到NEXT)
    MOV PC,LR

数据操作(ALU操作)

在这里插入图片描述
在这里插入图片描述

逻辑操作(与,或,非,异或)

在这里插入图片描述

比较操作

在这里插入图片描述

内存操作

单寄存器读写指令
在这里插入图片描述
多寄存器读写指令
在这里插入图片描述

  • 地址模式
    (1)数据块模式:IA(传输后地址加4),IB(传输前地址加4),DA(传输后地址减4),DB(传输前地址减4)
    (2)堆栈模式:满底层堆栈,EA(空递减堆栈),FD(满递减堆栈),ED(空递增堆栈),FA(满递增堆栈)

数据交换指令
在这里插入图片描述

跳转,状态操作

OpcodeOperandsDescriptionFunction
B跳转指令pc<-label
BL带返回的连接跳转pc->-label
BX跳转并切换状态Thumb
BLX带返回的跳转并切换状态Thumb

状态寄存器操作

状态寄存器操作:把32位指令分为四个域:[7:0]控制位域c,[15:8]扩展位域x,[23:16]状态位域s,[31:24]条件标志位域f

OpcodeOperandsDescriptionFunction
MRS把程序状态寄存器的值传送到通用寄存器
MSRCPSR R0 ;SPSR,R0;CPSR_c R0通用寄存器到程序状态寄存器

异常产生指令

OpcodeOperandsDescriptionFunction
SWISWI 0x02软中断指令
BKPTBKPT断点中断指令

ARM伪指令

在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。

  • 基本常用伪指令
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
汇编语言程序中常用的符号
  • 符号命名约定:
    (1)符号区分大小写,同名的大小写符号会被编译器认为是两个不同的符号。
    (2)符号在其作用范围内必须唯一。
    (3)自定义的符号不能与系统的保留字相同。
    (4)符号名不应与指令或伪指令同名
  • 符号,变量
    ARM(Thumb)汇编程序所支持的变量有数字变量,逻辑变量和字符串变量
    在这里插入图片描述
  • 常量
    (1)数字常量一般是32位的整数,当作为无符号数时,其取值范围为0 ~ 232-1,当作为有符号数时,其取值范围为-231 ~ 231-1
    (2)逻辑常量只有两种取值情况:真或假
    (3)字符串常量为一个固定的字符串,一般用于程序运行时的信息提示
  • 变量代换符
    程序中的变量可通过代换操作取得一个常量。代换操作符为:“”$“”
    Sample:
LCLS S1
LCL S2
S1 SETS "Test!"
S2 SETS "This is a  $S1"   ;字符串变量S2的值为    This is a Test!
  • 表达式和运算符
    在这里插入图片描述
寄存器操作

寄存器操作
在这里插入图片描述

数据定义伪汇编

数据定义伪汇编
在这里插入图片描述
在这里插入图片描述

控制伪指令

在这里插入图片描述
Sample:

GBLL Test ;声明一个全局的逻辑变量,变量名为Test
……
IF Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF


GBLA Counter ;声明一个全局的数学变量,变量名为Counter 
Counter SETA 3 ;由变量Counter控制循环次数 
…… 
WHILE Counter < 10 
指令序列 
WEND


MACRO
$OP hello world $param1,$param2
MOV R3,#0x02
MEXIT
MEND
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值