3.15号arm

汇编语言

1. 汇编语言的组成

汇编文件中由伪操作、伪指令、汇编指令以及代码注释这几部分组成

伪操作:
    ARM的汇编中伪操作以.为前缀,所有的伪操作不占用内存空间,编译汇编时告诉编译器怎么编译当前文件,主要用来修改汇编内容的  .text    .global   .globl  .end     .if  .else  .endif

伪指令:不是指令,但是伪指令也会占用指令内存,执行一条伪指令时也会让运算器进行相关运算

汇编指令:汇编指令执行时会让运算器进行相关运算
    数据处理指令
    跳转指令
    内存读写指令
    状态寄存器传送指令
    异常触发指令
    协处理器指令(不讲)

 注释:
        单行注释:@
        多行注释:/*  */
        条件注释: 
            .if 逻辑值
                指令段
            .else
                指令段
            .endif
解释:逻辑值为真,则执行上一段指令,逻辑值为假,则执行else下面的指令段

2.汇编指令格式

<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

opcode:汇编指令的指令码

code 条件码

s:当按照指令码对应的指令执行时程序的运行结果会影响到CPSR的条件位

RD:目标寄存器,指令运算的结果保存至目标寄存器中

RN:第一操作寄存器 参与运算的寄存器

shifter_operand:第二操作数 参与运算的数据,可以是寄存器,也可以是一个立即数

操作数前面需要加一个#

将第一操作寄存器的数值和第二操作数按照指令码进行运算,如果指令码后面有s后缀,运算的结果会影响CPSR条件位,指令的运行结果保存至目标寄存器中

3. 汇编指令---数据处理指令

3.1 数据搬移指令

功能:能够将指定的数值搬移到指定的寄存器中

mov{条件码} 目标寄存器,操作数

如果条件码对应的条件满足,则将操作数的值存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器

mvn{条件码} 目标寄存器,操作数

如果条件码对应的条件满足,则将操作数的值按位取反后存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器

3.2 立即数

立即数指的是可以直接当作指令的一部分去执行的数据。32位的指令空间中为操作数预留了12位的空间,12位空间分为两部分:低八位和高四位,从0-255范围内找一个数字,让这个数字循环右移偶数位,能够得到的数据就是立即数,否则就不是立即数

3.3 数据移位指令

算术左移:最高位移出,最低位补0

lsl{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值算术左移第二操作数对应的数值位数,结果保存到目标寄存器中

算术右移:最低位移出,最高位补0

 lsr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值算术右移第二操作数对应的数值位数,结果保存到目标寄存器中

循环右移:最低位移出,补到最高位

 ror{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值循环右移第二操作数对应的数值位数,结果保存到目标寄存器中

3.4 位运算指令

按位与:
and{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行与运算,运算的结果保存到目标寄存器中
按位或:
orr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行或运算,运算的结果保存到目标寄存器中
按位异或:
eor{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行异或运算,运算的结果保存到目标寄存器中
    
按位取反:
    mvn{条件码} 目标寄存器,操作数

按位清零
BIC{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行按位清零运算,运算的结果保存到目标寄存器中

3.5 算术运算指令

加法指令:
    add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数
    adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值
减法运算:
    sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数
    sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的取反值
逆向减法运算:
     rsb{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器
     rsc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器-cpsr寄存器c位的取反值

乘法运算:
    mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数

3.6 数据比较指令

cmp 第一操作寄存器,第二操作数
比较指令的本质就是两个比较的数3进行减法运算,而且运算的结果会影响到CPSR条件位

我们在比较指令执行完毕后其他的指令后面可以跟上指定的条件码,当该指令执行之前,先去判断条件码对应的条件是否满足,如果满足,则该指令执行,如果不满足,则该指令不执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值