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

内嵌汇编指令的特点

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-6-4 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
1)操作数3 v' ~. k5 w) I9 N3 ^6 ]
在内嵌的汇编指令中,操作数可以是寄存器、常量或C语言表达式。它们可以是char、short或int类型,而且都是作为无符号数进行操作,若需要有符号数,用户需要自己处理与符号有关的操作。编译器将计算这些表达式的值,并为其分配寄存器。9 O2 I" z5 r& k' b* H% q
当汇编指令中同时用到了物理寄存器和C语言的表达式时,要注意使用的表达式不要过于复杂。2 }9 i% L) L' V9 h. V2 g
2)物理寄存器% H. X# k! C4 b0 D$ O
在内嵌的汇编指令中,使用物理寄存器有以下限制:
& u& a" W/ e6 t( b$ F不能直接向PC寄存器中赋值,程序的跳转只能通过B指令个BL指令实现。
5 A6 Z3 C9 F0 V+ p6 C在使用物理寄存器内嵌汇编指令中,不要使用过于复杂的C语言表达式。因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。当编译器发现了寄存器的分配冲突时,会产生相应的错误信息,报告寄存器分配冲突。! d( d' K" M6 \" _
编译器可能会使用R12寄存器或R13寄存器存放编译的中间结果,在计算表达式值时可能会将寄存器R0~R3、R12以及R14用于子程序调用。因此在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。
& V) l2 j- x1 H; j9 ], s在内嵌的汇编指令中使用物理寄存器时,如果有C语言变量使用了该物理寄存器,则编译器将在合适的时候保存并回复该变量的值。需要注意的是,当寄存器SP、SI、FP以及SB用作特定的用途时,编译器不能恢复这些寄存器的值。, L5 t2 J. D" t. ?6 Z
通常在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。# L/ l2 L" s( c7 {5 R/ N
3)常量/ u  m" E0 y* V5 I, _
在内嵌的汇编指令中,常量签到 符号#可省略。如果在一个表达式中使用符号“#”,则该表达式必须是一个常量。
) \% w7 Z" w7 s+ M7 _1 T4)标号" P8 E# k8 L* w5 n
C语言程序中的标号可被内嵌的汇编指令使用。但是只有指令B可使用C语言程序中的标号,指令BL不能使用C语言程序中的标号。指令B使用C语言程序中的标号时,语法格式如下:4 }5 |- N) S& w1 ~2 m$ b' K6 ~
B{cond}label
8 B* a5 Z* ?3 F+ z5 [5)内存单元的分配) c: l; U; @  q3 V) G+ A/ A  M
内嵌汇编不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,分配的内存单元通过变量供内嵌的汇编器使用。
8 u! {3 `1 f; ^; d5 u6)指令展开3 A. D% M) r3 u
内嵌的汇编指令中如果包含常量操作数,则该指令可能会被汇编器展开成几条指令。例如,指令“ADD R0,R0,#1023”可能被展开成下面的指令序列:
) C3 x5 P3 l3 ~! w) ]7 `6 OADD R0,R0,#1024
: R* b6 [2 X( iSUB R0,R0,#018 T* O0 a, t- P. x" T7 k
乘法指令MUL可能会被展开成一系列的加法操作和移位操作。事实上,除了与协处理器相关的指令外,大部分ARM指令和Thumb指令中包含常量操作数都可能展开成多条指令。各展开的指令对于CPSR寄存器中的各条件标志位有影响:
2 V$ Y0 i; D' E1 y- E; D/ q  J  [; A算术指令可以正确地设置CPSR寄存器中的NZCV条件标志位。6 u5 C, x0 |8 I$ K
逻辑指令可以是正确地设置CPSR寄存器中的NZ条件标志位;不影响V条件标志位;破坏C条件标志位(使C标志位变得不准确)。
3 S0 c1 [) j2 t" f4 T( }4 G$ S7)SWI和BL指令的使用
1 N, \, T" X8 I# @: p2 E在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加下面3个可选的寄存器列表:: h# u6 ^2 s8 F& z
第1个寄存器列表中的寄存器用于存放输入的参数;, d8 I8 t* G' \  L* e$ h- X: w
第2个寄存器列表中的寄存器用于存放返回的结果;
0 ]/ ^/ c* y4 h( A6 E' [; d第3个寄存器列表中的寄存器供被调用的子程序作为工作寄存器,这些寄存器的内容可能被调用的子程序破坏。
2 E+ F1 A" w+ O7 R8)内嵌汇编器与ARMasm汇编器的区别4 ~+ @6 \( _2 N/ H
内嵌汇编器与armasm汇编器的区别如下:: I6 e6 K" Q' |# Y' s: r# S- Q" [
内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址。! x* `* e6 n& t
不支持“LDR Rn=expression”伪指令,而使用“MOV Rn,expression”指令向寄存器赋值。
' i% b0 M. X, g9 J% R! H# {6 L不支持标号表达式。
! ]: z" u& [+ y& k不支持ADR和ADRL伪指令。$ c: H3 m$ H' ~. F/ I
不支持BX和BLX指令。% f) f6 \+ j* k- E5 r" I
不可以向PC赋值。
) Y* c% _5 c6 ^0 g% U# I* i. z使用0x前缀代表&表示十六进制数。当使用8位移位常量导致CPSR中的ALU标志位需要更新时,NZCV标志中的C不具有真实意义。

该用户从未签到

2#
发表于 2016-6-4 14:57 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢6 _& U7 {7 F5 m. Z6 v0 ]( d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 20:50 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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