凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

内嵌汇编指令的特点

已有 1212 次阅读| 2016-3-7 15:50 |个人分类:linux技术

1)操作数

在内嵌的汇编指令中,操作数可以是寄存器、常量或C语言表达式。它们可以是char、short或int类型,而且都是作为无符号数进行操作,若需要有符号数,用户需要自己处理与符号有关的操作。编译器将计算这些表达式的值,并为其分配寄存器。

当汇编指令中同时用到了物理寄存器和C语言的表达式时,要注意使用的表达式不要过于复杂。

2)物理寄存器

在内嵌的汇编指令中,使用物理寄存器有以下限制:

不能直接向PC寄存器中赋值,程序的跳转只能通过B指令个BL指令实现。

在使用物理寄存器内嵌汇编指令中,不要使用过于复杂的C语言表达式。因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。当编译器发现了寄存器的分配冲突时,会产生相应的错误信息,报告寄存器分配冲突。

编译器可能会使用R12寄存器或R13寄存器存放编译的中间结果,在计算表达式值时可能会将寄存器R0~R3、R12以及R14用于子程序调用。因此在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。

在内嵌的汇编指令中使用物理寄存器时,如果有C语言变量使用了该物理寄存器,则编译器将在合适的时候保存并回复该变量的值。需要注意的是,当寄存器SP、SI、FP以及SB用作特定的用途时,编译器不能恢复这些寄存器的值。

通常在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。

3)常量

在内嵌的汇编指令中,常量签到 符号#可省略。如果在一个表达式中使用符号“#”,则该表达式必须是一个常量。

4)标号

C语言程序中的标号可被内嵌的汇编指令使用。但是只有指令B可使用C语言程序中的标号,指令BL不能使用C语言程序中的标号。指令B使用C语言程序中的标号时,语法格式如下:

B{cond}label

5)内存单元的分配

内嵌汇编不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,分配的内存单元通过变量供内嵌的汇编器使用。

6)指令展开

内嵌的汇编指令中如果包含常量操作数,则该指令可能会被汇编器展开成几条指令。例如,指令“ADD R0,R0,#1023”可能被展开成下面的指令序列:

ADD R0,R0,#1024

SUB R0,R0,#01

乘法指令MUL可能会被展开成一系列的加法操作和移位操作。事实上,除了与协处理器相关的指令外,大部分ARM指令和Thumb指令中包含常量操作数都可能展开成多条指令。各展开的指令对于CPSR寄存器中的各条件标志位有影响:

算术指令可以正确地设置CPSR寄存器中的NZCV条件标志位。

逻辑指令可以是正确地设置CPSR寄存器中的NZ条件标志位;不影响V条件标志位;破坏C条件标志位(使C标志位变得不准确)。

7)SWIBL指令的使用

在内嵌的SWIBL指令中,除了正常的操作数域外,还必须增加下面3个可选的寄存器列表:

1个寄存器列表中的寄存器用于存放输入的参数;

2个寄存器列表中的寄存器用于存放返回的结果;

3个寄存器列表中的寄存器供被调用的子程序作为工作寄存器,这些寄存器的内容可能被调用的子程序破坏。

8)内嵌汇编器与armasm汇编器的区别

内嵌汇编器与armasm汇编器的区别如下:

内嵌汇编器不支持通过“·”指示符或PC获取当前指令地址。

不支持“LDR Rn=expression”伪指令,而使用“MOV Rnexpression”指令向寄存器赋值。

不支持标号表达式。

不支持ADRADRL伪指令。

不支持BXBLX指令。

不可以向PC赋值。

使用0x前缀代表&表示十六进制数。当使用8位移位常量导致CPSR中的ALU标志位需要更新时,NZCV标志中的C不具有真实意义。

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 06:45 , Processed in 0.014188 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部