[英]ARMv7-M assembly: unaligned byte replacement in registers?
假設我們有三個目標寄存器r5,r6和r7,並認為它們是12個字節的數組:
r5={a, b, c, d} r6={e, f, g, h} r7={i, j, k, l}
我想做的是從給定的存儲位置讀取八個字節{0, 1, 2, 3, 4, 5, 6, 7}
,然后將它們復制到三個目標寄存器中,以得到
r5={a, 0, 1, 2} r6={3, 4, 5, 6} r7={7, j, k, l}
換句話說,我想用從ROM讀取的八個字節替換r5-r7中數組的字節1-8。
我可以通過六個指令來做到這一點:
ldrd r0, r1, [r3]
bfi r5, r0, #8, #24
ubfx r6, r0, #24, #8
bfi r6, r1, #8, #24
bfc r7, #0, #8
orr r7, r7, r1, lsr #24
可以用更少的時間完成嗎? 假設沒有浮點單元。
(背景:這是繪圖程序的一部分,從內存中讀取幾個像素圖案,並合成到一組寄存器中,然后使用stmia
將其寫入顯示緩沖區。)
我很猶豫地發布以下內容,因為它不能解決所提出的問題-它將輸出組裝在內存中而不是在寄存器中。
但是對於它的價值:
r5,r6,r7 - abcdefghijkl (as per the question)
r3 - input array ptr (as per the question)
r2 - output array ptr
r5 r6 r7 [r3] r0 r1 [r2]
abcd efgh ijkl 01234567
ldrd r0, r1, [r3] 0123 4567 ------------
str r5, [r2, #0] abcd--------
str r7, [r2, #8] abcd----ijkl
str.w r0, [r2, #1] a0123---ijkl
str.w r1, [r2, #5] a01234567jkl
注意:
str
指令是16位編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.