找回密码
 注册
关于网站域名变更的通知
查看: 164|回复: 2
打印 上一主题 下一主题

常用ARM指令集及汇编

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-1 11:01 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 Thumb 指令集,ARM 指令集效率高,但是代码密度低,而 Thumb 指令集具有更好的代码密度,却仍然保持 ARM 的大多数性能上的优势,它是 ARM 指令集的子集。所有 ARM 指令都是可以有条件执行的,而 Thumb指令仅有一条指令具备条件执行功能。ARM 程序和 Thumb 程序可相互调用,相互之间的状态切换开销几乎为零。
* f, T- N8 y- B  r7 E4 R' U
  z& f4 k( W9 m- B+ i) q) EARM 处理器寻址方式
4 Z- B1 _) I- m# M; T) a, N; p' j, Z寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有 9 种基本寻址方式。
+ x, W8 B) n' J0 B6 f* L9 D% V; ~# o/ q0 s6 h5 Z$ d
寄存器寻址- g! r  T8 _. K6 }
操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作。 0 y6 s5 |/ `% K; W3 U
寄存器寻址指令举例如下: . ~* g" J5 y! C' @! B/ D
MOV R1,R2 ;R2 -> R1
, R9 ^( \( r/ PSUB R0,R1,R2 ;R1 - R2 -> R0 9 |7 B0 m' g4 R. r* y; D6 W
1 \0 R9 Y, u$ ~: p& A0 f1 a
立即寻址
% d# u5 J) H, N; r* {  R4 @立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(立即数)。
( J$ c7 j, V/ ?0 V; ?, u5 U立即寻址指令举例如下:
9 u9 U& y7 u+ W6 k; g6 q  rSUBS R0,R0,#1 ;R0 – 1 -> R0
+ g1 Q& o8 B1 H( D1 f# _MOV R0,#0xff00 ;0xff00 -> R0 / H  g' w! \- R; M4 m& N
立即数要以“#”为前缀,表示 16 进制数值时以“0x”表示。
$ W- l- s. R2 R- l% Y5 e8 Q& k4 A) `3 \
寄存器偏移寻址
; E+ w% k5 [3 j+ Q! c  L7 h寄存器偏移寻址是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进行移位操作。 , s0 Z/ j( ~; i; }
寄存器偏移寻址方式指令举例如下:
$ p9 r; c% I: O: O- wMOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8 9 e. Y" |. i9 \9 p7 `
ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作,结果放入 R1 可采用的移位操作如下: ( }% u0 K1 m+ B# _7 L6 N8 E
LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0 $ y. m7 d) C4 z) a2 X" u9 d
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补 0   L8 p2 Q/ X3 G5 l7 Y1 D
ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补 0,否则补 1 $ h$ b" ?2 P$ K. k8 W
ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位
: n1 i. c2 ~7 t4 ^2 _7 M0 i( A  tRRX:带扩展的循环右移(Rotate Right eXtended by 1place),操作数右移一位,高端空出的位用原 C 标志值填充。
9 B- E6 y- H9 W6 F1 i- w: C) N$ e, v* E3 D
各移位操作如下图所示。
' }; N+ f" Q& W  e+ g" g6 P" ^4 {2 B, m7 ^  n

1 a6 Y3 D3 U% U寄存器间接寻址( l* W- u( ?3 J+ t; G; x5 M9 w
寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。 " F6 p0 Z6 S( }  C1 [7 C
寄存器间接寻址指令举例如下:
9 ?$ r4 E8 Q/ x- [4 k" ~LDR R1,[R2] ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中 # n' V% H3 G1 l6 C. g, x1 X. L
SWP R1,R1,[R2];将如中的数值作为地址,取出此地址中的数值与 R1 中的值交换
" W9 `* K7 ]+ }# l! B
8 t4 a- ?$ {9 [) Z/ u3 o/ G: s0 K* c7 Z基址寻址7 \" n. `$ r1 o
基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器
2 d; L. a/ j' a' @1 ]( d1 ?( L访问等。
' [& r! Q: l) f- B: D基址寻址指令举例如下:
1 r' o# H# b  @LDR R2,[R3,#0x0F] ;将 R3 中的数值加 0x0F 作为地址,取出此地址的数值保存在 R2 中 STR R1,[R0,#-2] ;将 R0 中的数值减 2 作为地址,把 R1 中的内容保存到此地址位置
. j% e# n( n0 j* I: g
4 S  W: k  N& U/ D: K

ARM汇编.pdf

1.51 MB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

3#
发表于 2022-8-1 14:54 | 只看该作者
不错,学习学习,Thanks♪(・ω・)ノ楼主

该用户从未签到

2#
发表于 2022-8-1 13:16 | 只看该作者
恩,不错,确实张知识了,支持楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 00:06 , Processed in 0.156250 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表