Reset_Handler:
0x800225c: 0x4801 LDR.N R0, [PC, #0x4] ; SystemInit ①
//执行①时,pc=0x800225c 那么pc + 4 = 0x8002260;
//为什么执行完这句之后,r0中的值是:0x08002089,实际上是0x8002264处的值;
//这是内存:08002250:00 00 00 00 01 02 03 04 06 07 08 09 01 48 80 47
LDR.N的用法还有什么特殊之处吗?执行时需要pad一些字节吗?如果是,那么根据什么规则pad。
解疑释惑,[抱拳]!!
在ARM汇编中,LDR指令用于将内存中的数据加载到寄存器中,其中".N"是指LDR指令只能加载字(4个字节)或双字(8个字节),而不能加载半字(2个字节)或单字节(1个字节)。因此,在LDR指令中加入".N"可以确保每次加载的数据大小是4个字节,这也是该指令的一个特殊之处。
在上述代码中,LDR.N指令中的"[PC, #0x4]"表示从当前指令所在地址的下一个地址(也就是PC寄存器的值加上4)开始读取4个字节的数据。由于指令执行的过程中,PC寄存器的值已经更新为0x8002260,所以实际上LDR.N指令读取的是0x8002260处的4个字节数据,即0x08002089。
至于pad的问题,ARM汇编指令的长度是固定的,一般为2个字节或4个字节,因此如果指令长度不足4个字节,则需要使用nop(空操作)等指令来填充,以保证指令在内存中的地址是4的倍数。在上述代码中,由于LDR.N指令长度为4个字节,因此不需要进行pad操作。