|
|
|
|
移动端

1.5.1 ARM通用寄存器

《ARM嵌入式系统编程与优化》第1章Linux/ARM嵌入式平台,本章介绍如何使用GCC编译器、汇编器和连接器来编写和执行独立的汇编语言程序,以及如何将一个C语言代码和汇编语言代码合起来,以验证汇编代码子程序的正确性。本节为大家介绍ARM通用寄存器。

作者:梁元宇 译来源:机械工业出版社|2017-09-26 19:01

【新品产上线啦】51CTO播客,随时随地,碎片化学习

1.5.1 ARM通用寄存器

ARM是一个三地址架构,意思是一个单指令可以涉及三个寄存器地址。例如,算术运算指令中的“add”可以指定两个寄存器,其中一个用于读取输入值,另一个用于存储所计算的和。在使用GCC汇编时,目标寄存器会列在第一位。

ARM中有16个用户可访问的整数寄存器,它们被命名为r0~r15。除了以下两种特殊情况外,完全用汇编语言编写的程序可以自由地使用任一寄存器,而不从硬件推导:

寄存器r14称为链接寄存器(也称为lr或LR),它的值是在执行一个“分支并链接”指令时由硬件更新。

寄存器r15称为程序计数器(也称为pc或PC),它的值是由硬件维护,常用于控制程序流程。

通常在编写一个汇编语言程序——尤其是在嵌入或调用C代码时,程序员在使用某些有特殊意义且被ARM过程调用标准(APCS)规定的寄存器时要格外小心。小心是必要的,因为这些寄存器可以由编译器生成的代码或其他程序员编写的代码随意改变。

这些寄存器的组成如下:

寄存器r0和r1用于函数返回值。与MIPS指令集不同,寄存器r0不是“固定”包含零值。

寄存器r0~r3(相对于参数寄存器,也可以称为a1~a4)常用于向函数传递参数。程序员可以自由地使用这些寄存器作为“暂存寄存器”,但应该知道它们的状态在不同函数调用中可能不会被保存。

寄存器r4~r11(相对于可变寄存器,也可以称为v1~v8)通常可以安全使用,除了一些不起眼的编译器用r9作为静态库寄存器(也称为sb、SB或v6),以及r10作为栈限制寄存器(也称为sl、SL或v7)。

GCC这类编译器用r11作为帧指针(也称为fp、FP或v8),指向当前激活帧的基址。激活帧包含诸如局部变量的本地子例程数据。

寄存器r13称为栈指针(也称为sp或SP),常用来指向激活栈的栈顶。

ARM允许存在一个灵活的第二操作数,这意味着算术运算指令允许第二操作数寄存器在被指令的主要操作使用之前被移位或旋转。例如下面的指令:

在将寄存器r3的内容加入寄存器r2的内容之前左移,并且:

在寄存器r3的内容加入寄存器r2的内容前算术右移其内容,右移的位数由寄存器r4的内容的低序字节指定。

有效的移位操作如下:

asr:算术右移,存储移出的最后一位进位标志(如果指令使用s后缀)。

lsl:逻辑左移,存储移出的最后一位进位标志(如果指令使用s后缀)。

lsr:逻辑右移,存储移出的最后一位进位标志(如果指令使用s后缀)。

ror:循环右移,将初始位n - 1放置到进位标志。

rrx:精确到一位的循环右移(此操作不接受一个偏移量),把寄存器作为由最低有效位充当进位标志的33位寄存器。

这些操作也有自己相应的指令,但是当使用这些指令时,灵活的第二操作数是不可用的。换言之,以下指令是不允许的:


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

SQL Server 2005中文版精粹

本书内容包括: ● 框架的总览:SQL Server 2005的功能是如何集成在一起的,以及这些功能对于用户的意义。 ● 安全性管理、策略...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊