您好,登錄后才能下訂單哦!
首先需要朱有鵬老師,這是在學(xué)習(xí)了朱老師的課程之后的一點理解,代碼是根據(jù)朱老師的源碼學(xué)習(xí)之后編寫的。
根據(jù)反匯編代碼 d0024010: e24f0018 sub r0, pc, #24 可以看出通過adr匯編偽指令將加載地址寫入r0寄存器,此時因為adr指令采用相對尋址的尋址方式所以adr實際寫入r0寄存器的地址為程序的加載地址而非反匯編代碼所指示的0xd0024000,通過ldr偽指令將所需重定位的地址寫入r1寄存器,此時r1所存的地址為0xd0024064,該地址的內(nèi)容為d0024000即為重定位的起始地址.由ldr偽指令將bss段的起始地址符號bss_start寫入r2寄存器,當(dāng)r0和r1相等時表示加載地址和重定位地址為同一地址,所以不會進行重定位的相關(guān)操作,而是跳轉(zhuǎn)到清理bss段為C代碼的運行建立環(huán)境:如果r0和r1不相等,就表示加載地址與實際運行地址不同,所以需要進行重定位以保證代碼在運行時不會出現(xiàn)錯誤。所謂的重定位就是將加載地址處的代碼拷貝一份到實際運行位置處,所以在.S代碼的copy_loop就是將代碼從加載地址處拷貝到實際運行處。在清理完bss為C代碼建立好運行環(huán)境后通過ldr pc, =led_flash ,ldr長跳轉(zhuǎn)到C代碼的流水燈程序中。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。