以下RISC-V彙編代碼(RV32)用於顯示問題。需要RISCV鏈接器來處理JAL偏移量
start: jal end
end: jal start
我調用使用以下簡單的命令彙編...
riscv32-unknown-elf-as -m32 example.s -o example.o
要檢查生成的代碼我拆開它...
riscv32-unknown-eft-objdump -D example.o
這給下面的輸出。 ..
00000000 <start>:
0: 004000ef jal 4 <end>
00000004 <end>
4: ffdff0ef jal 0 <start>
第一個'jal'已經正確表明它需要在PC上添加4才能跳到下一行,這是地址4.(注意:jal指令立即值的奇數佈局意味着實際值指令對2進行編碼,然後在CPU中乘以2得到4)的實際偏移量。第二個'jal'的偏移量爲-2。再次,在CPU乘以2的情況下,我們可以將-4作爲偏移量。
我實際上想要生成一個原始輸出文件,其中不包含ELF信息,並且僅由8個字節組成,這8個字節組成了兩條指令。我直接針對微控制器運行,並且該微控制器沒有運行操作系統。我希望輸出閃存到非易失性RAM,然後在復位時執行。
所以我用下面的鏈接器命令生成二進制輸出...
riscv32-unknown-elf-ld --oformat=binary example.o -o example
但這似乎是因爲使用下面的命令來看看生成的輸出字節已經失去了相對尋址值.. 。
xxd example
...給出以下結果......
00000000: ef00 0000 eff0 ffff
考慮到它是小尾數,這意味着每個四字節的集合與先前看到的反彙編相比是相反的順序。我們可以看到第一跳'000000ef'已經失去了跳躍偏移量。第二次跳轉'fffff0ef'也不同於之前和之後應用兩個讚美我們得到-1,這是絕對錯誤的!
任何想法如何跳轉偏移已被破壞?是否有一些額外的選項需要指定給鏈接器來正確處理偏移量?我找不到任何明顯的東西,並且作爲Linux和GNU的初學者,我被卡住了。