簡體   English   中英

ARMv7-M匯編:寄存器中未對齊的字節替換?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM