|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1)操作数- N0 d( a3 a7 a( E' `. Z$ H. E" }: [6 Z
在内嵌的汇编指令中,操作数可以是寄存器、常量或C语言表达式。它们可以是char、short或int类型,而且都是作为无符号数进行操作,若需要有符号数,用户需要自己处理与符号有关的操作。编译器将计算这些表达式的值,并为其分配寄存器。9 b u, ]$ W5 Z, m
当汇编指令中同时用到了物理寄存器和C语言的表达式时,要注意使用的表达式不要过于复杂。
6 o" w: O* ?8 a3 t) D2)物理寄存器4 @, U7 F/ u) n: J/ C
在内嵌的汇编指令中,使用物理寄存器有以下限制:/ e0 O/ ~: {9 P* c" _# o4 [! [" l
不能直接向PC寄存器中赋值,程序的跳转只能通过B指令个BL指令实现。
8 H* Y! p; i( H1 q8 T/ v在使用物理寄存器内嵌汇编指令中,不要使用过于复杂的C语言表达式。因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。当编译器发现了寄存器的分配冲突时,会产生相应的错误信息,报告寄存器分配冲突。* Y8 O" \) A% Z6 c4 p( E3 F; v7 f
编译器可能会使用R12寄存器或R13寄存器存放编译的中间结果,在计算表达式值时可能会将寄存器R0~R3、R12以及R14用于子程序调用。因此在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。1 ]2 }8 f* T& ?' n3 T
在内嵌的汇编指令中使用物理寄存器时,如果有C语言变量使用了该物理寄存器,则编译器将在合适的时候保存并回复该变量的值。需要注意的是,当寄存器SP、SI、FP以及SB用作特定的用途时,编译器不能恢复这些寄存器的值。. q& ]( U/ ~) d4 z% i# B2 P
通常在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。
, _( v# b+ B1 `/ e) X8 X. I3)常量
; X2 d4 z ?0 D1 I2 Y7 K/ L _在内嵌的汇编指令中,常量签到 符号#可省略。如果在一个表达式中使用符号“#”,则该表达式必须是一个常量。
. @" q$ R( S; ^. m4)标号
7 v) t4 n: ]/ [, K( \C语言程序中的标号可被内嵌的汇编指令使用。但是只有指令B可使用C语言程序中的标号,指令BL不能使用C语言程序中的标号。指令B使用C语言程序中的标号时,语法格式如下:- E) b$ q D9 E5 e9 T$ l# n
B{cond}label/ b$ T* h. a2 F: E
5)内存单元的分配
& l* r" z# b; N. e& b内嵌汇编不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,分配的内存单元通过变量供内嵌的汇编器使用。
6 D" C/ N0 F' W7 X: T* F9 N6)指令展开
8 H- p/ `1 t1 U8 f7 q内嵌的汇编指令中如果包含常量操作数,则该指令可能会被汇编器展开成几条指令。例如,指令“ADD R0,R0,#1023”可能被展开成下面的指令序列: w! z! p3 D3 z' y* ~
ADD R0,R0,#1024+ e' p( d& a( j, Z4 c( |9 g e
SUB R0,R0,#01$ n# c2 d/ J4 `$ W1 o
乘法指令MUL可能会被展开成一系列的加法操作和移位操作。事实上,除了与协处理器相关的指令外,大部分ARM指令和Thumb指令中包含常量操作数都可能展开成多条指令。各展开的指令对于CPSR寄存器中的各条件标志位有影响:
, @6 i0 Y0 [ Q5 Z算术指令可以正确地设置CPSR寄存器中的NZCV条件标志位。/ R7 k4 x C! k* ~
逻辑指令可以是正确地设置CPSR寄存器中的NZ条件标志位;不影响V条件标志位;破坏C条件标志位(使C标志位变得不准确)。
5 t& q9 K0 k3 Z w5 E# e7)SWI和BL指令的使用
* n3 ]7 W% j) A% e2 a6 q5 r- w在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加下面3个可选的寄存器列表:4 j0 k9 Z9 h6 y8 B) y
第1个寄存器列表中的寄存器用于存放输入的参数;
5 B. Y l( X$ t第2个寄存器列表中的寄存器用于存放返回的结果;
/ y( j; M1 _; s# O/ E2 I第3个寄存器列表中的寄存器供被调用的子程序作为工作寄存器,这些寄存器的内容可能被调用的子程序破坏。0 z" m' r# [1 s! h$ q9 O
8)内嵌汇编器与ARMasm汇编器的区别1 R& f K3 F& f- m4 m4 Q" I
内嵌汇编器与armasm汇编器的区别如下:* }( Z7 q& p" O d" H4 }) G
内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址。
4 y) H/ b/ L( Z' u4 S8 Y不支持“LDR Rn=expression”伪指令,而使用“MOV Rn,expression”指令向寄存器赋值。
& g/ C$ }% P5 P2 v+ N不支持标号表达式。2 e2 I" `( x4 q% }
不支持ADR和ADRL伪指令。
9 T9 ]1 R. P1 F( |, }/ W7 `3 C" Z不支持BX和BLX指令。( K$ V1 V% s& U) O
不可以向PC赋值。
" y; y1 o3 R6 X3 ?1 `0 |1 v9 [使用0x前缀代表&表示十六进制数。当使用8位移位常量导致CPSR中的ALU标志位需要更新时,NZCV标志中的C不具有真实意义。 |
|