跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
合金电阻捷比信 · 专业器件主题站

ARM加载时间。对运行时地址的理解

本文将介绍在加载手臂时在运行时对地址的理解。这种理解在某些过程中是有意义的,并且与某些材料中所述的情况是一致的。分散文件中的下载地址和运行时地址在编译和链接阶段中使用。例如,存在以下分散文件,以从程序集到c文件的跳转为例。 LOAD 0x0 {JMAIN +0 {jmain.o(jmain,+ first)} TEST 0x200 {test.o *(+ RO,+ RW,+ ZI)}} jmain.s只是一个跳转,b __main,main已定义在测试中c。 .void main(){}分散文件中LOAD的0x0表示下载地址。它表示整个项目文件中生成的所有.o文件都是从0x0开始编译的。一个接一个地排列(jmian.o从0x0开始,test.o紧随jmain.o之后),当然,中间可能会有一些处理,但是通常是这样。对于该示例,可以理解,生成的.bin文件从0x0,jmain.o和test.o等开始。他们之间没有差距。分散中的运行时地址(例如0x200)用于引导编译器编译指令,这种情况是:如果将0x200更改为0x100,则检查已编译的二进制代码,该指令为:0xea00003e,当它为0x200时,指令为0xea00007e。该地址用于生成指令的二进制代码。因此,我认为下载地址可以视为内存段的首地址。存储在该地址的指令是专门编译的。生成二进制代码时,需要干预运行时地址。在特定的操作期间(例如运行0xea00007e),CPU将跳转以在0x200处运行指令。这样,它与一般信息中提到的运行时和下载地址一致。但是仍然存在另一个问题,在上面的示例中,如果将.bin文件下载到板的0x0地址,则cpu从0x0开始将运行0xea00007e,但是此时,我们没有要运行的指令在0x200,例如main()。全部,在跳转到main()之前,需要执行一个复制过程。进行编译和链接时,链接器会将地址0x200保存到一个地址,并且在b __main之后,将从该地址中取出0x200,然后从下载地址中复制test.o和以下内容(在jmain.o之后,即通过循环将上述地址依次排序)到0x200的地址,并按顺序排列它们。复制后,跳至0x200,即正常运行0xea00007e。该复制过程可以由编译器完成,或者我们可以编写代码来实现它。返回广告中的ro base设置,即分散= root区域运行时地址中的下载地址。在广告中,设置robase = 0x10000,然后将生成的.bin下载到木板的ram中,例如mx 0x8000,g 0x8000,程序可以正常运行。这是因为.bin位于板上,它位于0x8000处。它从0x8000开始运行,因为CPU的PC始终以+4运行。跳转之前的指令不涉及绝对地址,相对地址,并且它们的二进制代码将不涉及这些内容。地址。因此它可以正常运行。当运行到b__main时,请使用广告自动生成的循环来完成复制。在副本中,涉及0x10000。正是此副本以及随后的b __rt_entry使程序能够正常运行。似乎在分散文件中,加载时间地址不是那么重要。因此,您对臂加载时的地址(运行时地址)有更深入的了解?