ARM指令集详解(超详细!带实例!)

更新时间:2023-07-16 05:32:10 阅读: 评论:0

ARM指令集详解(超详细!带实例!)
算术和逻辑指令
ADC : 带进位的加法
(Addition with Carry)警戒是什么意思
ADC{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 + op_2 + carry
ADC将把两个操作数加起来,并把结果放置到⽬的寄存器中。它使⽤⼀个进位标志位,这样就可以做⽐ 32 位⼤的加法。下列例⼦将加两个 128 位的数。
128 位结果: 寄存器 0、1、2、和 3
第⼀个 128 位数: 寄存器 4、5、6、和 7
第⼆个 128 位数: 寄存器 8、9、10、和 11。
ADDS    R0, R4, R8              ; 加低端的字
ADCS    R1, R5, R9              ; 加下⼀个字,带进位
ADCS    R2, R6, R10            ; 加第三个字,带进位
阅读率ADCS    R3, R7, R11            ; 加⾼端的字,带进位
如果如果要做这样的加法,不要忘记设置 S 后缀来更改进位标志。
ADD : 加法
(Addition)
ADD{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 + op_2
ADD将把两个操作数加起来,把结果放置到⽬的寄存器中。操作数 1 是⼀个寄存器,操作数 2 可以是⼀个寄存器,被移位的寄存器,或⼀个⽴即值:
ADD    R0, R1, R2              ; R0 = R1 + R2
ADD    R0, R1, #256            ; R0 = R1 + 256
ADD    R0, R2, R3,LSL#1        ; R0 = R2 + (R3 << 1)
加法可以在有符号和⽆符号数上进⾏。
AND : 逻辑与
(logical AND)
AND{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 AND op_2
AND将在两个操作数上进⾏逻辑与,把结果放置到⽬的寄存器中;对屏蔽你要在上⾯⼯作的位很有⽤。操作数 1 是⼀个寄存器,操作数 2 可以是⼀个寄存器,被移位的寄存器,或⼀个⽴即值:
AND    R0, R0, #3              ; R0 = 保持 R0 的位0和 1,丢弃其余的位。
AND 的真值表(⼆者都是 1 则结果为 1):
Op_1  Op_2  结果
0      0      0
0      1      0
1      0      0
1      1      1
BIC : 位清除
(Bit Clear)
BIC{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 AND (!op_2)
BIC是在⼀个字中清除位的⼀种⽅法,与 OR 位设置是相反的操作。操作数 2 是⼀个 32 位位掩码(mask)。如果如果在掩码中设置了某⼀位,则清除这⼀位。未设置的掩码位指⽰此位保持不变。
BIC    R0, R0, #%1011          ; 清除 R0 中的位 0、1、和 3。保持其余的不变。
BIC 真值表 :
Op_1  Op_2  结果
0      0      0
0      1      0
1      0      1
1      1      0
译注:逻辑表达式为 Op_1 AND NOT Op_2
自传书
EOR : 逻辑异或
(logical Exclusive OR)
EOR{条件}{S}  <dest>, <op 1>, <op 2>
EOR    R0, R0, #3              ; 反转 R0 中的位 0 和 1
EOR 真值表(⼆者不同则结果为 1):
Op_1  Op_2  结果
0      0      0
0      1      1
1      0      1
1      1      0
MOV : 传送
(Move)
MOV{条件}{S}  <dest>, <op 1>
dest = op_1
MOV从另⼀个寄存器、被移位的寄存器、或⼀个⽴即值装载⼀个值到⽬的寄存器。你可以指定相同的寄存器来实现 NOP 指令的效果,你还可以专门移位⼀个寄存器:
MOV    R0, R0                  ; R0 = R0... NOP 指令
MOV    R0, R0, LSL#3          ; R0 = R0 * 8
如果 R15 是⽬的寄存器,将修改程序计数器或标志。这⽤于返回到调⽤代码,⽅法是把连接寄存器的内容传送到 R15:
MOV    PC, R14                ; 退出到调⽤者
MOVS    PC, R14                ; 退出到调⽤者并恢复标志位
(不遵从 32-bit 体系)
MVN : 传送取反的值
(MoveNegative)
MVN{条件}{S}  <dest>, <op 1>
dest = !op_1
MVN从另⼀个寄存器、被移位的寄存器、或⼀个⽴即值装载⼀个值到⽬的寄存器。不同之处是在传送之前位被反转了,所以把⼀个被取反的值传送到⼀个寄存器中。这是逻辑⾮操作⽽不是算术操作,这个取反的值加 1 才是它的取负的值:
MVN    R0, #4                  ; R0 = -5
MVN    R0, #0                  ; R0 = -1
ORR : 逻辑或
(logical OR)
ORR{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 OR op_2
OR将在两个操作数上进⾏逻辑或,把结果放置到⽬的寄存器中;对设置特定的位有⽤。操作数 1 是⼀个寄存器,操作数 2 可以是⼀个寄存器,被移位的寄存器,或⼀个⽴即值: ORR    R0, R0, #3              ; 设置 R0 中位 0 和 1
OR 真值表(⼆者中存在 1 则结果为 1):
Op_1  Op_2  结果
0      0      0
0      1      1
1      0      1
1      1      1
RSB : 反向减法
(Rever Subtraction)
RSB{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_2 - op_1
SUB⽤操作数 two 减去操作数 one,把结果放置到⽬的寄存器中。操作数 1 是⼀个寄存器,操作数 2 可以是⼀个寄存器,被移位的寄存器,或⼀个⽴即值:
RSB    R0, R1, R2              ; R0 = R2 - R1
RSB    R0, R1, #256            ; R0 = 256 - R1
RSB    R0, R2, R3,LSL#1        ; R0 = (R3 << 1) - R2
反向减法可以在有符号或⽆符号数上进⾏。
RSC : 带借位的反向减法
(Rever Subtraction with Carry)
RSC{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_2 - op_1 - !carry
同于SBC,但倒换了两个操作数的前后位置。
SBC : 带借位的减法
(Subtraction with Carry)
SBC{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 - op_2 - !carry
SBC做两个操作数的减法,把结果放置到⽬的寄存器中。它使⽤进位标志来表⽰借位,这样就可以做
⼤于 32 位的减法。SUB和SBC⽣成进位标志的⽅式不同于常规,如果需要借位则清除进位标志。所以,指令要对进位标志进⾏⼀个⾮操作 - 在指令执⾏期间⾃动的反转此位。
SUB : 减法
(Subtraction)
SUB{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 - op_2
SUB⽤操作数 one 减去操作数 two,把结果放置到⽬的寄存器中。操作数 1 是⼀个寄存器,操作数 2 可以是⼀个寄存器,被移位的寄存器,或⼀个⽴即值:
SUB    R0, R1, R2              ; R0 = R1 - R2
SUB    R0, R1, #256            ; R0 = R1 - 256
SUB    R0, R2, R3,LSL#1        ; R0 = R2 - (R3 << 1)
减法可以在有符号和⽆符号数上进⾏。
移位指令
ARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)⼀起使⽤的桶式移位器(barrel shifter)。你还可以使⽤桶式移位器影响在 LDR/STR 操作中的变址值。
译注:移位操作在 ARM 指令集中不作为单独的指令使⽤,它是指令格式中是⼀个字段,在汇编语⾔中表⽰为指令中的选项。如果数据处理指令的第⼆个操作数或者单⼀数据传送指令中的变址是寄存器,则可以对它进⾏各种移位操作。如果数据处理指令的第⼆个操作数是⽴即值,在指令中⽤ 8 位⽴即值和 4 位循环移位来表⽰它,所以对⼤于 255 的⽴即值,汇编器尝试通过在指令中设置循环移位数量来表⽰它,如果不能表⽰则⽣成⼀个错误。在逻辑类指令中,逻辑运算指令由指令中 S 位的设置或清除来确定是否影响进位标志,⽽⽐较指令的 S 位总是设置的。在单⼀数据传送指令中指定移位的数量只能⽤⽴即值⽽不能⽤寄存器。
下⾯是给不同的移位类型的六个助记符:
LSL  逻辑左移
ASL  算术左移
LSR  逻辑右移
ASR  算术右移
ROR  循环右移
RRX  带扩展的循环右移
ASL和LSL是等同的,可以⾃由互换。
你可以⽤⼀个⽴即值(从 0 到 31)指定移位数量,或⽤包含在 0 和 31 之间的⼀个值的寄存器指定移位数量。
逻辑或算术左移
(Logical or Arithmetic Shift Left)
Rx, LSL #n    or
一年后的今天
Rx, ASL #n    or
Rx, LSL Rn    or
Rx, ASL Rn
接受 Rx 的内容并按⽤‘n’或在寄存器 Rn 中指定的数量向⾼有效位⽅向移位。最低有效位⽤零来填充。除了概念上的第 33 位(就是被移出的最⼩的那位)之外丢弃移出最左端的⾼位,如果逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
考虑下列:
MOV    R1, #12
MOV    R0, R1, LSL#2
在退出时,R0 是 48。这些指令形成的总和是R0 = #12, LSL#2等同于 BASIC 的R0 = 12 << 2
逻辑右移
(Logical Shift Right)
Rx, LSR #n    or
Rx, LSR Rn
它在概念上与左移相对。把所有位向更低有效位⽅向移动。如果逻辑类指令中 S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的register = value >>> shift。
算术右移
(Arithmetic Shift Right)
Rx, ASR #n    or
Rx, ASR Rn
类似于 LSR,但使⽤要被移位的寄存器(Rx)的第 31 位的值来填充⾼位,⽤来保护补码表⽰中的符号。如果逻辑类指令中 S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的register = value >> shift。
循环右移
(Rotate Right)
Rx, ROR #n    or
Rx, ROR Rn
循环右移类似于逻辑右移,但是把从右侧移出去的位放置到左侧,如果逻辑类指令中 S 位被设置了,则同时放置到进位标志中,这就是位的‘循环’。⼀个移位量为 32 的操作将导致输出与输⼊完全⼀致,因为所有位都被移位了 32 个位置,⼜回到了开始时的位置!
带扩展的循环右移
保护眼睛手抄报内容(Rotate Right with extend)
Rx, RRX
这是⼀个 ROR#0 操作,它向右移动⼀个位置 - 不同之处是,它使⽤处理器的进位标志来提供⼀个要被移位的 33 位的数量。
乘法指令
这两个指令与普通指令在对操作数的限制上有所不同:
1. 给出的所有操作数、和⽬的寄存器必须为简单的寄存器。
2. 你不能对操作数 2 使⽤⽴即值或被移位的寄存器。
3. ⽬的寄存器和操作数 1 必须是不同的寄存器。
4. 最后,你不能指定 R15 为⽬的寄存器。
MLA : 带累加的乘法
(Multiplication with Accumulate)
MLA{条件}{S}  <dest>, <op 1>, <op 2>, <op 3>
dest = (op_1 * op_2) + op_3
MLA的⾏为同于MUL,但它把操作数 3 的值加到结果上。这在求总和时有⽤。
MUL : 乘法
嘴唇上火怎么办(Multiplication)
MUL{条件}{S}  <dest>, <op 1>, <op 2>
dest = op_1 * op_2
MUL提供 32 位整数乘法。如果操作数是有符号的,可以假定结果也是有符号的。
⽐较指令
译注:CMP 和 CMP 是算术指令,TEQ 和 TST 是逻辑指令。把它们归⼊⼀类的原因是它们的 S 位总是设置的,就是说,它们总是影响标志位。
CMN : ⽐较取负的值
(Compare Negative)
CMN{条件}{P}  <op 1>, <op 2>
status = op_1 - (- op_2)
CMN同于CMP,但它允许你与⼩负值(操作数 2 的取负的值)进⾏⽐较,⽐如难于⽤其他⽅法实现的⽤于结束列表的 -1。这样与 -1 ⽐较将使⽤:
CMN    R0, #1                  ; 把 R0 与 -1 进⾏⽐较
详情参照CMP指令。
CMP : ⽐较
(Compare)
CMP{条件}{P}  <op 1>, <op 2>
status = op_1 - op_2
CMP允许把⼀个寄存器的内容如另⼀个寄存器的内容或⽴即值进⾏⽐较,更改状态标志来允许进⾏条件执⾏。它进⾏⼀次减法,但不存储结果,⽽是正确的更改标志。标志表⽰的是操作数 1 ⽐操作数 2 如何(⼤⼩等)。如果操作数 1 ⼤于操作操作数 2,则此后的有 GT 后缀的指令将可以执⾏。
明显的,你不需要显式的指定S后缀来更改状态标志... 如果你指定了它则被忽略。
TEQ{条件}{P}  <op 1>, <op 2>
Status = op_1 EOR op_2
TEQ类似于TST。区别是这⾥的概念上的计算是 EOR ⽽不是 AND。这提供了⼀种查看两个操作数是
否相同⽽⼜不影响进位标志(不象CMP那样)的⽅法。加上P后缀的TEQ还可
⽤于改变 R15 中的标志(在 26-bit 模式中)。详情请参照,在 32-bit 模式下如何做请参见。
TST : 测试位
(Test bits)
TST{条件}{P}  <op 1>, <op 2>
Status = op_1 AND op_2
TST类似于CMP,不产⽣放置到⽬的寄存器中的结果。⽽是在给出的两个操作数上进⾏操作并把结果反映到状态标志上。使⽤TST来检查是否设置了特定的位。操作数 1 是要测
试的数据字⽽操作数 2 是⼀个位掩码。经过测试后,如果匹配则设置 Zero 标志,否则清除它。象CMP 那样,你不需要指定S后缀。
TST    R0, #%1                ; 测试在 R0 中是否设置了位 0。
分⽀指令
B : 分⽀
(Branch)
B{条件}  <;地址>
B 是最简单的分⽀。⼀旦遇到⼀个 B 指令,ARM 处理器将⽴即跳转到给定的地址,从那⾥继续执⾏。
注意存储在分⽀指令中的实际的值是相对当前的 R15 的值的⼀个偏移量;⽽不是⼀个绝对地址。
它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表⽰的有效偏移为 26 位(+/- 32 M)。
在其他处理器上,你可能经常见到这样的指令:
OPT 1
LDA &70
CMP #0
BEQ Zero
STA &72
.Zero RTS
(取⾃ Acorn Electron Ur Guide issue 1 page 213)
在 ARM 处理器上,它们将变成下⾯这些东西:
OPT    1
ADR    R1, #&70
LDR    R0, [R1]
CMP    #0
BEQ    Zero
STR    R0, [R1, #2]
.
Zero
MOV    PC, R14
这不是⼀个很好的例⼦,但你可以构想如何更好的去条件执⾏⽽不是分⽀。另⼀⽅⾯,如果你有⼤段的代码或者你的代码使⽤状态标志,那么你可以使⽤条件执⾏来实现各类分⽀: 这样⼀个单⼀的简单条件执⾏指令可以替代在其他处理器中存在的所有OPT    1
ADR    R1, #&70
LDR    R0, [R1]
CMP    R0, #0
STRNE  R0, [R1, #2]
MOV    PC, R14
BL : 带连接的分⽀
(Branch with Link)
BL{条件}  <;地址>
BL 是另⼀个分⽀指令。就在分⽀之前,在寄存器 14 中装载上 R15 的内容。你可以重新装载 R14 到 R15 中来返回到在这个分⽀之后的那个指令,
它是⼦例程的⼀个基本但强⼒的实现。它的作⽤在屏幕装载器 2 (例⼦ 4)中得以很好的展现...
.load_new_format
BL    switch_screen_mode
春节灯笼图片BL    get_screen_info
BL    load_palette
.new_loop
MOV    R1, R5
BL    read_byte简单就是幸福
CMP    R0, #255
BLEQ  read_loop
STRB  R0, [R2, #1]!
...在这⾥我们见到在装载器循环之前调⽤了三个⼦例程。接着,⼀旦满⾜了条件执⾏就在循环中调⽤了read_byte⼦例程。
条件执⾏
ARM 处理器的⼀个⾮常特殊的特征是它的条件执⾏。我们指的不是基本的如果进位则分⽀,ARM 使这个逻辑
阶段进⼀步深化为如果进位则XXX- 这⾥的 XXX 是任何东西。
为了举例,下⾯是 Intel 8086 处理器分⽀指令的⼀个列表:
JA    Jump if Above
JAE  Jump if Above or Equal
JB    Jump if Below
JBE  Jump if Below or Equal

本文发布于:2023-07-16 05:32:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1099058.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:投资机构名录
标签:指令   标志   寄存器   移位   进位
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图