1 .align n
插入0到3个字节的0x00,,这样下一个位置将是4字节的整数倍。特别的,ARM微控制器总是按字(4字节)读取数据。
它的含义就是使得下面的代码按一定规 则对齐,.align n 指令的对齐值有两种方案,n 或 2^n ,各种平台最初的汇编器一般都不是gas,采取方案1或2的都很多,gas的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas中如何 解释 .align指令会显得有些混乱,原因在于保持兼容。
arm-linu是按照2^n的方案对齐的,需要说明的是这个对齐和ld-script里的对齐不同,不是一会事。下面的英文就不同平台的对齐进行了说明:
从这段文字来看,ARM的.align 5就是2的5次方对齐,也就是4字节对齐
2.
LDR R0,0x12345678 //把地址0x12345678存放的内容放到R0里面
MOV R0,#x //把立即数x放到R0里面,x必须是一个8 bits的数移到偶数次得到的数。
LDR R0,=0x12345678 //把立即数0x12345678放到R0里面
3.
(1)mov pc <跳转地址〉
这种向程序计数器PC直接写跳转地址,能在4GB连续空间内任意跳转。
(2)通过B BL BLX BX可以完成在当前指令向前或者向后32MB的地址空间的跳转(为什么是32MB呢?寄存器是32位的,此时的值是24位有符号数,所以32MB)。
B是最简单的跳转指令。要注意的是,跳转指令的实际值不是绝对地址,而是相对地址——是相对当前PC值的一个偏移量,它的值由汇编器计算得出。
BL非常常用。它在跳转之前会在寄存器LR(R14)中保存PC的当前内容。BL的经典用法如下:
bl NEXT ; 跳转到NEXT
……
NEXT
……
mov pc, lr ; 从子程序返回