一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 6026|回复: 2

ARM MOV指令详解

[复制链接]
发表于 2018-8-21 08:50 | 显示全部楼层 |阅读模式

: h; z3 D! R, ?% @. B看优龙FS2410(s3c2410)的bootloader: vivi, 思考摸索了有段时间的问题,代码如何从cpu上的sram中跳到SDRAM中的,从而引发了一连串的问题,此文的目的就是问题之一。
) P$ \0 m6 Q8 M# n) m/ f代码里会看到如下的指令:0 b; Z! ]9 Y2 f9 d
mov        r1, #0x530000002 M( s/ l( j- ?+ l/ h$ \; K
而我们知道arm指令是4字节长,上面这个指令光立即数就已经4个字节了,所以,汇编器如何把这条汇编语句变成二进制指令的呢?! E- X) {' a% A. a: J
网络上答案很多,如下,不过原文有点小错误,已经高亮纠正
* ^6 H/ Y9 {* e0 V% \
, `8 G8 j" m. U& [6 g9 g8 u$ B原文戳我
  D- [- B0 L; A5 w! }8 X转载Begin:. }7 C) i) C' J& e1 c
ARM中的MOV指令格式是这样的# G' ~1 Z$ k# f1 I+ M$ H

) e2 b3 S' {9 T. R) V+ ?; L) F/ f* x. {2 R

% f+ j$ z  f9 s        op2是占了12位,其中bit11-bit8是移位数(rotate),bit7-0是一个8位的立即数(imm),MOV Rn, op2,执行之后,Rn=op2 >> (rotate * 2),这里的移位是循环右移,这就决定了MOV指令不是所有的立即数都能表示的,以下是几个例子:
* Q8 B' b2 d. l
. P0 _" O2 X  n# t  z 2 m) i2 ?7 J. X3 d/ Y. J/ `
) L) Q/ a2 R+ p; h
1、mov    r3, #0x56000000* A2 x/ F0 l/ Q' t) G( w
/ y' H4 }3 G! k( D' Q$ S* W
虽然0x56000000是一个32位的数,但是可以找到这么一个8位立即数,通过右移得到,看下机器码e3a03456,展开成二进制,对照下格式" }7 C, ?! c+ c! o

, U0 Z# D+ F( A0 c8 R) x# W1110  0011 1010  0000  0011  0100  0101  0110/ q6 r3 I$ G, Y% |
3 F5 p1 J- z# X- B; C
cond[31:28]=1110. W7 Q7 O% V- U# |2 ~$ A- }) o; W
0 r" z5 \4 o% o% m2 m$ Y, G8 u7 w
[27:26]=00
1 X' D# C& |/ L2 I+ d
4 e/ [4 c, g; K5 k% h( }L[25]=1,代表op2是一个立即数7 n, c, H3 n  ]
5 o* j: [' |+ O1 ?- a7 k$ N. J) g
OpCode[24:21]=1101
) A! J* ?; J& e, E- X: f. x2 B" U- U+ v
S[20]=0; W- `4 {2 d/ ^$ N' Y

2 j7 E9 I4 U6 C' H+ r" |( o) t% QRn[19:16]=0000
) \4 Q; c: X8 ~& n+ k7 r5 o% P& J/ D) q: W! ?, K+ k
Rd[15:12]=0011,R3
  W; [# B: N- ]2 f0 ^* p* L7 r& @
Op2[11:8]=0100,右移4 * 2位
+ y% y, V/ a& a( |
/ q, W+ H& |! y7 i: h3 T3 H# vOp2[7:0]=0101 0110,8位立即数,0x56! g8 {" w' ?9 G

6 A, F6 w0 n& C/ G
$ s! \1 }/ m3 {" |( O7 Z! }
* u8 G) r9 a  b- `) F( N2 Y首先要将0x56扩展成32位的无符号数,0x00000056,然后循环右移8位,就得到了0x560000005 v8 `' Q- ^7 {/ A' o

% J( y" Q9 e3 g% [; E% ]# N2、mov r3, #0x56000014
0 Q, C! ^7 S% U! B& s$ R6 n& \7 i; p4 }( B9 ~  J7 e
0x56000014是无法通过移位来得到的,这时汇编器会报错,C语言编写的程序,编译器会这样来处理:
9 {+ ~& Q2 L% t
6 A3 J. _5 B" T5 R1 R7 V2 Wmov r3, #0x56000000
+ `" h2 o8 T- {9 |3 G1 p+ ?' O" |- B: D4 Y" `
add r3, r3, #0x146 J1 o- a- V  X6 n( j

8 m! M- B- v% |+ K4 c转载End1 v3 ~; ~: e2 A& R: ?" a) c3 H
+ @/ `, t4 O% j9 b3 ?4 G
明白了这个,也就可以理解为啥会有下面的写法:
; g. p0 l8 r/ x( g#define INT_CTL_BASE        0x4A000000
5 K- p1 u4 g/ P#define oINTMSK                        0x08
" H7 v: x# f" x#define oINTSUBMSK                0x1C
$ y* c9 B. [2 Q% }2 O9 @. R
# H  Y/ u  P$ P6 Y# f4 j2 U  W        mov        r1, #INT_CTL_BASE% `. R# \1 \7 j& `/ G/ ~$ Q6 E7 t# }
        mov        r2, #0xffffffff
$ }9 _' J0 D7 L; n0 L4 E        str        r2, [r1, #oINTMSK]: E+ G0 J% ]) d, d
        ldr        r2, =0x7ff' u1 L9 [4 l6 J0 F8 ?* m
        str        r2, [r1, #oINTSUBMSK]
" a( `" m; B, o% Y& F7 f3 n因为0x4A000008和0x4A00001C不能通过循环右移偶数个位来得到
 楼主| 发表于 2018-8-21 08:51 | 显示全部楼层
一值不明白MOV 为何能超越8位,这下就明白了
回复

使用道具 举报

发表于 2018-8-22 14:34 | 显示全部楼层
杜春雷《ARM体系结构与编程》,不谢
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-2-25 13:17 , Processed in 0.031413 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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