ARM指令集(未完待续)

寻址方式
1、立即寻址
立即寻址方式中操作数已经写在了指令里,取出指令时会把操作数也取出来。这是最简单的寻址方式,如下

SUBS R0, R0, #1   ;R0减一写回R0
MOV R0, #0xff00   ;给R0赋值0xff00

立即寻址使用“#”表示数值。
2、寄存器寻址方式
该寻址方式中,操作数存放在寄存器中,指令直接读取寄存器即得到操作数。如下

MOV R1, R2    ;把R2的值赋给R1
SUB R0, R1, R2;把R1-R2的值写入R0

3、寄存器偏移寻址
该方式把寄存器的值移位得到结果。如下

MOV R0, R1, LSL #3      ;把R1的值左移3位写入R0,即R0 = R1*8
ANDS R0, R1, R2, LSL #R3;把R2的值左移R3位,然后与R1做与操作,结果写入R0
操作名称功能
LSL(logical shift left)逻辑左移寄存器二进制位从右往左移动,空位补0
LSR(logical shift right)逻辑右移寄存器的二级制位从左往右移动,空位补0
ASR(arithmetic shift right)算数右移移位过程中保持符号位不变,即如果源操作数为整数,则字的高端空出的位补0,否则补1
ROR(rotate right)循环右移寄存器的低端移出的位团如字的高端空出的位
RRX(rotate right extended by 1 place)带扩展的循环右移操作数右移一位,高端空出的位用原C标志值填充

4、寄存器间接寻址
该方式把寄存器的值当作地址,然后从对应的内存中取出数据。如下

LDR R0, [R1]        ;把R1的值当作地址,从内存中取出数据存放到R0
SWP R0, R0, [R1]    ;把R1的值当作地址,从内存中取出数据与R0交换

寄存器间接寻址类似于C语言的指针。
5、基址变址寻址
该方式把寄存器的内容与指定的偏移相加,得到数据地址,然后从内存中取得数据。如下

LDR R0, [R1, #0xf]     ;把R1的值与0xf相加得到数据地址
STR R0, [R1, #-2]      ;把R1的值减去2得到数据地址

6、多寄存器寻址
该方式允许一次可以传输多个寄存器的值。如下

LDMIA R1!,{R2-R7,R12}   ;把R1单元中的数据读出到R2-R7和R12,R1指定的地址自动加1
STMIA R0!,{R3-R6,R10}   ;把R3-R6中的数据保存到R0所指向的地址,R0的地址自动加1

7、栈寻址
栈是一个特殊的数据结构,数据采取“先进后出”的方式。栈寻址通过一个栈指针寄存器寻址。如下

STMFD SP!, {R0-R7, LR}     ;把R0-R7和LR的内容压入堆栈
LDMFD SP!, {R0-R7, LR}     ;从堆栈中取出数据到R0-R7和LR

https://blog.csdn.net/qq_40531974/article/details/83897559
在这里插入图片描述
数据处理指令
1、数据传送指令
MOV指令:把一个寄存器的值传送给另一个寄存器,或者把常数存入寄存器,将后边的量赋给前边的量。

MOV R1,R0   ;将寄存器R0的值传送到寄存器R1
MOV PC,R14   ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1(即乘8)
MOVS PC, R14	  ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位

MVN指令:数据取反并传送到左边。

MVN R0,#0   ;将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)

2、算术运算指令
(1)加法指令:ADD

ADD  R0,R1,R2           ; R0 = R1 + R2
ADD  R0,R1,#256            ; R0 = R1 + 256
ADD  R0,R2,R3,LSL#1      ; R0 = R2 + (R3 << 1)

(2)带进位的加法指令:ADC
ADC指令使用一个进位标志位,可以进行大于32位的加法操作。如计算两个32位数的和,结果存放在一个64位数中。如下

ADCS R0, R2, R3    ;带进位,结果保存在R0和R1寄存器

adc是带进位加法指令,它利用了CF位上记录的进位值。

指令格式: adc 操作对象1,操作对象2

功能:操作对象1 = 操作对象1 + 操作对象2 + CF

例如指令 adc ax,bx实现的功能是: (ax)=(ax)+(bx)+CF
以下指令序列完成两个128位数(此处应为两个四字数相加)的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:

ADDS  R0,R4,R8          ; 加低端的字,R0=R4+R8
ADCS  R1,R5,R9            ; 加第二个字,带进位,R1=R5+R9
ADCS  R2,R6,R10       ; 加第三个字,带进位,R2=R6+R10
ADC  R3,R7,R11       ; 加第四个字,带进位,R3=R7+R11

(3)减法指令SUB

SUB  R0,R1,R2           ; R0 = R1 - R2
SUB  R0,R1,#256            ; R0 = R1 - 256
SUB  R0,R2,R3,LSL#1      ; R0 = R2 - (R3 << 1)

(4)带借位减法指令SBC
SBC{条件}{S} 目的寄存器,操作数1,操作数2

BC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

SUBS  R0,R1,R2           ;R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值