嵌入式LAB 2:ARM指令

Posted tanxiaxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式LAB 2:ARM指令相关的知识,希望对你有一定的参考价值。

1、生成了 Thumb 指令还是 ARM 指令:如何通过编译参数改变,相同的程序ARM和Thumb编译的结果有何不同, 如指令本身和整体目标代码的大小等。

首先编写一个简单的C程序,这里我写了一个快排程序。如下图

编译选项为-marm时,生成arm指令,当编译选项为-mthumb时,生成thumb指令。无论-S生成汇编代码,-c生成目标代码,-o生成可执行代码,thumb指令下的空间都要比arm小,尽管不算是非常明显。

代码的差异:可以看到代码是有一定的不同的,比如左边有.thumb_func右边没有,右边的.LFB0也有很多多出的参数。

2、对于 ARM 指令,能否产生条件执行的指令

编译命令:
/Volumes/arm/ARMx-2009q3-67/bin/arm-none-linux-gnueabi-gcc -marm -S -O3 branch.c

3、设计 C 的代码场景,观察是否产生了寄存器移位寻址

在我读写的第一个快排程序编译成的汇编代码中,可以找到寄存器移位寻址。

4、设计 C 的代码场景,观察一个复杂的 32 位数是如何装载到寄存器的

汇编的结果:使用mvn指令直接将数字载入寄存器中,然后使用str指令存到变量对应的地址处。变量之间的赋值的时候,程序将先使用ldr取出源值载入到r3寄存器中,然后使用str指令将r3的值存到目标变量的地址处。

5、写一个 C 的多重函数调用的程序,观察和分析: a. 调用时的返回地址在哪里? b. 传入的参数在哪里? c. 本地变量的堆栈分配是如何做的? d. 寄存器是 caller 保存还是 callee 保存?是全体保存还是部分保存?


从上图中我们可以看出,第二行r0的值是x,证明参数一开始放在r0。然后第三行调用f。接下来返回值在r0,先把它放到r3,然后把r4(”%d/n”)放到第一参数,再把r3存回r0,调用printf。综上所述,返回值是放在r0的。返回地址是放在lr。


从这里我们可以看到,传入参数放在r0~r3,当然在这个程序中只有一个参数,所以只有r0。位置从fp-16开始。还是刚才的图,因为这里我们可以看到,r3是分配的本地变量,把它压到了栈里面去。位置是fp – 8。

r0~r3是由caller保存的。fp是由callee保存的。

6、MLA 是带累加的乘法,尝试要如何写 C 的表达式能编译得到 MLA 指令。

编译的时候一定要加-O3,否则无法得到MLA。

7、BIC是对某一个比特清零的指令,尝试要如何写 C 的表达式能编译得到 BIC 指令。

8、编写一个汇编函数,接受一个整数和一个指针做为输入,指针所指应为一个字符串,该汇编函数调用C语言的 printf()函数输出这个字符串的前n个字符,n即为那个整数。在C语言写的main()函数中调用并传递参数给这个汇编函数 来得到输出。

首先我自己写了一个程序

然后生成汇编代码,把关键的汇编代码抽取来,插入到.c文件里面。所以这个代码如下所示。

以上是关于嵌入式LAB 2:ARM指令的主要内容,如果未能解决你的问题,请参考以下文章

ARM汇编基础详解

嵌入式:ARM指令集分类及编码

嵌入式:ARM协处理器指令总结

004.ARM指令之LDR

嵌入式:ARM符号定义伪操作详解

基于ARM的嵌入式