欢迎光临
我们一直在努力

ARM汇编

mov指令:加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器

mov r0, #2 ;加载立即数2到寄存器r0,MOV{S}<c> <Rd>, #<const>

mov r1, r0 ;将r0寄存器的值加载到r1,MOV{S}<c> <Rd>, <Rm>

  逻辑右移(LSR):最高位补0,不考虑数值的符号位(无符号数)

        1011 0010 >>(LSR) 1: 0101 1001

算术右移(ASR):最高位补符号位,考虑数值的符号位(有符号数)

        1011 0010 >>(ASR) 1:1101 1001

循环右移(ROR):循环将每次移出的最低位补到最高位

        1011 0010 >>(ROR) 1 : 0101 1001 >>(ROR) 1:1010 1100  

add指令:

ADD{S}<c> <Rd>, <Rn>, #<const>

ADDS}<c> <Rd>, <Rn>, <Rm>{, <shift>}

sub指令:

SUB{S}<c> <Rd>, <Rn>, #<const>

SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

立即数:

        如果某个数的数值范围是0~0xFF之间,那么这个数一定是立即数;

        把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;

        这个数的二进制序列凑够8位之后的的右边必须为偶数个连续的 0

ldr指令:

        功能1:将非立即数加载到通用寄存器

        功能2:将RAM中的数据加载到通用寄存器

                        LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}] 

str指令: 将通用寄存器中的值写入到RAM中

bic指令:将某个通用寄存器清0(操作数中为bit1的位清0),清0结果写回到通用寄存器

orr指令:将某个通用寄存器置1(操作数中为bit1的位置1),置1结果写回到通用寄存器

stmfd:入栈保护

        STMFD<c> <Rn>{!}, <registers>

        stmfd sp!, <r0,r1,lr>

ldmfd:出栈恢复

        LDMFD<c> <Rn>{!}, <registers>

        ldmfd sp!, <r0, r1, lr>

b指令:实现无条件跳转指令

        b 条件分支

        b 循环

        b 函数调用

bl指令:函数跳转前,会将函数返回地址保存到lr寄存器

bx指令:bx lr 等价于mov pc, lrbx指令加一个地址

mrs指令:读取某个特殊寄存器(cpsr)的值到通用寄存器

msr指令:将通用寄存器中的值写入到特殊寄存器(cpsr)

栈分类:满增栈 、空增栈 、满减栈 、空减栈

        增栈:入栈时,sp指针往上走

        减栈:入栈时,sp指针往下走

        空栈:先写数据,再挪指针

        满栈:先挪指针,再写数据

ARM采用满减栈。

汇编调用C函数:

        当参数小于等于4个时,通过通用寄存器进行传参(R0 – R3

        当参数超过4个时,必须通过栈进行传参(入栈保护 出栈恢复)

        C语言将函数运行结果返回给R0寄存器

C调用汇编函数:

        C语言向汇编函数传参,参数会被保存到通用寄存器

        汇编函数的结果通过R0寄存器返回给C语言

赞(0)
未经允许不得转载:171主机测评 » ARM汇编
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址