欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARM指令集(未完待续)

程序员文章站 2022-04-19 08:52:37
...

寻址方式
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
ARM指令集(未完待续)
数据处理指令
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的进位标志位
相关标签: arm